Py学习  »  NGINX

Nginx安装、实现反向代理及深度优化(2)

看清所苡看轻 • 4 年前 • 275 次点击  

博文大纲:

一、Nginx的安装;
二、Nginx服务实现反向代理;
三、Nginx服务优化

一、Nginx的安装
关于Nginx的基本概念,在之前的博文中: 搭建Nginx服务器及其配置文件详解 有详细的介绍,这篇博文就直接从安装开始谈起。

环境准备:

三台centos 7.5,其中一台运行Nginx,另外两台运行简单的web服务即可,主要用来测试Nginx反向代理的效果;
下载 我提供的包,安装Nginx时需要,用来做缓存及压缩等优化项的。

注(实现效果如下):

结合 proxy 和 upstream 模块实现后端 web 负载均衡;
使用 proxy 模块实现静态文件缓存;
结合 nginx 默认自带的 ngx_http_proxy_module 模块 和 ngx_http_upstream_module 模块实现后端服务器的健康检查,也可以使用第三方模块 nginx_upstream_check_module;
使用 nginx-sticky-module 扩展模块实现 保持会话;
使用 ngx_cache_purge 实现更强大的缓存清除功能;
使用ngx_brotli模块实现网页文件压缩。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

上面提到的 2 个模块都属于第三方扩展模块,需要提前下好源码(我在前面的下载链接中包含着这几个模块),然后编译时通过–add-moudle=src_path 一起安装。

1、安装Nginx

[root@nginx nginx-1.14.0]# yum -y erase httpd     #卸载系统默认的httpd服务,防止端口冲突
[root@nginx nginx-1.14.0]# yum -y install openssl-devel pcre-devel    #安装所需依赖
[root@nginx]# cd /usr/src  #进入/usr/src下
[root@nginx src]# rz          #rz命令上传所需源码包
[root@nginx src]# ls          #确认上传的源码包
nginx-sticky-module.zip    ngx_brotli.tar.gz
nginx-1.14.0.tar.gz  ngx_cache_purge-2.3.tar.gz
#将上传的源码包进行解压
[root@nginx src]# tar zxf nginx-1.14.0.tar.gz  
[root@nginx src]# unzip nginx-sticky-module.zip 
[root@nginx src]# tar zxf ngx_brotli.tar.gz 
[root@nginx src]# tar zxf ngx_cache_purge-2.3.tar.gz 
[root@nginx src]# cd nginx-1.14.0/        #切换至nginx目录
[root@nginx nginx-1.14.0]#  ./configure --prefix=/usr/local/nginx1.14 --user=www --group=www --with-http_stub_status_module  --with-http_realip_module  --with-http_ssl_module --with-http_gzip_static_module  --http-client-body-temp-path=/var/tmp/nginx/client --http-proxy-temp-path=/var/tmp/nginx/proxy  --http-fastcgi-temp-path=/var/tmp/nginx/fcgi --with-pcre  --add-module=/usr/src/ngx_cache_purge-2.3  --with-http_flv_module --add-module=/usr/src/nginx-sticky-module && make && make install
#进行编译安装,并且使用“--add-module”选项加载需要的模块
#注意,以上并没有加载ngx_brotli模块,是为了稍后展示在已经安装nginx服务后,如何添加模块
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
关于上述的编译选项解释如下:

--with-http_stub_status_module:通过网页监控nginx的状态;
--with-http_realip_module:获取客户端的真实IP地址;
--with-http_ssl_module:开启nginx的加密传输功能;
--with-http_gzip_static_module:开启压缩功能;
--http-client-body-temp-path=/var/tmp/nginx/client:客户端访问数据临时存放路径(缓存存放的路径);
--http-proxy-temp-path=/var/tmp/nginx/proxy:同上;
--http-fastcgi-temp-path=/var/tmp/nginx/fcgi:同上;
--with-pcre:支持正则匹配表达式;
--add-module=/usr/src/ngx_cache_purge-2.3:添加nginx的第三方模块,语法为:--add-module=第三方模块路径;
--add-module=/usr/src/nginx-sticky-module:同上;
--with-http_flv_module:支持flv视频流。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

2、启动Nginx服务

