1、简介
相信大家在平时的CURD工作中也会接触到Nginx,可以说是万年的Nginx+Tomcat搭配。
代理服务器来接受客户端的网络访问连接请求,然后服务器将请求有策略的转发给网络中实际工作的业务服务器,并将从业务服务器处理的结果,返回给网络上发起连接请求的客户端。
2、Nginx安装
1、解压安装包
tar -xvzf nginx-1.18.0.tar.gz
2、进入解压目录,进行安装目录的配置
./configure --prefix=/usr/soft/nginx
安装过程中可能会出现缺少pcre、openssl等依赖的问题,此时需要用到yum去安装这些依赖,安装完依赖之后再次配置安装目录
yum install -y gcc pcre pcre-devel openssl openssl-devel gd gd-deve
3、编译安装
make && make install
4、启动Nginx
进入第二步配置的安装目录,-c 表示指定配置文件,也可以不带,默认使用conf下的文件
./sbin/nginx -c /usr/soft/nginx/conf/nginx.conf
启动之后就可以在浏览器上直接输入服务器ip访问。
5、关闭、重载配置
可用kill命令
kill -QUIT 进程号kil -TERM 进程号
也可用nginx的脚本
./sbin/nginx -s stop./sbin/nginx -s quit
重新加载配置文件:
./sbin/nginx -s reload
3、Nginx配置
主要包括三部分:Main、Event、Http
#Mainworker_processes 1; #需开启的进程数,也就是Nginx处理请求的进程#Event,设定工作模式以及连接数上限events { use epoll; #Nginx支持的工作模式有select、poll、kqueue、epoll、rtsig和/dev/poll。其中select和poll都是标准的工作模式,kqueue和epoll是高效的工作模式,不同的是epoll用在Linux平台上,而kqueue用在BSD系统中。对于Linux系统,epoll工作模式是首选。跟netty的是一样的 worker_connections 1024; #每个进程的最大连接数}#Httphttp { include mime.types;#主模块指令,实现对配置文件所包含的文件的设定,可以减少主配置文件的复杂度 default_type application/octet-stream;#如果没有include的类型,则采用默认类型 server { listen 80; #监听端口 server_name localhost; #主机名 location / { #匹配url root html; #转至html目录 index index.html index.htm; #目录下的文件 } error_page 500 502 503 504 /50x.html; #定制错误码返回页面 location = /50x.html { root html; } }}
http模块可以配置多个server。
(1)日志配置
日志配置有两个参数,分别是log_format和access_log。
log_format:用来配置日志格式
access_log:开启日志以及日志文件
例如:定义一个名为main的日志格式,然后开启日志,日志文件是logs/access.log
worker_processes 1;events { use epoll; worker_connections 1024;}http { include mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; server { listen 80; server_name localhost; access_log logs/access_80.log main; location / { root html; index lsy.html; } }}
出来的日志格式是这样的:
192.168.197.1 - - [01/Aug/2020:00:29:41 -0700] "GET / HTTP/1.1" 200 17 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36" "-"
注:access_log也可配置在server外面,这样就是配置了所有server的日志格式
编写完配置之后,可用如下命令检测配置是否正确:
./sbin/nginx -c /usr/soft/nginx/conf/nginx.conf -t
下面是一些nginx自带的变量:
|
(2)location配置
格式:
location [~|=|^~|~*] /uri {}
=:精准匹配,优先级最高
~:开头表示区分大小写的正则匹配
^~:开头表示uri以某个常规字符串开头,理解为匹配 url路径即可。nginx不对url做编码,因此请求为/static/20%/aa,可以被规则^~ /static/ /aa匹配到(注意是空格) 。以xx开头
~*:开头表示不区分大小写的正则匹配
!~和!~*分别为区分大小写不匹配及不区分大小写不匹配 的正则
(3)rewrite使用
Rewrite通过ngx_http_rewrite_module模块支持url重写、支持if判断,但不支持else
Rewrite功能就是,使用nginx提供的全局变量或自己设置的变量,结合正则表达式和标志位实现url重写以及重定向
Rewrite只能放在server{},location{},if{}中,并且只能对域名后边的除去传递的参数外的字符串起作用
常用指令
If 空格 (条件) {设定条件进行重写}条件的语法:
1.“=” 来判断相等,用于字符比较
2.“~” 用正则来匹配(表示区分大小写),“~*” 不区分大小写
3.“-f -d -e” 来判断是否为文件、目录、是否存在
return指令
语法:return code;
停止处理并返回指定状态码给客户端。
if ($request_uri ~ *\.sh ){ return 403;}
set指令
set variable value;
定义一个变量并复制,值可以是文本、变量或者文本变量混合体
rewrite指令
语法:rewrite regex replacement [flag]{last / break/ redirect 返回临时302/ permant 返回永久302}
last: 停止处理后续的rewrite指令集、 然后对当前重写的uri在rewrite指令集上重新查找
break; 停止处理后续的rewrite指令集 ,并不会重新查找
例如:将符合/images/([a-z]{3})/(.*).(png|jpg)正则的重写到/lsy路径下,其中$2是(.*),$3是.(png|jpg),try_files尝试在硬盘中寻找这个文件,如果有,则直接返回,如果没有,就转到/image404.html路径下。
location / { rewrite '^/images/([a-z]{3})/(.*)\.(png|jpg)$' /lsy?file=$2.$3; set $image_file $2; set $image_type $3;}location /lsy { root html/images; try_files /$arg_file /image404.html;}location /image404.html { return 404 "image not found exception";}
此时需要在html目录下建立images目录,我这边放进一张a.jpg图片
访问一张不存在的图片:
(4)浏览器本地缓存配置及动静分离
语法:expires 60s|m|h|d
操作步骤
· 在html目录下创建一个images文件,在该文件中放一张图片
· 修改index.html, 增加
·修改nginx.conf配置。配置两个location实现动静分离,并且在静态文件中增加expires的缓存期限
location / { root html; index index.html index.hml;}location ~ \.(jpg)$ { root html/images; expires 10s;}
效果:
初次加载:
过期时间内再次加载:
(5)Gzip压缩策略
浏览器请求 -> 告诉服务端当前浏览器可以支持压缩类型->服务端会把内容根据浏览器所支持的压缩策略去进行压缩返回->浏览器拿到数据以后解码;
常见的压缩方式:gzip、deflate 、sdch
配置项
Gzip on|off 是否开启gzip压缩Gzip_buffers 4 16k #设置系统获取几个单位的缓存用于存储gzip的压缩结果数据流。4 16k代表以16k为单位,安装原始数据大小以16k为单位的4倍申请内存。Gzip_comp_level[1-9] 压缩级别, 级别越高,压缩越小,但是会占用CPU资源Gzip_disable #正则匹配UA 表示什么样的浏览器不进行gzipGzip_min_length #开始压缩的最小长度(小于多少就不做压缩)Gzip_http_version 1.0|1.1 表示开始压缩的http协议版本Gzip_proxied (nginx 做前端代理时启用该选项,表示无论后端服务器的headers头返回什么信息,都无条件启用压缩)Gzip_type text/pliain,application/xml 对那些类型的文件做压缩 (conf/mime.conf)Gzip_vary on|off 是否传输gzip压缩标识
例如:
gzip on;gzip_buffers 4 16k;gzip_comp_level 7;gzip_min_length 500;gzip_types text/css application/javascript text/xml;
注意:
1. 图片、mp3这样的二进制文件,没必要做压缩处理,因为这类文件压缩比很小,压缩过程会耗费CPU资源
2. 太小的文件没必要压缩,因为压缩以后会增加一些头信息,反而导致文件变大
3. Nginx默认只对text/html进行压缩 ,如果要对html之外的内容进行压缩传输,我们需要手动来配置
(6)反向代理
proxy_pass
以下就是通过反向代理将请求转发到百度
location / { proxy_pass http://www.baidu.com; #proxy_set_header $Accept-Encoding gzip;}
也可以转发至私有服务接口中,其中proxy_set_header是设置请求头,可根据业务需要设置请求头。
(7)负载均衡
upstream是Nginx的HTTP Upstream模块,这个模块通过一个简单的调度算法来实现客户端IP到后端服务器的负载均衡。
Upstream常用参数介绍
server address [parameters]
其中关键字server必选。address也必选,可以是主机名、域名、ip或unix socket,也可以指定端口号。parameters是可选参数,可以是如下参数:
down | 表示当前server已停用 |
backup | 表示当前server是备用服务器,只有其它非backup后端服务器都挂掉了或者很忙才会分配到请求 |
weight | 表示当前server负载权重,权重越大被请求几率越大。默认是1 |
max_fails | 在fail_timeout时间内失败多少次,认为主机已挂掉则,踢出,默认是1 |
fail_timeout | 超时时间,默认是10s |
max_conns | 允许最大连接数 |
slow_start | 当节点恢复,不立即加入 |
负载均衡算法:
ip_hash | 对ip进行hash计算 |
url_hash | 对url进行hash计算 |
least_conn | 最少连接 |
least_time | 最小的响应时间,计算节点平均响应时间,然后取最快的,分配最高权重 |
例如:以ip_hash的负载均衡算法进行请求分配
http { upstream myserver{ ip_hash; server 192.168.197.100:80; server 192.168.197.110:80; } server { listen 80; server_name localhost; location / { proxy_pass http://myserver; } }}