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模块实现网页文件压缩。

上面提到的 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 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服务后,如何添加模块

关于上述的编译选项解释如下:

--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视频流。

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 

二、Nginx服务实现反向代理

在实现这个反向代理之前,这里还是要说一下,什么是反向代理?什么是正向代理?

1、正向代理

用于代理内部网络对 Internet 的连接请求(如 NAT),客户端指定代理服务器,并将本来要直接发送给目标Web服务器的HTTP请求先发送到代理服务器上, 然后由代理服务器去访问 Web 服务器, 并将 Web 服务器返回的信息的回传给客户端,此时,这个代理服务器就是正向代理。

2、反向代理

与正向代理相反,如果局域网向Internet提供资源,并让Internet上的其他用户可以访问局域网内资源, 也可以设置一个代理服务器, 它提供的服务就是反向代理. 反向代理服务器接受来自 Internet 的连接,然后将请求转发给内部网络上的服务器,并将 web服务器的返回信息回传给
Internet 上请求连接的客户端。

总而言之:正向代理的对象是客户端,代替客户端去访问web服务器;反向代理的对象是web服务器,代理web服务器去回应客户端。

3、Nginx配置反向代理

可以配置 nginx 作为反向代理和负载均衡,同时利用其缓存功能,将静态页面在 nginx 缓存,以达到降低后端服务器连接数的目的并检查后端 web 服务器的健康状况。

环境如下:

  • 一台Nginx服务器作为反向代理;
  • 两台后端web服务器组成web服务器池;
  • 客户端访问Nginx代理服务器,可以多次刷新页面,得到不同后端web服务器返回的页面。
开始配置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服务,以便生效

上述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 模块。

——————————————————————————————————

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

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

web服务器池中的服务器配置如下(仅供参考,这里为了测试,只是简便的搭建了一下httpd服务):

[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服务

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

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

在nginx代理服务器上访问自己本身测试(可以看到是在对web服务器池中的web服务器进行轮询):

Nginx服务实现反向代理

若使用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、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服务

客户端访问测试(使用的是谷歌浏览器,访问前按F12):
Nginx服务实现反向代理

按“F5”刷新一下:
Nginx服务实现反向代理

MISS 表示未命中,请求被传送到后端;HIT 缓存命中(因为第一次访问,Nginx服务器并没有相应网页的缓存,所以会传送到后端web,第二次刷新时,Nginx本地就有缓存了,所以是“HIT”,缓存命中)。

查看Nginx的访问日志,也可以查看到记录的缓存相关信息:

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

Nginx服务实现反向代理

客户端访问以下地址(客户端必须在 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/ ”
Nginx服务实现反向代理

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

  • 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,返回给客户端的浏览器缓存失效时间。

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、访问以下地址,可以查看Nginx服务器的状态统计页:
Nginx服务实现反向代理

2、查看GZIP功能是否开启:
Nginx服务实现反向代理

3、测试br压缩功能是否开启(需要使用命令行的方式访问):

Nginx服务实现反向代理

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

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;
   brotli_comp_level 11;
   brotli_buffers 16 8k;
   brotli_window 512k;
   brotli_min_length 20;
   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;
     }
       location /nginx_status {
         stub_status on;
         access_log off;
         allow 192.168.20.0/24;
         deny all;
       }

     location = /50x.html {
       root  html;
     }
   }
}

关于Nginx服务实现反向代理的方法就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

另外有需要云服务器可以了解下创新互联cdcxhl.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


本文标题:Nginx服务实现反向代理-创新互联
转载来源:http://pwwzsj.com/article/dsdocg.html