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访问。

nginx nat转换 nginx转发netty_客户端

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自带的变量:

$args      #这个变量等于请求行中的参数。
$content_length           #请求头中的Content-length字段。
$content_type           #请求头中的Content-Type字段。
$document_root           #当前请求在root指令中指定的值。
$host           #请求主机头字段,否则为服务器名称。
$http_user_agent           #客户端agent信息。
$http_cookie           #客户端cookie信。
$limit_rate           #这个变量可以限制连接速率。
$request_body_file           #客户端请求主体信息的临时文件名。
$request_method           #客户端请求的动作,通常为GET或POST。
$remote_addr           #客户端的IP地址。
$remote_port           #客户端的端口。
$remote_user           #已经经过Auth Basic Module验证的用户名。
$request_filename           #当前请求的文件路径,由root或alias指令与URI请求生成。
$query_string           #与$args相同。
$scheme           #HTTP方法(如http,https)。
$server_protocol                #请求使用的协议,通常是HTTP/1.0或HTTP/1.1。
$server_addr                #服务器地址,在完成一次系统调用后可以确定这个值。
$server_name                #服务器名称。
$server_port                #请求到达服务器的端口号。
$request_uri                #包含请求参数的原始URI,不包含主机名,如:”/foo/bar.php?arg=baz”。
$uri                #不带请求参数的当前URI,$uri不包含主机名,如”/foo/bar.html”。
$document_uri                #与$uri相同。

(2)location配置

格式:

location [~|=|^~|~*] /uri {}

=:精准匹配,优先级最高

~:开头表示区分大小写的正则匹配

^~:开头表示uri以某个常规字符串开头,理解为匹配 url路径即可。nginx不对url做编码,因此请求为/static/20%/aa,可以被规则^~ /static/ /aa匹配到(注意是空格) 。以xx开头

~*:开头表示不区分大小写的正则匹配

!~!~*分别为区分大小写不匹配及不区分大小写不匹配 的正则

nginx nat转换 nginx转发netty_nginx nat转换_02

(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图片

nginx nat转换 nginx转发netty_netty 代理https_03

访问一张不存在的图片:

nginx nat转换 nginx转发netty_nginx_04

(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;}

效果:

初次加载:

nginx nat转换 nginx转发netty_netty 代理https_05

过期时间内再次加载:

nginx nat转换 nginx转发netty_nginx_06

(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;        }    }}