[root@nginx nginx-1.14.0]# ln -s /usr/local/nginx1.14/sbin/nginx /usr/local/sbin/
#创建nginx命令的软连接,以便可以直接使用
[root@nginx nginx-1.14.0]# useradd -M -s /sbin/nologin www
[root@nginx nginx-1.14.0]# mkdir -p /var/tmp/nginx/client
[root@nginx nginx-1.14.0]# nginx -t      #检查nginx配置文件
nginx: the configuration file /usr/local/nginx1.14/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx1.14/conf/nginx.conf test is successful
[root@nginx nginx-1.14.0]# nginx       #启动nginx服务
[root@nginx nginx-1.14.0]# netstat -anpt | grep 80   #查看80端口是否在监听
tcp   0   0 0.0.0.0:80      0.0.0.0:*        LISTEN      7584/nginx: master  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

二、Nginx服务实现反向代理
1、正向代理
用于代理内部网络对 Internet 的连接请求(如 NAT),客户端指定代理服务器,并将本来要直接发送给目标Web服务器的HTTP请求先发送到代理服务器上, 然后由代理服务器去访问 Web 服务器, 并将 Web 服务器返回的信息的回传给客户端,此时,这个代理服务器就是正向代理。
例如:
A同学在大众创业、万众创新的大时代背景下开启他的创业之路,目前他遇到的最大的一个问题就是启动资金,于是他决定去找马云爸爸借钱,可想而知,最后碰一鼻子灰回来了,情急之下,他想到一个办法,找关系开后门,经过一番消息打探,原来A同学的大学老师王老师是马云的同学,于是A同学找到王老师,托王老师帮忙去马云那借500万过来,当然最后事成了。不过马云并不知道这钱是A同学借的,马云是借给王老师的,最后由王老师转交给A同学。这里的王老师在这个过程中扮演了一个非常关键的角色,就是代理,也可以说是正向代理,王老师代替A同学办这件事,这个过程中,真正借钱的人是谁,马云是不知道的,这点非常关键。我们常说的代理也就是只正向代理,正向代理的过程,它隐藏了真实的请求客户端,服务端不知道真实的客户端是谁,客户端请求的服务都被代理服务器代替来请求

2、反向代理
与正向代理相反,如果局域网向Internet提供资源,并让Internet上的其他用户可以访问局域网内资源, 也可以设置一个代理服务器, 它提供的服务就是反向代理. 反向代理服务器接受来自 Internet 的连接,然后将请求转发给内部网络上的服务器,并将 web服务器的返回信息回传给
Internet 上请求连接的客户端。
总而言之:正向代理的对象是客户端,代替客户端去访问web服务器;反向代理的对象是web服务器,代理web服务器去回应客户端。
例如:
大家都有过这样的经历,拨打10086 客服电话,一个地区的 10086 客服有几个或者几十个,你永远都不需要关心在电话那头的是哪一个,叫什么,男的,还是女的,漂亮的还是帅气的,你都不关心,你关心的是你的问题能不能得到专业的解答,你只需要拨通了10086 的总机号码,电话那头总会有人会回答你,只是有时慢有时快而已那么这里的 10086 总机号码就是我们说的反向代理。客户不知道真正提供服务的人是谁反向代理隐藏了真实的服务端,当我们访问 www.baidu.com 的时候,就像拨打 10086 一样,背后可能有成千上万台服务器为我们服务,但具体是哪一台,你不知道,也不需要知道,你只需要知道反向代理服务器是谁就好了,www.baidu.com 就是我们的反向代理服务器,反向代理服务器会帮我们把请求转发到提供真实计算的服务器那里去。Nginx 就是性能非常好的反向代理服务器,它可以用来做负载均衡。

3、Nginx配置反向代理
可以配置 nginx 作为反向代理和负载均衡,同时利用其缓存功能,将静态页面在 nginx 缓存,以达到降低后端服务器连接数的目的并检查后端 web 服务器的健康状况。
2、 Lvs/haproxy/nginx反向代理区别
Lvs优点: 工作在四层仅作分发的左右,抗负载能力强,承载并发量高
缺点: 自身布支持正则处理,不能做动静分离
Haproxy优点:haproxy可以同时工作在4层和7层,支持会话保持和cookie引导,支持url测试后端的服务器,专业的代理服务器
缺点: 处理数据相比nginx比较慢,消耗较多带宽
Nginx优点:
1、nginx工作在七层,可以针对http应用做一些分流的策略,比如针对域名、目录结构,他的正则比haproxy更加强大和灵活
2、nginx对网络的依赖非常小,理论上能ping同就能进行负载功能,这个也是他的优势所在
3、nginx的安装和配置比较简单,测试起来比较方便
4、可以承载搞得负载压力且稳定,一般能支撑超过几万次的并发量
5、nginx可以通过端口检测到服务器内部的故障
缺点:nignx 不支持url来检测后端服务器状态,nginx的session的保持,cookie的引导能力相对欠缺


