千家信息网

Nginx服务实现反向代理

发表于:2025-01-18 作者:千家信息网编辑
千家信息网最后更新 2025年01月18日,这篇文章主要为大家分享Nginx服务实现反向代理的方法。文中还介绍了Nginx服务的安装配置以及Nginx服务的优化方案,希望大家通过这篇文章能有所收获。环境准备:三台centos 7.5,其中一台运
千家信息网最后更新 2025年01月18日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.gznginx-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 oknginx: 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服务器进行轮询):

若使用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.0built by gcc 4.8.5 20150623 (Red Hat 4.8.5-11) (GCC) built with OpenSSL 1.0.2k-fips  26 Jan 2017TLS SNI support enabledconfigure 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 sucnginx: 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 oknginx: configuration file /usr/local/nginx1.14/conf/nginx.conf test is successful[root@nginx conf]# nginx -s reload         #重启Nginx服务

客户端访问测试(使用的是谷歌浏览器,访问前按F12):

按"F5"刷新一下:

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

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

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

客户端访问以下地址(客户端必须在 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,返回给客户端的浏览器缓存失效时间。

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 oknginx: configuration file /usr/local/nginx1.14/conf/nginx.conf test is successful[root@nginx nginx1.14]# nginx -s reload        #重启Nginx服务

验证:

1、访问以下地址,可以查看Nginx服务器的状态统计页:

2、查看GZIP功能是否开启:

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

附加: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服务实现反向代理的方法就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

服务 服务器 代理 缓存 模块 文件 配置 客户 时间 客户端 缓冲 大小 目录 均衡 字段 支持 缓冲区 信息 指令 功能 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 物理服务器每天固定时间卡顿 怎么让电脑做远程服务器 诺心网络技术有限公司 服务器修复数据库 惠普380服务器哪里有卖 基于安卓手机的开发软件开发 湖北自考游戏软件开发技术 软件sql数据库是什么软件 张湾区信息软件开发学习 奉贤区无线网络技术展示 我的世界贪玩的蓝月服务器 葫芦娃黑猫警长数据库 互联网最先进科技 无线连接网络安全密钥是什么 金华云富软件开发有限公司 网络公司服务器排行榜 网络安全可以去哪里 大数据中心网络安全建设 软件开发车 微软拒绝提供用户数据库 生产服务器上传文件成功却找不到 光伏电站网络安全拓扑图 网络安全公益海报制作 华为服务器命名 更换备调前置服务器的安全措施 网络技术赚钱书籍 数据库查出某列对应密码内容 金融理财软件开发方案 电脑mc如何开服务器不要钱 新冠疫情的数据库设计
0