Nginx安装、实现反向代理及深度优化
一、Nginx的安装
关于Nginx的基本概念,在之前的博文中:https://blog.51cto.com/14227204/2464167
有详细的介绍,这篇博文就直接从安装开始谈起。
成都创新互联公司专注为客户提供全方位的互联网综合服务,包含不限于成都网站建设、成都做网站、崇州网络推广、微信平台小程序开发、崇州网络营销、崇州企业策划、崇州品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们最大的嘉奖;成都创新互联公司为所有大学生创业者提供崇州建站搭建服务,24小时服务热线:18980820575,官方网址:www.cdcxhl.com
环境准备:
- 三台centos 7.5,其中一台运行Nginx,另外两台运行简单的web服务即可,主要用来测试Nginx反向代理的效果;
- 下载我提供的包,安装Nginx时需要,用来做缓存及压缩等优化项的:
*https://pan.baidu.com/s/1AJlDAkgdUd4uV1Bfjm46oA 提取码:gnlb
.
注(实现效果如下):
上面提到的 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服务器进行轮询):
若使用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):
按“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 ok
nginx: 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安装、实现反向代理及深度优化
分享链接:http://hbruida.cn/article/gsosjo.html