环境如下:

一台Nginx服务器作为反向代理;
两台后端web服务器组成web服务器池;
客户端访问Nginx代理服务器,可以多次刷新页面,得到不同后端web服务器返回的页面。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

在这里插入图片描述
开始配置Nginx服务器:




    
[root@nginx ~]# cd /usr/local/nginx1.14/conf/      #切换至指定目录
[root@nginx conf]# vim nginx.conf           #编辑主配置文件
             ........................#省略部分内容
http{
             ........................#省略部分内容
upstream backend {
        sticky;
        server 192.168.20.2:80 weight=1 max_fails=2 fail_timeout=10s;
        server 192.168.20.3:80 weight=1 max_fails=2 fail_timeout=10s;
    }
            ........................#省略部分内容
server {
location / {
            #root   html;                            #将原本的根目录注释掉 
            #index  index.html index.htm;        #注释掉改行
            proxy_pass http://backend;     #这里指定的“backend”须与上面的web池名称对应。
        }
   }
}
#编辑完成后,保存退出即可。
[root@nginx conf]# nginx -t            #检查配置文件,确认无误
[root@nginx conf]# nginx -s reload        #重启nginx服务,以便生效
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

上述web服务器池的配置中有一个“sticky”的配置项,其实就是加载了nginx-sticky模块,这个模块的作用是通过 cookie 黏贴的方式将来自同一个客户端(浏览器)的请求发送到同一个后端服务器上处理,这样一定程度上可以解决多个 backend servers 的会话同步的问题(所谓会话同步,就好比访问页面时,登录一次即可,在一定时间段内无需再次登录,这就是会话的概念),而 RR 轮询模式必须要运维人员自己考虑 session 同步的实现。另外内置的 ip_hash 也可以实现根据客户端 IP 来分发请求,但它很容易造成负载不均衡的情况,而如果 nginx 前面有来自同一局域网的访问,它接收的客户端 IP 是一样的,容易造成负载不均衡现象。nginx-sticky-module 的 cookie 过期时间,默认浏览器关闭就过期。
这个模块并不合适不支持 Cookie 或手动禁用了 cookie 的浏览器,此时默认 sticky 就会切换成 RR。它不能与 ip_hash 同时使用。

sticky只是Nginx支持的其中一种调度算法,下面是Nginx的负载均衡模块支持的其他调度算法:

轮询(默认,RR):每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某台服务器宕机,故障系统被自动剔除,使用户访问不受影响。Weight 指定轮询权值,Weight 值越大,分配到的访问机率越高,主要用于后端每个服务器性能不均的情况下。
ip_hash : 每个请求按访问 IP 的 hash 结果分配,这样来自同一个 IP 的访客固定访问一个后端服务器,有效解决了动态网页存在的 session 共享问题。当然如果这个节点不可用了,会发到下个节点,而此时没有 session 同步的话就注销掉了。
least_conn :请求被发送到当前活跃连接最少的 realserver 上。会考虑 weight 的值。
url_hash : 此方法按访问 url 的 hash 结果来分配请求,使每个 url 定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率。Nginx 本身是不支持 url_hash 的,如果需要使用这种调度算法,必须安装 Nginx 的 hash 软件包 nginx_upstream_hash 。
fair :这是比上面两个更加智能的负载均衡算法。此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。Nginx 本身是不支持 fair 的,如果需要使用这种调度算法,必须下载 Nginx的upstream_fair 模块。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

关于上述配置文件中web池中web服务器IP地址后面的配置解释:

weight : 轮询权值也是可以用在 ip_hash 的,默认值为 1;
max_fails : 允许请求失败的次数,默认为 1。当超过最大次数时,返回 proxy_next_upstream模块定义的错误。
fail_timeout : 有两层含义,一是在 10s 时间内最多容许2次失败;二是在经历了2次失败以后,10s 时间内不分配请求到这台服务器。
  • 1
  • 2
  • 3

web服务器池中的服务器配置如下(仅供参考,这里为了测试,只是简便的搭建了一下httpd服务):安装httpd服务时找不到httpd镜像用yum clean all 清除一下缓冲就可以了

[root@web01 ~]# yum -y install httpd            #安装httpd服务
[root@web01 ~]# echo "192.168.20.2" > /var/www/html/index.html  #两台web服务器准备不同的网页文件
[root@web01 ~]# systemctl start httpd      #启动web服务
  • 1
  • 2
  • 3

第二台web服务器进行以上相同的操作即可,只是注意要准备不同的网页文件,以便测试负载均衡的效果。

现在就可以进行客户端访问验证了,但是需要注意的是,nginx代理服务器必须可以和两台wbe服务器进行通信。

在nginx代理服务器上访问自己本身测试(可以看到是在对web服务器池中的web服务器进行轮询):
在这里插入图片描述
若使用Windows客户端进行访问测试,由于配置文件中有“sticky”配置,所以会将每次的刷新请求还是转交给同一台web服务器,并无法测试出负载均衡的效果,只需将“sticky”那行注释掉,即可测试出负载均衡的效果。

三、Nginx服务优化
所谓优化,除了控制其工作线程以外,还有几个更重要的概念,也就是缓存及网页压缩,由于其涉及的配置项比较多,我将把完整的http{ }字段的配置文件写到下面,并注释,在博文的末尾会附上一个没有注释的http{ }字段。

在优化之前,我好像在编译安装Nginx时,故意漏掉一个模块没有加载,就是为了展示如果没有加载所需的模块,怎么进行加载?

配置如下:

[root@nginx conf]# cd /usr/src/nginx-1.14.0/     #切换至Nginx源码包
[root@nginx nginx-1.14.0]# nginx -V    #执行“ Nginx -V ”,查看已加载的模块
nginx version: nginx/1.14.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-11) (GCC) 
built with OpenSSL 1.0.2k-fips  26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx1.14 --user=www --group=www --with-http_stub_status_module --with-http_realip_module --with-http_ssl_module --with-http_gzip_static_module --http-client-body-temp-path=/var/tmp/nginx/client --http-proxy-temp-path=/var/tmp/nginx/proxy --http-fastcgi-temp-path=/var/tmp/nginx/fcgi --with-pcre --add-module=/usr/src/ngx_cache_purge-2.3 --with-http_flv_module --add-module=/usr/src/nginx-sticky-module
[root@nginx nginx-1.14.0]# ./configure --prefix=/usr/local/nginx1.14 --user=www --group=www --with-http_stub_status_module --with-http_realip_module --with-http_ssl_module --with-http_gzip_static_module --http-client-body-temp-path=/var/tmp/nginx/client --http-proxy-temp-path=/var/tmp/nginx/proxy --http-fastcgi-temp-path=/var/tmp/nginx/fcgi --with-pcre --add-module=/usr/src/ngx_cache_purge-2.3 --with-http_flv_module --add-module=/usr/src/nginx-sticky-module --add-module=/usr/src/ngx_brotli && make
#将上述查到的已加载的模块复制以下,重新编译以下,同时,加上需要添加的模块
#如我在上面添加了第三方模块“--add-module=/usr/src/ngx_brotli”
[root@nginx nginx-1.14.0]# mv /usr/local/nginx1.14/sbin/nginx /usr/local/nginx1.14/sbin/nginx.bak
#将原本的Nginx控制文件更改名字,备份一下
[root@nginx nginx-1.14.0]# cp objs/nginx /usr/local/nginx1.14/sbin/    
#将新生成的Nginx命令移动到相应的目录下
[root@nginx nginx-1.14.0]# ln -sf /usr/local/nginx1.14/sbin/nginx /usr/local/sbin/  
#对新的nginx命令做软连接
[root@nginx ~]# nginx -s reload                  #nginx重启一下服务
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

至此,新的模块就添加完成了。

1、Nginx的proxy缓存使用
缓存也就是将 js、css、image 等静态文件从后端服务器缓存到 nginx 指定的缓存目录下,既可以减轻后端服务器负担,也可以加快访问速度,但这样缓存及时清理成为了一个问题,所以需要 ngx_cache_purge 这个模块来在过期时间未到之前,手动清理缓存。

proxy 模块中常用的指令时 proxy_pass 和 proxy_cache。
nginx 的 web 缓存功能的主要是由 proxy_cache、fastcgi_cache 指令集和相关指令集完成,proxy_cache 指令负责反向代理缓存后端服务器的静态内容,fastcgi_cache 主要用来处理FastCGI 动态进程缓存(生产环境中不建议对动态页面进行缓存)。




    
http {
 include       mime.types;
    default_type  application/octet-stream;
    upstream backend {
        sticky;
        server 192.168.20.2:80 weight=1 max_fails=2 fail_timeout=10s;
        server 192.168.20.3:80 weight=1 max_fails=2 fail_timeout=10s;
    }
   log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"'     #注意删除这行后面的分号。
                        '"$upstream_cache_status"';    #增加这一行,记录缓存的命中率到日志中
    access_log  logs/access.log  main;

        #增加以下几行配置
    proxy_buffering on;   #代理的时候,开启缓冲后端服务器的响应
    proxy_temp_path /usr/local/nginx1.14/proxy_temp;
    proxy_cache_path /usr/local/nginx1.14/proxy_cache levels=1:2 keys_zone=my-cache:100m inactive=600m max_size=2g;
# server字段配置如下:
server {
        listen       80;
        server_name  localhost;
        #charset koi8-r;
        #access_log  logs/host.access.log  main;
        location ~/purge(/.*) {    #这个purge字段用来实现手动清除缓存
        allow 127.0.0.1;
        allow 192.168.20.0/24;
        deny all;
        proxy_cache_purge my-cache $host$1$is_args$args;
        }
        location / {
            proxy_pass http://backend;
    #这个“/ ”字段中添加以下配置,以便配置缓存相关的
            proxy_redirect off;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
            proxy_cache my-cache;
            add_header Nginx-Cache $upstream_cache_status;
            proxy_cache_valid 200 304 301 302 8h;
            proxy_cache_valid 404 1m;
            proxy_cache_valid any 1d;
            proxy_cache_key $host$uri$is_args$args;
            expires 30d;
        }
}
#编辑完成后,保存退出即可
[root@nginx conf]# nginx -t        #检查配置文件
nginx: the configuration file /usr/local/nginx1.14/conf/nginx.conf syntax 
nginx: [emerg] mkdir() "/usr/local/nginx1.10/proxy_temp" failed (2: No suc
nginx: configuration file /usr/local/nginx1.14/conf/nginx.conf test failed
#提示相应的目录没有找到
[root@nginx conf]# mkdir -p /usr/local/nginx1.10/proxy_temp    #那就创建相应的目录咯
[root@nginx conf]# nginx -t      #再次检查,OK了
nginx: the configuration file /usr/local/nginx1.14/conf/nginx.conf syntax  is ok
nginx: configuration file /usr/local/nginx1.14/conf/nginx.conf test is successful
[root@nginx conf]# nginx -s reload         #重启Nginx服务
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58

客户端访问测试(使用的是谷歌浏览器,访问前按F12):
在这里插入图片描述
按“F5”刷新一下:
在这里插入图片描述
MISS 表示未命中,请求被传送到后端;HIT 缓存命中(因为第一次访问,Nginx服务器并没有相应网页的缓存,所以会传送到后端web,第二次刷新时,Nginx本地就有缓存了,所以是“HIT”,缓存命中)。
查看Nginx的访问日志,也可以查看到记录的缓存相关信息:

[root@nginx conf]# tail ../logs/access.log      #查看访问日志
  • 1

在这里插入图片描述
客户端访问以下地址(客户端必须在 location ~/purge(/.*)允许的网段内),可以在缓存失效前,手动清除Nginx服务器上的缓存(若没有成功,先手动清除一下客户端浏览器的缓存):
如果访问时指定的URL是“192.168.20.5/index.html”,那么在清除缓存时,需要指定的URL就是“192.168.20.5/purge/index.html”,若访问时指定的URL是“192.168.20.5”,那么在手动清除缓存时,需要指定的URL是“ 192.168.20.5/purge/ ”
在这里插入图片描述

以上部分配置的相关解释如下:

proxy_buffering [ on | off ]; 代理的时候,开启或关闭缓冲后端服务器的响应,当开启缓冲时,nginx 尽可能快地从被代理的服务器接收响应,再将它存入缓冲区中。
proxy_temp_path : 缓存临时目录。后端的响应并不直接返回客户端,而是先写到一个临时文件中,然后被 rename 一下当做缓存放在 proxy_cache_path 。0.8.9 版本以后允许 temp和 cache 两个目录在不同文件系统上(分区),然而为了减少性能损失还是建议把它们设成一个文件系统上。
proxy_cache_path: 设置缓存目录,目录里的文件名是 cache_key 的 MD5 值。
levels=1:2 keys_zone=my-cache:50m 表示采用 2 级目录结构,第一层目录只有一个字符,是由levels=1:2设置,总共二层目录,子目录名字由二个字符组成。Web缓存区名称为my-cache,内存缓存空间大小为 100MB,这个缓冲 zone 可以被多次使用。文件系统上看到的缓存文件名类似于 /usr/local/nginx1.10/proxy_cache/c/29/b7f54b2df7773722d382f4809d65029c 。
inactive=600 max_size=2g 表示 600 分钟没有被访问的内容自动清除,硬盘最大缓存空间为2GB,超过这个值将清除最近最少使用的数据。
proxy_cache : 引用前面定义的缓存区 my-cache。
proxy_cache_key :定义如何生成缓存的键,设置 web 缓存的 key 值,nginx 根据 key 值 md5哈希存储缓存。
proxy_cache_valid : 为不同的响应状态码设置不同的缓存时间,比如 200、302 等正常结果可以缓存的时间长点,而 404、500 等缓存时间设置短一些,这个时间到了文件就会过期,而不论是否刚被访问过。
add_header 指令来设置 response header, 语法: add_header name value。
$upstream_cache_status 这个变量来显示缓存的状态,我们可以在配置中添加一个 http 头来显示这一状态。
########### $upstream_cache_status 包含以下几种状态:############
MISS 未命中,请求被传送到后端;
HIT 缓存命中;
EXPIRED 缓存已经过期请求被传送到后端;
UPDATING 正在更新缓存,将使用旧的应答;
STALE 后端将得到过期的应答;
expires : 在响应头里设置 Expires:或 Cache-Control:max-age,返回给客户端的浏览器缓存失效时间。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

参考如下:
在这里插入图片描述
在这里插入图片描述
2、优化Nginx服务的压缩功能
更改配置文件如下(相关解释请参考博文末尾):




    
http {
    include       mime.types;
    default_type  application/octet-stream;
    brotli on;
    brotli_types text/plain text/css text/xml application/xml application/json;
    brotli_static off;       #是否允许查找预处理好的、以 .br结尾的压缩文件,可选值为on、off、always。
    brotli_comp_level 11;        #压缩的级别,范围是“1~14”,值越大,压缩比越高
    brotli_buffers 16 8k;      #读取缓冲区数量和大小
    brotli_window 512k;       #滑动窗口大小
    brotli_min_length 20;    #指定压缩数据的最小字节
    gzip  on;        #开启 gzip 压缩输出,减少网络传输。
    gzip_comp_level 6;     # gzip 压缩比,1 压缩比最小处理速度最快,9 压缩比最大但处理速度最慢(传输快但比较消耗 cpu)。
    gzip_http_version 1.1;    #用于识别 http 协议的版本,早期的浏览器不支持 Gzip 压缩,用户就会看到乱码,所以为了支持前期版本加上了这个选项,如果你用了 Nginx 的反向代理并期望也启用 Gzip 压缩的话,由于末端通信是 http/1.1协议,故请设置为 1.1。
    gzip_proxied any;     #Nginx 作为反向代理的时候启用,根据某些请求和应答来决定是否在对代理请求的应答启用 gzip 压缩,是否压缩取决于请求头中的“Via”字段,指令中可以同时指定多个不同的参数,意义如下:
# off – 关闭所有的代理结果数据的压缩
# expired – 启用压缩,如果 header 头中包含 “Expires” 头信息
# no-cache – 启用压缩,如果 header 头中包含 “Cache-# Control:no-cache” 头信息
# no-store – 启用压缩,如果 header 头中包含 “Cache-Control:no-store” 头信息
# private – 启用压缩,如果 header 头中包含 “Cache-Control:private” 头信息
# no_last_modified – 启用压缩,如果 header 头中不包含 “Last-Modified” 头信息
# no_etag – 启用压缩 ,如果 header 头中不包含 “ETag” 头信息
# auth – 启用压缩 , 如果 header 头中包含 “Authorization” 头信息
# any – 无条件启用压缩
    gzip_min_length 1k;
    gzip_buffers 16 8k;
    gzip_types text/plain text/css text/javascript application/json application/javascript application/x-javascript application/xml;
    gzip_vary on;      #和 http 头有关系,加个 vary 头,给代理服务器用的,有的浏览器支持压缩,有的不支持,所以避免浪费不支持的也压缩,所以根据客户端的 HTTP 头来判断,是否需要压缩
    client_max_body_size 10m;     #允许客户端请求的最大单文件字节数。如果有上传较大文件,请设置它的限制值
    client_body_buffer_size 128k;    #缓冲区代理缓冲用户端请求的最大字节数
        server_tokens off;     #隐藏 nginx 的版本号
        #以下是http_proxy模块:
    proxy_connect_timeout 75;      #nginx 跟后端服务器连接超时时间(代理连接超时)
    proxy_send_timeout 75;
    proxy_read_timeout 75;    #定义从后端服务器读取响应的超时。此超时是指相邻两次读操作之间的最长时间间隔,而不是整个响应传输完成的最长时间。如果后端服务器在超时时间段内没有传输任何数据,连接将被关闭。
    proxy_buffer_size 4k;    #设置缓冲区的大小为 size。nginx 从被代理的服务器读取响应时,使用该缓冲区保存响应的开始部分。这部分通常包含着一个小小的响应头。该缓冲区大小默认等于 proxy_buffers 指令设置的一块缓冲区的大小,但它也可以被设置得更小。
    proxy_buffers 4 32k;     #语法: proxy_buffers the_number is_size;为每个连接设置缓冲区的数量为 number,每块缓冲区的大小为 size。这些缓冲区用于保存从被代理的服务器读取的响应。每块缓冲区默认等于一个内存页的大小。这个值是 4K 还是8K,取决于平台。
#附:[root@nginx ~]# getconf PAGESIZE     #查看Linux内存页的大小
#4096

    proxy_busy_buffers_size 64k;    #高负荷下缓冲大小(默认大小是 proxy_buffers 指令设置单块缓冲大小的 2 倍)
    proxy_temp_file_write_size 64k;    #当缓存被代理的服务器响应到临时文件时,这个选项限制每次写临时文件的大小。
    proxy_buffering on;
    proxy_temp_path /usr/local/nginx1.14/proxy_temp;
    proxy_cache_path /usr/local/nginx1.14/proxy_cache levels=1:2 keys_zone=my-cache:100m inactive=600m max_size=2g;
    upstream backend {
       sticky;
        server 192.168.20.2:80 weight=1 max_fails=2 fail_timeout=10s;
        server 192.168.20.3:80 weight=1 max_fails=2 fail_timeout=10s;
    }

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"'
                      '"$upstream_cache_status"';
    access_log  logs/access.log  main;
    sendfile        on;     #开启高效文件传输模式。
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;        #长连接超时时间,单位是秒,长连接请求大量小文件的时候,可以减少重建连接的开销,如果设置时间过长,用户又多,长时间保持连接会占用大量资源。
    server {
        listen       80;
        server_name  localhost;
        #charset koi8-r;
        #access_log  logs/host.access.log  main;
        location ~/purge(/.*) {
        allow 127.0.0.1;
        allow 192.168.20.0/24;
        deny all;
        proxy_cache_purge my-cache $host$1$is_args$args;
        }
        location / {
            proxy_pass http://backend;    #请求转向 backend 定义的服务器列表,即反向代理,对应 upstream 负载均衡器。也可以proxy_pass http://ip:port。
            proxy_redirect off;     #指定是否修改被代理服务器返回的响应头中的 location 头域跟 refresh 头域数值
#例如:
# 设置后端服务器“Location”响应头和“Refresh”响应头的替换文本。 假设后端服务器返回的
# 响应头是 “Location: http://localhost:8000/two/some/uri/”,那么指令proxy_redirect  
# http://localhost:8000/two/ http://frontend/one/;将把字符串改写为 “Location: 
# http://frontend/one/some/uri/”。
            proxy_set_header Host $host;  #允许重新定义或者添加发往后端服务器的请求头。
#Host 的含义是表明请求的主机名,nginx 反向代理服务器会向后端真实服务器发送请求,
#并且请求头中的host字段重写为proxy_pass指令设置的服务器。因为nginx作为反向代理使
#用,而如果后端真实的服务器设置有类似防盗链或者根据 http 请求头中的 host 字段来进行
#路由或判断功能的话,如果反向代理层的nginx不重写请求头中的host字段,将会导致请求失败。
            proxy_set_header X-Real-IP $remote_addr;        
#web 服务器端获得用户的真实 ip 但是,实际上要获得用户的真实 ip,也可以通过下面的X-Forward-For
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#后端的 Web服务器可以通过 X-Forwarded-For 获取用户真实 IP,X_Forward_For 字段
#表示该条 http 请求是有谁发起的?如果反向代理服务器不重写该请求头的话,那么后端
#真实服务器在处理时会认为所有的请求都来自反向代理服务器,如果后端有防护策略
#的话,那么机器就被封掉了。因此,在配置用作反向代理的 nginx 中一般会增加两条配置,以便修改 http 的请求头部
          #以下两条是修改 http 的请求头部:
            proxy_set_header Host $host;
                        proxy_set_header X-Forward-For $remote_addr;
            proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
#增加故障转移,如果后端的服务器返回 502、504、执行超时等错误,
#自动将请求转发到upstream 负载均衡池中的另一台服务器,实现故障转移。
            proxy_cache my-cache;
            add_header Nginx-Cache $upstream_cache_status;
            proxy_cache_valid 200 304 301 302 8h;
            proxy_cache_valid 404 1m;
            proxy_cache_valid any 1d;
            proxy_cache_key $host$uri$is_args$args;
            expires 30d;
                }
   location /nginx_status {        
                stub_status on;
                access_log off;
                allow 192.168.31.0/24;
                deny all;
            }
          ....................#省略部分内容
}
#更改完成后保存退出即可
[root@nginx nginx1.14]# nginx -t     #检查配置文件
nginx: the configuration file /usr/local/nginx1.14/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx1.14/conf/nginx.conf test is successful
[root@nginx nginx1.14]# nginx -s reload        #重启Nginx服务
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118

验证:

1、访问以下地址,可以查看Nginx服务器的状态统计页:
在这里插入图片描述
2、查看GZIP功能是否开启:
在这里插入图片描述
3、测试br压缩功能是否开启(需要使用命令行的方式访问):
在这里插入图片描述

[root@localhost nginx1.14]# curl -I -H "Accept-Encoding:gzip,deflate,br" 127.0.0.1
  • 1

附加:http{ }字段、server{ }字段无注释的配置文件如下:

http {
    include       mime.types;
    default_type  application/octet-stream;
 **#br压缩**
    brotli on;
    brotli_types text/plain text/css text/xml application/xml application/json;
    brotli_static off;
    brotli_comp_level 11;
    brotli_buffers 16 8k;
    brotli_window 512k;
    brotli_min_length 20;
  **#gzip压缩**
    gzip  on;
    gzip_comp_level 6;
    gzip_http_version 1.1;
    gzip_proxied any;
    gzip_min_length 1k;
    gzip_buffers 16 8k;
    gzip_types text/plain text/css text/javascript application/json application/javascript application/x-javascript application/xml;
    gzip_vary on;
    client_max_body_size 10m;
    client_body_buffer_size 128k;
    server_tokens off;
    proxy_connect_timeout 75;
    proxy_send_timeout 75;
    proxy_read_timeout 75;
    proxy_buffer_size 4k;
    proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
    proxy_temp_file_write_size 64k;
    proxy_buffering on; 
    proxy_temp_path /usr/local/nginx1.14/proxy_temp;
    proxy_cache_path /usr/local/nginx1.14/proxy_cache levels=1:2 keys_zone=my-cache:100m inactive=600m max_size=2g;
    upstream backend {
       sticky;
        server 192.168.20.2:80 weight=1 max_fails=2 fail_timeout=10s;
        server 192.168.20.3:80 weight=1 max_fails=2 fail_timeout=10s;
    }   

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"'
                      '"$upstream_cache_status"';
    access_log  logs/access.log  main;
    sendfile        on; 
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65; 

    #gzip  on;
   server {
        listen       80;
        server_name  localhost;
        #charset koi8-r;
        #access_log  logs/host.access.log  main;
        location ~/purge(/.*) {
        allow 127.0.0.1;
        allow 192.168.20.0/24;
        deny all;
        proxy_cache_purge my-cache $host$1$is_args$args;
        }
        location / {
            proxy_pass http://backend;
            proxy_redirect off;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
            proxy_cache my-cache;
            add_header Nginx-Cache $upstream_cache_status;
            proxy_cache_valid 200 304 301 302 8h;
            proxy_cache_valid 404 1m;
            proxy_cache_valid any 1d;
            proxy_cache_key $host$uri$is_args$args;
            expires 30d;
        }
**#测试gzip时在server模块中加入下面几行(用于测试)
            location /nginx_status {
                stub_status on;
                access_log off;
                allow 192.168.20.0/24;
                deny all;
            }**

        location = /50x.html {
            root   html;
        }
     }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/52233
 
275 次点击