![](https://i-blog.csdnimg.cn/blog_migrate/325d5228b6a1f9e1f601b92ae404bfdf.png)
Nginx高级 第一部分:扩容
通过扩容提升整体吞吐量
1.单机垂直扩容:硬件资源增加
云服务资源增加
整机:IBM、浪潮、DELL、HP等
CPU/主板:更新到主流
网卡:10G/40G网卡
磁盘:SAS(SCSI) HDD(机械)、HHD(混合)、SATA SSD、PCI-e SSD、 MVMe SSD
SSD
多副本机制
系统盘/热点数据/数据库存储
HDD
冷数据存储
2.水平扩展:集群化
基本调优
会话管理-修改负载均衡策略
Nginx高级负载均衡
ip_hash
- 会导致流量倾斜,ip集中
- 若后端服务器宕机,对应ip的服务将无法提供
- 应用场景:中小型项目快速扩容时,不想修改代码,只需增加几台服务器使用ip_hash就可临时实现
hash $cookie_jsessionid;
- 根据cookie中的jsessionid的不同转发到对应的服务器
hash $request_uri;
- 根据uri的不同转发到对应的服务器
使用lua逻辑定向分发
Redis + SpringSession
- 要修改代码
- 所有前端服务器的请求打在redis服务器上,redis受不了
ip_hash示例:
upstream httpds {
ip_hash; #设置负载均衡策略为ip_hash
server 192.168.44.102 ;
server 192.168.44.103 ;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://httpds;
# root html;
}
location ~*/(css|img|js) {
root /usr/local/nginx/html;
}
使用sticky模块完成对Nginx的负载均衡
使用参考
http://nginx.org/en/docs/http/ngx_http_upstream_module.html#sticky
tengine中有session_sticky模块我们通过第三方的方式安装在开源版本中
sticky是第三方模块,需要重新编译Nginx,他可以对Nginx这种静态文件服务器使用基于cookie的负载均衡
1.下载模块
项目官网
https://bitbucket.org/nginx-goodies/nginx-sticky-module-ng/src/master/
另外一个版本
https://github.com/bymaximus/nginx-sticky-module-ng
下载
https://bitbucket.org/nginx-goodies/nginx-sticky-module-ng/get/1.2.6.zip
2.上传解压
3.重新编译Nginx
进到源码目录重新编译
configure时记得加上自己原本有的后缀
cd /opt/nginx-1.21.6 #根据自己的实际目录
./configure --prefix=/usr/local/nginx --add-module=/root/nginx-goodies-nginx-sticky-module-ng-c78b7dd79d0d
执行make
make时如遇报错修改源码
打开sticky文件夹中 ngx_http_sticky_misc.c
文件
在12行添加
#include <openssl/sha.h>
#include <openssl/md5.h>
若缺少依赖openssl-devel
yum intall -y openssl-devel
备份之前的程序
mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old
把编译好的Nginx程序替换到原来的目录里
cp objs/nginx /usr/local/nginx/sbin/
升级检测
make upgrade
检查程序中是否包含新模块
nginx -V
配置示例:
upstream httpget {
sticky name=route expires=6h;
server 192.168.44.102;
server 192.168.44.103;
}
请求头中的cookie中带有key为route的数据,重复请求该值不变,route是由sticky模块下发的值
KeepAlive
不是keepalived 没有d
KeepAlive:保持长连接,避免过多的http连接的建立,在http协议header中可以看到当前KeepAlive的连接状态
可使用测试工具charles,也可以直接使用浏览器开发者模式,不过可能因为缓存原因刷新失败
类似于wireshark,一个抓包工具
下载地址
https://www.charlesproxy.com/assets/release/4.6.2/charles-proxy-4.6.2-win64.msi?k=fc1457e312
官网
https://www.charlesproxy.com
什么时候用和不用?
用?
明显的预知用户会在当前连接上有下一步操作
复用连接,有效减少握手次数,尤其是https建立一次连接开销会更大
不用?
访问内联资源一般用缓存,不需要keepalive
长时间的tcp连接容易导致系统资源无效占用
对客户端使用keepalive
客户端一般是浏览器
配置位置:http
- keepalive_timeout
nginx.conf配置文件中修改keepalive_timeout,默认是65(s),修改成0即为关闭
用于设置Nginx服务器与客户端保持连接的超时时间
用于踢出不活动连接
keepalive_timeout = 0 即关闭
可以设置两个参数, keepalive_timeout 65 65;
第二个参数用于配置http1.0版本,1.1不需要
- keepalive_disable
不对某些浏览器建立长连接
默认msie6
- keepalive_time
限制keepalive保持连接的最大时间,超过之后 强制失效
默认是1h
1.19.10新功能
- keepalive_request
默认1000,1000已经够用
一个tcp复用中 可以并发接收的请求个数
- send_timeout
两次向客户端写操作之间的间隔 如果大于这个时间则关闭连接 默认60s
send_timeout 10; 10秒
send_timeout 10 10; 同时下发一个header 告诉浏览器
此处有坑,注意耗时的同步操作有可能会丢弃用户连接
该设置表示Nginx服务器与客户端连接后,某次会话中服务器等待客户端响应超过10s,就会自动关闭连接。
配置示例:
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65 65; #超过这个时间 没有活动,会让keepalive失效 ,第二个参数用于配置http1.0版本,1.1不需要
keepalive_time 1h; # 一个tcp连接总时长,超过之后 强制失效
send_timeout 60;# 默认60s 此处有坑!! 系统中 若有耗时操作,超过 send_timeout 强制断开连接。 注意:准备过程中,不是传输过程
keepalive_requests 1000; #一个tcp复用中 可以并发接收的请求个数
对上游服务器使用keepalive
上游服务器就是后端服务器
首先需要配置使用http1.1协议。以便建立更高效的传输,默认使用http1.0,在http1.0中需要配置header才能
在Upstream中所配置的上游服务器默认都是用短连接,即每次请求都会在完成之后断开
upstream中配置
配置
- keepalive 100;
向上游服务器的保留连接数
- keepalive_timeout 65
连接保留时间
- keepalive_requests 1000
一个tcp复用中 可以并发接收的请求个数
server中的location配置
proxy_http_version 1.1;
#配置http版本号
#因为nginx默认使用http1.0协议,需要在request中增加”Connection: keep-alive“ header才能够支持,而HTTP1.1默认支持。
proxy_set_header Connection ""; #清除close信息
由于nginx默认为 http 1.0 ,不支持服务端长连接,请求头会携带 connection: close ,所以需要指定http版本为 http 1.1,同时设置connection: “”
配置示例:
#定义集群
upstream cluster {
keepalive 100;
keepalive_timeout 65;
keepalive_requests 1000;
server 192.168.111.101:80;
server 192.168.111.102:80;
}
server {
listen 80;
server_name localhost;
location / {
proxy_http_version 1.1;
proxy_set_header Connection "";
#反向代理到集群,配置负载均衡
proxy_pass http://cluster;
}
KeepAlive配置总结
一般情况下:
- 对客户端使用keepAlive全部配上,使用默认值
- 对上游服务器使用keepAlive全部配上,使用默认值
KeepAlive压测:AB安装使用
apache benchmark:一款压力测试插件,直接通过yum安装即可
yum install httpd-tools
参数说明:
- -n 即requests,用于指定压力测试总共的执行次数。
- -c 即concurrency,用于指定的并发数。
- -t 即timelimit,等待响应的最大时间(单位:秒)。
- -b 即windowsize,TCP发送/接收的缓冲大小(单位:字节)。
- -p 即postfile,发送POST请求时需要上传的文件,此外还必须设置-T参数。
- -u 即putfile,发送PUT请求时需要上传的文件,此外还必须设置-T参数。
- -T 即content-type,用于设置Content-Type请求头信息,例如:application/x-www-form-urlencoded,默认值为text/plain。
- -v 即verbosity,指定打印帮助信息的冗余级别。
- -w 以HTML表格形式打印结果。
- -i 使用HEAD请求代替GET请求。
- -x 插入字符串作为table标签的属性。
- -y 插入字符串作为tr标签的属性。
- -z 插入字符串作为td标签的属性。
- -C 添加cookie信息,例如:“Apache=1234”(可以重复该参数选项以添加多个)。
- -H 添加任意的请求头,例如:“Accept-Encoding: gzip”,请求头将会添加在现有的多个请求头之后(可以重复该参数选项以添加多个)。
- -A 添加一个基本的网络认证信息,用户名和密码之间用英文冒号隔开。
- -P 添加一个基本的代理认证信息,用户名和密码之间用英文冒号隔开。
- -X 指定使用的和端口号,例如:“126.10.10.3:88”。
- -V 打印版本号并退出。
- -k 使用HTTP的KeepAlive特性。
- -d 不显示百分比。
- -S 不显示预估和警告信息。
- -g 输出结果信息到gnuplot格式的文件中。
- -e 输出结果信息到CSV格式的文件中。
- -r 指定接收到错误信息时不退出程序。
- -h 显示用法信息,其实就是ab -help。
压测语句:
ab -n 100000 c 30 http://192.168.111.102/
直连nginx
Server Software: nginx/1.21.6
Server Hostname: 192.168.44.102
Server Port: 80
Document Path: /
Document Length: 16 bytes
Concurrency Level: 30
Time taken for tests: 13.035 seconds
Complete requests: 100000
Failed requests: 0
Write errors: 0
Total transferred: 25700000 bytes
HTML transferred: 1600000 bytes
Requests per second: 7671.48 [#/sec] (mean)
Time per request: 3.911 [ms] (mean)
Time per request: 0.130 [ms] (mean, across all concurrent requests)
Transfer rate: 1925.36 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.4 0 12
Processing: 1 3 1.0 3 14
Waiting: 0 3 0.9 3 14
Total: 2 4 0.9 4 14
Percentage of the requests served within a certain time (ms)
50% 4
66% 4
75% 4
80% 4
90% 5
95% 5
98% 6
99% 7
100% 14 (longest request)
反向代理
Server Software: nginx/1.21.6
Server Hostname: 192.168.44.101
Server Port: 80
Document Path: /
Document Length: 16 bytes
Concurrency Level: 30
Time taken for tests: 25.968 seconds
Complete requests: 100000
Failed requests: 0
Write errors: 0
Total transferred: 25700000 bytes
HTML transferred: 1600000 bytes
Requests per second: 3850.85 [#/sec] (mean)
Time per request: 7.790 [ms] (mean)
Time per request: 0.260 [ms] (mean, across all concurrent requests)
Transfer rate: 966.47 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.2 0 13
Processing: 3 8 1.4 7 22
Waiting: 1 7 1.4 7 22
Total: 3 8 1.4 7 22
Percentage of the requests served within a certain time (ms)
50% 7
66% 8
75% 8
80% 8
90% 9
95% 10
98% 12
99% 13
100% 22 (longest request)
直连Tomcat
Server Software: nginx/1.21.6
Server Hostname: 192.168.44.105
Server Port: 8080
Document Path: /
Document Length: 7834 bytes
Concurrency Level: 30
Time taken for tests: 31.033 seconds
Complete requests: 100000
Failed requests: 0
Write errors: 0
Total transferred: 804300000 bytes
HTML transferred: 783400000 bytes
Requests per second: 3222.38 [#/sec] (mean)
Time per request: 9.310 [ms] (mean)
Time per request: 0.310 [ms] (mean, across all concurrent requests)
Transfer rate: 25310.16 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.3 0 15
Processing: 0 9 7.8 7 209
Waiting: 0 9 7.2 7 209
Total: 0 9 7.8 7 209
Percentage of the requests served within a certain time (ms)
50% 7
66% 9
75% 11
80% 13
90% 18
95% 22
98% 27
99% 36
100% 209 (longest request)
nginx反向代理Tomcat + keepalive
Server Software: nginx/1.21.6
Server Hostname: 192.168.44.101
Server Port: 80
Document Path: /
Document Length: 7834 bytes
Concurrency Level: 30
Time taken for tests: 23.379 seconds
Complete requests: 100000
Failed requests: 0
Write errors: 0
Total transferred: 806500000 bytes
HTML transferred: 783400000 bytes
Requests per second: 4277.41 [#/sec] (mean)
Time per request: 7.014 [ms] (mean)
Time per request: 0.234 [ms] (mean, across all concurrent requests)
Transfer rate: 33688.77 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.2 0 9
Processing: 1 7 4.2 6 143
Waiting: 1 7 4.2 6 143
Total: 1 7 4.2 6 143
Percentage of the requests served within a certain time (ms)
50% 6
66% 7
75% 7
80% 7
90% 8
95% 10
98% 13
99% 16
100% 143 (longest request)
nginx反向代理Tomcat
Server Software: nginx/1.21.6
Server Hostname: 192.168.44.101
Server Port: 80
Document Path: /
Document Length: 7834 bytes
Concurrency Level: 30
Time taken for tests: 33.814 seconds
Complete requests: 100000
Failed requests: 0
Write errors: 0
Total transferred: 806500000 bytes
HTML transferred: 783400000 bytes
Requests per second: 2957.32 [#/sec] (mean)
Time per request: 10.144 [ms] (mean)
Time per request: 0.338 [ms] (mean, across all concurrent requests)
Transfer rate: 23291.74 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.2 0 9
Processing: 1 10 5.5 9 229
Waiting: 1 10 5.5 9 229
Total: 1 10 5.5 9 229
Percentage of the requests served within a certain time (ms)
50% 9
66% 10
75% 11
80% 11
90% 13
95% 14
98% 17
99% 19
100% 229 (longest request)
UpStream(反向代理上游集群)工作流程
proxy_pass 向上游服务器请求数据共有6个阶段
- 初始化
- 与上游服务器建立连接
- 向上游服务器发送请求
- 处理响应头
- 处理响应体
- 结束
对客户端的限制配置
可配置位置
-
http
-
server
-
location
-
client_body_buffer_size
对客户端请求中的body缓冲区大小
默认32位系统8k 64位16k
如果请求体大于配置,则写入临时文件
- client_header_buffer_size
设置读取客户端请求体的缓冲区大小。 如果请求体大于缓冲区,则将整个请求体或仅将其部分写入临时文件。 默认32位8K。 64位平台16K。
- client_max_body_size 1000M;
默认1m,如果一个请求的大小超过配置的值,会返回413 (request Entity Too Large)错误给客户端
将size设置为0将禁用对客户端请求正文大小的检查。
- client_body_timeout
指定客户端与服务端建立连接后发送 request body 的超时时间。如果客户端在指定时间内没有发送任何内容,Nginx 返回 HTTP 408(Request Timed Out)
- client_header_timeout
客户端向服务端发送一个完整的 request header 的超时时间。如果客户端在指定时间内没有发送一个完整的 request header,Nginx 返回 HTTP 408(Request Timed Out)。
- client_body_temp_path path
[
level1[
level2[
level3`]]]
在磁盘上客户端的body临时缓冲区位置
client_body_in_file_only on;
把body写入磁盘文件,请求结束也不会删除
- client_body_in_single_buffer
尽量缓冲body的时候在内存中使用连续单一缓冲区,在二次开发时使用$request_body
读取数据时性能会有所提高
- client_header_buffer_size
设置读取客户端请求头的缓冲区大小
如果一个请求行或者一个请求头字段不能放入这个缓冲区,那么就会使用large_client_header_buffers
- large_client_header_buffers
默认8k
header和连接配置
配置位置:推荐location
- add_header | proxy_set_header
设置header
- proxy_connect_timeout
与上游服务器连接超时时间、快速失败
- proxy_send_timeout
定义nginx向后端服务发送请求的间隔时间(不是耗时)。默认60秒,超过这个时间会关闭连接
- proxy_read_timeout
后端服务给nginx响应的时间,规定时间内后端服务没有给nginx响应,连接会被关闭,nginx返回504 Gateway Time-out。默认60秒
缓冲区配置
配置位置:推荐location
- proxy_requset_buffering
是否完全读到请求体之后再向上游服务器发送请求
- proxy_buffering
是否缓冲上游服务器数据
- proxy_buffers 32 64k;
缓冲区大小 32个 64k大小内存缓冲块
- proxy_buffer_size
header缓冲区大小
proxy_requset_buffering on;
proxy_buffering on;
proxy_buffer_size 64k;
proxy_buffers 32 128k;
proxy_busy_buffers_size 8k;
proxy_max_temp_file_size 1024m;
- proxy_temp_file_write_size 8k
当启用从代理服务器到临时文件的响应的缓冲时,一次限制写入临时文件的数据的大小。 默认情况下,大小由proxy_buffer_size和proxy_buffers指令设置的两个缓冲区限制。 临时文件的最大大小由proxy_max_temp_file_size指令设置。
- proxy_max_temp_file_size 1024m;
临时文件最大值
- proxy_temp_path
proxy_temp_path /spool/nginx/proxy_temp 1 2;
a temporary file might look like this:
/spool/nginx/proxy_temp/7/45/00000123457
UpStream配置总结
自己的阿里云服务器配置示例:
需要配置下列一项才能完成登录等post请求,否侧会返回500
proxy_set_header Host $host;
注释掉的都可以配一配,参考的别人的
location / {
#反向代理到集群,配置负载均衡
proxy_pass http://47.115.207.49:8099/;
proxy_set_header Host $host;
#proxy_redirect off;
#proxy_set_header X-Real-IP $remote_addr;
#proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#proxy_set_header Cookie $http_cookie;
#proxy_send_timeout 1300;
#proxy_read_timeout 1300;
#proxy_buffer_size 64k;
#proxy_buffers 8 64k;
#proxy_busy_buffers_size 128k;
#proxy_temp_file_write_size 64k;
#client_max_body_size 10m;
#client_body_buffer_size 128k;
#proxy_connect_timeout 1300;
#root /www/www;
#index index.html index.htm;
}
获取客户端真实IP
用到header设置: proxy_set_header
X-Real-IP
额外模块,不推荐使用
X-Forwarded-For
proxy_set_header X-Forwarded-For $remote_addr;
$remote_addr : 前置ip地址,这里是获取nginx服务器的前置ip,那就是客户端ip
若有两层nginx服务器,一种方法是转发第一层nginx发过来的remote_addr,另一种方法是不覆盖再加一个header记录第二层nginx的remote_addr
Gzip
适合静态资源,但是
二进制资源:例如图片/mp3这样的二进制文件,不必压缩;因为压缩率比较小, 比如100->80字节,而且压缩也是耗费CPU资源的.
Gzip动态压缩配置
作用域 http, server, location
- gzip on;
开关,默认关闭
- gzip_buffers 32 4k|16 8k
缓冲区大小
32位cpu推荐选 32 4k
64位cpu推荐选 16 8k
- gzip_comp_level 1;
压缩等级 1-9,数字越大压缩比越高
推荐1-6
- gzip_http_version 1.1;
使用gzip的最小版本
- gzip_min_length
设置将被gzip压缩的响应的最小长度。 长度仅由“Content-Length”响应报头字段确定。
大于这个设置长度才会压缩数据,否则不压缩
一般1k~5K
- gzip_proxied 多选
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_vary on;
增加一个header,适配老的浏览器 Vary: Accept-Encoding
- gzip_types
哪些mime类型的文件进行压缩
- gzip_disable
禁止某些浏览器使用gzip
会使用正则表达式,一般不推荐配置文件使用正则表达式,会额外消耗服务器的性能
完整实例
加载location或者server中
使用Gzip动态压缩会导致sendFile功能无法使用,于是使用静态压缩来解决这个问题,静态压缩只用给nginx加装module即可,配置加一行gzip_static on; 前提:服务器硬盘指定静态资源的位置,已经有压缩好的文件.gz
gzip on;
gzip_buffers 16 8k;
gzip_comp_level 6;
gzip_http_version 1.1;
gzip_min_length 256;
gzip_proxied any;
gzip_vary on;
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_types
text/xml application/xml application/atom+xml application/rss+xml application/xhtml+xml image/svg+xml
text/javascript application/javascript application/x-javascript
text/x-json application/json application/x-web-app-manifest+json
text/css text/plain text/x-component
font/opentype application/x-font-ttf application/vnd.ms-fontobject
image/x-icon;
#gzip_disable "MSIE [1-6]\.(?!.*SV1)"; #正则会消耗服务器性能,不推荐配置
未配置gzip的响应报文
HTTP/1.1 200
Server: nginx/1.21.6
Date: Wed, 18 May 2022 17:42:35 GMT
Content-Type: text/html;charset=utf-8
Content-Length: 7832
Connection: keep-alive
Keep-Alive: timeout=65
配置gzip的响应报文
HTTP/1.1 200
Server: nginx/1.21.6
Date: Wed, 18 May 2022 17:42:35 GMT
Content-Type: text/html;charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Keep-Alive: timeout=65
Vary: Accept-Encoding
Content-Encoding: gzip
Gzip静态压缩
http_gzip_static_module
前提:服务器硬盘指定静态资源的位置,已经有压缩好的文件.gz
需要重新编译nginx
configure时记得加上自己原本有的后缀
./configure --with-http_gzip_static_module
编译后make和复制启动命令,具体参考 使用sticky模块完成对Nginx的负载均衡 部分
配置:在动态压缩的基础上加上gzip_static on;
gzip_static on;
ngx_http_gunzip_module
不常用
作用:将压缩包发送给客户端前,帮助先解压再给客户端
帮助不支持gzip的客户端解压本地文件
./configure --with-http_gunzip_module
配置:在前面的配置基础上加上gunzip on;并修改为gzip_static always;
gunzip on;
gzip_static always;
Brotli(Br)
Brotli为比Gzip压缩比更高的压缩方式,需要加载新的nginx模块才能实现
可以和Gzip共存,若客户端不支持Brotli则使用Gzip
安装模块
-
官网
-
https://github.com/google/ngx_brotli
-
https://codeload.github.com/google/brotli/tar.gz/refs/tags/v1.0.9
-
-
下载 两个项目
-
解压缩
-
将brotli-1.0.9目录下的所有东西移动到ngx_brotli-1.0.0rc/deps/brotli/下
cd /root/brotli-1.0.9/
mv ./* /root/ngx_brotli-1.0.0rc/deps/brotli/
模块化编译
configure时记得加上自己原本有的后缀
–add-dynamic-module:动态编译,临时存在于nginx
./configure --with-compat --add-dynamic-module=/root/ngx_brotli-1.0.0rc
或
--add-dynamic-module=brotli目录
- make
- 将objs中的
ngx_http_brotli_filter_module.so
ngx_http_brotli_static_module.so
拷贝到/usr/local/nginx/modules/
- 备份然后复制nginx主程序
配置文件中添加
在最外层加,例如配置文件最前面
load_module "/usr/local/nginx/modules/ngx_http_brotli_filter_module.so";
load_module "/usr/local/nginx/modules/ngx_http_brotli_static_module.so";
location或server加(和Gzip一起)
brotli on;
brotli_static on;
brotli_comp_level 6;
brotli_buffers 16 8k;
brotli_min_length 20;
brotli_types text/plain text/css text/javascript application/javascript text/xml application/xml application/xml+rss application/json image/jpeg image/gif image/png;
- 测试
默认http协议是没有br的,即http请求头中没有带br的请求方式,需要使用curl自己指定header
curl -H 'Accept-Encoding: br' -I http://192.168.111.100
反向代理中的容错机制
参考文档
https://docs.nginx.com/nginx/admin-guide/load-balancer/http-load-balancer/
http://nginx.org/en/docs/stream/ngx_stream_proxy_module.html#proxy_bind
proxy_timeout
重试机制
proxy_next_upstream
作用:
当后端服务器返回指定的错误时,将请求传递到其他服务器。
error
与服务器建立连接,向其传递请求或读取响应头时发生错误;
timeout
在与服务器建立连接,向其传递请求或读取响应头时发生超时;
invalid_header
服务器返回空的或无效的响应;
http_500
服务器返回代码为500的响应;
http_502
服务器返回代码为502的响应;
http_503
服务器返回代码为503的响应;
http_504
服务器返回代码504的响应;
http_403
服务器返回代码为403的响应;
http_404
服务器返回代码为404的响应;
http_429
服务器返回代码为429的响应;
不了解这个机制,在日常开发web服务的时候,就可能会踩坑。
比如有这么一个场景:一个用于导入数据的web页面,上传一个excel,通过读取、处理excel,向数据库中插入数据,处理时间较长(如1分钟),且为同步操作(即处理完成后才返回结果)。暂且不论这种方式的好坏,若nginx配置的响应等待时间(proxy_read_timeout)为30秒,就会触发超时重试,将请求又打到另一台。如果处理中没有考虑到重复数据的场景,就会发生数据多次重复插入!(当然,这种场景,内网可以通过机器名访问该服务器进行操作,就可以绕过nginx了,不过外网就没办法了。)
并发调优
Concat合并客户端请求
将文本类的请求合并起来成一个请求(需要修改代码),再发给客户端,能够减少并发请求,让并发量变小提高能处理的并发数
虽然多个类似于css文件会额外消耗服务器性能,但为了便于管理,也会分开来
Concat模块
Tengine
Nginx官方介绍
https://www.nginx.com/resources/wiki/modules/concat/
git地址
https://github.com/alibaba/nginx-http-concat
- 安装
下载源码到/root目录
解压
nginx重新编译
configure时记得加上自己原本有的后缀
./configure .... --add-module=/root/nginx-http-concat-master/
- make
- 备份复制nginx主程序
- 配置
例如css引用:
<link href="??font.css,bg.css"rel="stylesheet">
配置文件:server或location
concat on;
concat_max_files 30;
资源静态化
高并发下:把资源做为静态资源放到Nginx。
- 类似于商品列表和详情页这种并发量高,但总体页面变化不大的页面,
- 可以使用资源静态化的方式将请求的页面生成一个静态页面存储起来,每次直接返回静态页面即可
- 优点:商品列表和详情页的并发量高,可以跳过服务器计算和连接数据库读取数据的过程,直接返回静态页面,降低延迟度和并发量
- 静态页面存储在nginx,或者使用openresty技术(内置模板引擎,落地磁盘)直接跳过nginx连接DB生成静态页面
- 再使用异步请求的方式更新页面中变化的动态数据
- nginx服务器需要用到rsync进行资源同步
例如一个item.html,可分为三个部分:
-
1.实际内容
-
2.固定公用->抽取 静态(例如header和footer,是common的)
-
前端->节约服务器端的计算资源消耗请求数
-
后端->使用SSI合并服务端文件(下一节讲),类似使用模板引擎(例如thymeleaf)
-
-
3.关联的内容->引用 动态资源
•高并发系统资源静态化方案
•一致性问题
•合并文件输出
•集群文件同步
生成静态页面自己去学
SSI合并nginx服务器端文件
类似使用模板引擎(例如thymeleaf)
不推荐过于复杂使用ssi,否则高消耗服务器性能,专业的事交给模板引擎来做
服务端文件是nginx的文件,例如动静分离的静态文件html等等
官方文档:http://nginx.org/en/docs/http/ngx_http_ssi_module.html
配置文件配置
- ssi on|off
开启关闭ssi
- ssi_last_modified on|off
是否保留lastmodified
默认off,每次输出的都是新文件
- ssi_min_file_chunk size
向磁盘存储并使用sendfile发送,文件大小最小值
默认1k,当大于1k时存储再磁盘上并用sendfile发送
- ssi_silent_errors on|off
不显示逻辑语法错误
默认off,当类似于 的语法错误,将直接返回不友好提示
on:语法错误时不提示,但是类似找不到文件,也会返回404错误提示
- ssi_types
默认text/html,只支持解析html的ssi功能
如果需要其他mime类型 需要设置
- ssi_value_length length
限制脚本参数最大长度
要配置一般开启就行
配置在server或者location中
ssi on
ssi_silent_errors on
SSI命令配置
配置在配置文件配置ssi_types(例如html)中
- include file
<!--# include file="footer.html" -->
静态文件直接引用
- block
<!--# block name="one" -->
stub
<!--# endblock -->
可以声明一个ssi的命令块,里面可以包裹其他命令
-
config
-
1、errmsg:
配置文件配置ssi_silent_errors off时,即会返回不友好的语法错误提示
用于修改提示信息的内容
[an error occurred while processing the directive]
在模板中配置报错情况
-
2、timefmt:
"%A, %d-%b-%Y %H:%M:%S %Z"
日期格式化
-
-
echo
直接输出变量
- var变量名称
<!--# echo var="name” default="no” -->
-
encoding 是否使用特殊编码格式
-
default 变量没有值的时候使用默认值
-
if
逻辑判断
<!--# if expr="..." -->
...
<!--# elif expr="..." -->
...
<!--# else -->
...
<!--# endif -->
eg:
变量存在性检查:
<!--# if expr="$name" -->
变量与文本的比较:
<!--# if expr="$name = text" -->
<!--# if expr="$name != text" -->
变量与正则表达式的比较:
<!--# if expr="$name = /text/" -->
<!--# if expr="$name != /text/" -->
如果 a 包含变量, 它们的值被替换。 正则表达式可以包含位置捕获和命名捕获 以后可以通过变量使用,例如:text
<!--# if expr="$name = /(.+)@(?P<domain>.+)/" -->
<!--# echo var="1" -->
<!--# echo var="domain" -->
<!--# endif -->
正则不推荐使用,会高消耗服务器性能
- include virtual
可以指向location,而不一定是具体文件
指定包含的请求,例如:
<!--# include virtual="/remote/body.php?argument=value" -->
如果需要顺序处理,则应使用该参数。wait
- include wait
如果需要顺序处理,则应使用该参数。wait
<!--# include virtual="/remote/body.php?argument=value" wait="yes" -->
- include stub
一个非标准参数,用于命名其块 如果包含的请求导致空,则将输出内容 正文,或者在请求处理过程中发生错误,例如:
<!--# block name="one" --> <!--# endblock -->
<!--# include virtual="/remote/body.php?argument=value" stub="one" -->
- include set
指示写入成功结果的非标准参数 对指定变量的请求处理, 例如:
<!--# include virtual="/remote/body.php?argument=value" set="one" -->
rsync
https://www.samba.org/ftp/rsync/rsync.html
remote synchronize是一个远程数据同步工具,可通过 LAN/WAN 快速同步多台主机之间的文件。也可以使用 rsync 同步本地硬盘中的不同目录。
rsync 是用于替代 rcp 的一个工具,rsync 使用所谓的 rsync算法 进行数据同步,这种算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快。
rsync 基于inotify 开发
Rsync有三种模式:
- 本地模式(类似于cp命令)
- 远程模式(类似于scp命令)
- 守护进程(socket进程:是rsync的重要功能)
rsync手动拉取同步源文件
安装
两端安装
yum install -y rsync
源服务器修改配置文件
vim /etc/rsyncd.conf
内容:
[ftp]
path = /usr/local/nginx/html
源服务器启动rsync
rsync--daemon
目标服务器查看源文件夹
rsync --list-only 192.168.111.100::ftp/
ftp/为源服务器配置文件配置的[ftp]
目标服务器手动拉取同步文件
rsync -avz 192.168.111.100::ftp/ /usr/local/nginx/html
同步到自己的/usr/local/nginx/html目录下
现在只能增量同步,若要删除源服务器没有的文件,需要加上参数实现完全同步:
--delete
增加安全认证及免密
源服务器增加密码文件
echo "sgg:111" >> /etc/rsyncd.pwd
chmod 600 /etc/rsyncd.pwd
源服务器修改配置文件
vim /etc/rsyncd.conf
auth users = sgg
secrets file = /etc/rsyncd.pwd
[ftp]
path = /usr/local/nginx/html
源服务器重启rsync
ps -ef | grep rsync
kill -9 进程号
rsync --daemon
目标服务器输入密码登录查看
rsync --list-only sgg@192.168.111.100::ftp/
目标服务器创建client密码文件 实现免密
echo "111" >> /etc/rsyncd.pwd.client
chmod 600 /etc/rsyncd.pwd.client
rsync --list-only --password-file=/etc/rsyncd.pwd.client sgg@192.168.111.100::ftp/
rsync -avz --password-file=/etc/rsyncd.pwd.client sgg@192.168.111.100::ftp/ /usr/local/nginx/html
此时在客户端已经可以配合脚本实现定时同步了
现在只能增量同步,若要删除源服务器没有的文件,需要加上参数实现完全同步:
--delete
源服务器推送文件
目标服务器增加密码文件
echo "sgg:111" >> /etc/rsyncd.pwd
chmod 600 /etc/rsyncd.pwd
目标服务器修改配置文件
vim /etc/rsyncd.conf
auth users = sgg
secrets file = /etc/rsyncd.pwd
read only = no #关闭只读,让别人可以写进来
[ftp]
path = /usr/local/nginx/html
目标服务器启动rsync
rsync --daemon
源服务器创建client密码文件
echo "111" >> /etc/rsyncd.pwd.client
chmod 600 /etc/rsyncd.pwd.client
源服务器推送给目标服务器
与拉取比只是交换了目录和目标ip
rsync -avz --password-file=/etc/rsyncd.pwd.client /usr/local/nginx/html/ sgg@192.168.111.101::ftp/
注意发送目录/usr/local/nginx/html/最后要加 ‘/’,否则发送的是文件夹,不是文件夹下的东西
现在只能增量同步,若要删除源服务器没有的文件,需要加上参数实现完全同步:
--delete
inotify监控自动推送
源服务器推送端安装inotify
依赖
yum install -y automake
下载上传tar包:
我的是 inotify-tools-3.14.tar.gz
tar -zxvf inotify-tools-3.14.tar.gz
configure
cd inotify-tools-3.14/
./configure --prefix=/usr/local/inotify
make && make install
源服务器监控目录
监控源服务器的/usr/local/nginx/html/目录
/usr/local/inotify/bin/inotifywait -mrq --timefmt '%Y-%m-%d %H:%M:%S' --format '%T %w%f %e' -e close_write,modify,delete,create,attrib,move //usr/local/nginx/html/
更改目标服务器配置文件
uid = root #设置user
gid = root #设置用户组
auth users = sgg
secrets file = /etc/rsyncd.pwd
read only = no
[ftp]
path = /usr/local/nginx/html
保证源和目标服务器rsync服务已启动且读取了最新配置文件
ps -ef | grep rsync
kill -9 进程号
rsync --daemon
源服务器编写简单自动化脚本
cd /root/bin
vim autoRsync.sh
内容:
#!/bin/bash
/usr/local/inotify/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f %e' -e close_write,modify,delete,create,attrib,move //usr/local/nginx/html/ | while read file
do
rsync -az --delete --password-file=/etc/rsyncd.pwd.client /usr/local/nginx/html/ sgg@192.168.111.101::ftp/
done
源服务器修改文件权限
chmod 777 autoRsync.sh
chmod 777 /usr/local/nginx/html
启动脚本
autoRsync.sh
常用参数
rsync 常用选项
选项 | 含义 |
---|---|
-a | 包含-rtplgoD |
-r | 同步目录时要加上,类似cp时的-r选项 |
-v | 同步时显示一些信息,让我们知道同步的过程 |
-l | 保留软连接 |
-L | 加上该选项后,同步软链接时会把源文件给同步 |
-p | 保持文件的权限属性 |
-o | 保持文件的属主 |
-g | 保持文件的属组 |
-D | 保持设备文件信息 |
-t | 保持文件的时间属性 |
–delete | 删除DEST中SRC没有的文件 |
–exclude | 过滤指定文件,如–exclude “logs”会把文件名包含logs的文件或者目录过滤掉,不同步 |
-P | 显示同步过程,比如速率,比-v更加详细 |
-u | 加上该选项后,如果DEST中的文件比SRC新,则不同步 |
-z | 传输时压缩 |
inotify常用参数
参数 | 说明 | 含义 |
---|---|---|
-r | –recursive | #递归查询目录 |
-q | –quiet | #打印很少的信息,仅仅打印监控事件信息 |
-m | –monitor | #始终保持事件监听状态 |
–excludei | #排除文件或目录时,不区分大小写 | |
–timefmt | #指定事件输出格式 | |
–format | #打印使用指定的输出类似格式字符串 | |
-e | –event[ -e|–event … ]accessmodifyattribcloseopenmove_tomove createdeleteumount | #通过此参数可以指定要监控的事件 #文件或目录被读取#文件或目录的内容被修改#文件或目录属性被改变#文件或目录封闭,无论读/写模式#文件或目录被打开#文件或目录被移动至另外一个目录#文件或目录被移动另一个目录或从另一个目录移动至当前目录#文件或目录被创建在当前目录#文件或目录被删除#文件系统被卸载 |
多级缓存
浏览器缓存
什么时候可以用缓存?
- 不常改变的内容
- 过期时间
- 针对post/get请求都可以
- 存储位置
- 磁盘使用空间限制
观察京东缓存及加载速度
- deskcache
字面理解是从内存中,其实也是字面的含义,这个资源是直接从内存中拿到的,不会请求服务器一般已经加载过该资源且缓存在了内存当中,当关闭该页面时,此资源就被内存释放掉了,再次重新打开相同页面时不会出现from memory cache的情况
- memorycache
是从磁盘当中取出的,也是在已经在之前的某个时间加载过该资源,不会请求服务器但是此资源不会随着该页面的关闭而释放掉,因为是存在硬盘当中的,下次打开仍会from disk cache
Age
是CDN添加的属性表示在CDN中缓存了多少秒
via
用来标识CDN缓存经历了哪些服务器,缓存是否命中,使用的协议
强制缓存
cache-control
http1.1的规范,使用max-age表示文件可以在浏览器中缓存的时间以秒为单位
标记 | 类型 | 功能 |
---|---|---|
public | 响应头 | 响应的数据可以被缓存,客户端和代理层都可以缓存 |
private | 响应头 | 可私有缓存,客户端可以缓存,代理层不能缓存(CDN,proxy_pass) |
no-cache | 请求头 | 可以使用本地缓存,但是必须发送请求到服务器回源验证 |
no-store | 请求和响应 | 应禁用缓存 |
max-age | 请求和响应 | 文件可以在浏览器中缓存的时间以秒为单位 |
s-maxage | 请求和响应 | 用户代理层缓存,CDN下发,当客户端数据过期时会重新校验 |
max-stale | 请求和响应 | 缓存最大使用时间,如果缓存过期,但还在这个时间范围内则可以使用缓存数据 |
min-fresh | 请求和响应 | 缓存最小使用时间, |
must-revalidate | 请求和响应 | 当缓存过期后,必须回源重新请求资源。比no-cache更严格。因为HTTP 规范是允许客户端在某些特殊情况下直接使用过期缓存的,比如校验请求发送失败的时候。那么带有must-revalidate的缓存必须校验,其他条件全部失效。 |
proxy-revalidate | 请求和响应 | 和must-revalidate类似,只对CDN这种代理服务器有效,客户端遇到此头,需要回源验证 |
stale-while-revalidate | 响应 | 表示在指定时间内可以先使用本地缓存,后台进行异步校验 |
stale-if-error | 响应 | 在指定时间内,重新验证时返回状态码为5XX的时候,可以用本地缓存 |
only-if-cached | 响应 | 那么只使用缓存内容,如果没有缓存 则504 getway timeout |
在浏览器和服务器端验证文件是否过期的时候,浏览器在二次请求的时候会携带IF-Modified-Since属性
Expires
设置强制缓存过期时间
配置
location中
使用expires配置
expires 30s; #缓存30秒
expires 30m; #缓存30分钟
expires 2h; #缓存2小时
expires 30d; #缓存30天
使用cache-control
优先级高于expires
add_header cache-control "max-age:300"; #单位s
浏览器缓存很取决于浏览器的策略,一般只会在新标签页的首次访问才会使用强制缓存
协商缓存
last-modified
etag
http1.1支持
在HTTP协议中If-Modified-Since和If-None-Match分别对应Last-Modified和ETag
Entity Tag 的缩写,中文译过来就是实体标签的意思.
HTTP中并没有指定如何生成ETag,哈希是比较理想的选择。
在计算Etag的时候,会产生CPU的耗费,所以也可以用时间戳,但这样直接使用Last-Modified即可。
ETag 用来校验用户请求的资源是否有变化,作用和lastmodified很像,区别是lastmodified精确到秒,ETag可以用hash算法来生成更精确的比对内容。
当用户首次请求资源的时候返回给用户数据和200状态码并生成ETag,再次请求的时候服务器比对ETag,没有发生变化的话返回304
Cache-Control直接是通过不请求来实现,而ETag是会发请求的,只不过服务器根据请求的东西的内容有无变化来判断是否返回请求的资源
配置
Http1.1自带协商缓存,一般浏览器默认开启
禁用协商缓存:
server或location
etag off;
if_modified_since off;
或
etag off;
add_header Last-Modified "";
总结
-
cache-control | expires 强制缓存
- 浏览器缓存很取决于浏览器的策略,一般只会在新标签页的首次访问才会使用强制缓存
-
etag | lastmodify 协商缓存
- 发送请求header中携带Last-Modified,若未修改服务器会返回304 Not Modified
-
强制缓存和协商缓存可配合使用
- 首次访问使用强制缓存,用户手动刷新将会发送请求,若服务器判断未修改,则返回304
-
last-modified 会与ssi的冲突
-
浏览器缓存原则
-
多级集群负载时last-modified必须保持一致
-
还有一些场景下我们希望禁用浏览器缓存。比如轮训api上报数据数据
-
浏览器缓存很难彻底禁用,大家的做法是加版本号,随机数等方法。
-
只缓存200响应头的数据,像3XX这类跳转的页面不需要缓存。
-
对于js,css这类可以缓存很久的数据,可以通过加版本号的方式更新内容
-
不需要强一致性的数据,可以缓存几秒
-
异步加载的接口数据,可以使用ETag来校验。
-
在服务器添加Server头,有利于排查错误
-
分为手机APP和Client以及是否遵循http协议
-
在没有联网的状态下可以展示数据
-
流量消耗过多
-
提前下发 避免秒杀时同时下发数据造成流量短时间暴增
-
兜底数据 在服务器崩溃和网络不可用的时候展示
-
临时缓存 退出即清理
-
固定缓存 展示框架这种,可能很长时间不会更新,可用随客户端下发
- 首页有的时候可以看做是框架,首页经常变化应该禁用缓存,以保证加载的资源都是最新的
-
父子连接 页面跳转时有一部分内容不需要重新加载,可用从父菜单带过来
-
预加载 某些逻辑可用判定用户接下来的操作,那么可用异步加载那些资源
-
漂亮的加载过程 异步加载 先展示框架,然后异步加载内容,避免主线程阻塞
-
GEOip
根据用户的ip获取用户所在地
1 下载数据库
官网需注册登录,下载数据库
maxmind.com
数据库有country版和city版是免费的,商业版更精确需要收费
2 安装依赖
官方git https://github.com/maxmind/libmaxminddb
下载后执行编译安装之后
$ echo /usr/local/lib >> /etc/ld.so.conf.d/local.conf
$ ldconfig
Nginx模块
https://github.com/leev/ngx_http_geoip2_module
更完整的配置可参考官方文档
http://nginx.org/en/docs/http/ngx_http_geoip_module.html#geoip_proxy
编译安装,不再讲
./configure --prefix=...... --with.......... --add-module=/root/ngx_http_geoip2_module
Nginx配置
#http添加
geoip2 /root/GeoLite2-ASN_20220524/GeoLite2-ASN.mmdb {
$geoip2_country_code country iso_code;
}
#location添加
add_header country $geoip2_country_code;
正向代理配置
#server中配置google提供的DNS服务器进行解析
resolver 8.8.8.8;
#location中
proxy_pass $scheme://$host$request_uri;
还需要在浏览器中设置代理服务器的信息,设置过后就可以正常代理访问http请求了
若要能访问https请求,还需要添加下面的模块(一般不会使用nginx作为正向代理服务器)
代理https请求
需要第三方模块
https://github.com/chobits/ngx_http_proxy_connect_module
下载后对nginx进行重新编译
配置
server {
listen 3128;
# dns resolver used by forward proxying
resolver 8.8.8.8;
# forward proxy for CONNECT request
proxy_connect;
proxy_connect_allow 443 563;
proxy_connect_connect_timeout 10s;
proxy_connect_read_timeout 10s;
proxy_connect_send_timeout 10s;
# forward proxy for non-CONNECT request
location / {
proxy_pass http://$host;
proxy_set_header Host $host;
}
}
反向代理proxy缓存
将资源缓存在nginx服务器
自己的理解:与动静分离类似,只不过动静分离在静态资源文件夹更新数据,而反向代理缓存则是设定的时间过期过后可以重新向tomcat发送请求拉取数据,并且缓存会缓存发起请求时的动态数据
官网解释
http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cache
最小配置
#http模块:
proxy_cache_path /ngx_tmp levels=1:2 keys_zone=test_cache:100m inactive=1d max_size=10g;
#缓存存储目录:/ngx_tmp
#location模块:
add_header Nginx-Cache "$upstream_cache_status";
proxy_cache test_cache;
proxy_cache_valid 1h; #缓存过期时间
缓存清理
purger
手动清理缓存,需要第三方模块支持
https://github.com/FRiCKLE/ngx_cache_purge
下载解压后使用–add-module重新编译nginx
最小配置
#新增location
location ~ /purge(/.*) {
proxy_cache_purge test_cache $1;
}
#proxy缓存配置的location中:
proxy_cache_key $uri; #自定义cachekey
其中,proxy_cache_key为设置的key,purger会根据设置的key删除指定的缓存
目前只根据uri为key删除缓存
示例:
以及访问了192.168.111.100/test.html,此时nginx缓存该页面,该页面的key为test.html,
若要清除该缓存,则浏览器访问:192.168.111.100/purge/test.html
配置以主机名+uri+参数作为key:
#新增location
location ~ /purge(/.*) {
proxy_cache_purge test_cache $host$1$is_args$args;
}
#proxy缓存配置的location中:
proxy_cache_key $host$uri$is_args$args; #自定义cachekey
proxy_cache_key和proxy_cache_purge要对应修改
断点续传缓存range
当有完整的content-length之后即可断点续传
在反向代理服务器中需向后传递header
proxy_set_header Range $http_range;
proxy_cache_key中增加range
根据header中的Range获取对应的partial-content,会返回206
详细配置
- proxy_cache_key
默认$scheme$proxy_host$request_uri
缓存的key
- proxy_cache_revalidate
过期后可以和协商缓存类似,如果缓存过期了,向上游服务器发送“If-Modified-Since” and “If-None-Match来验证是否改变,如果没有就不需要重新下载资源了
- proxy_cache_valid
可以针对不容http状态码设置缓存过期时间
不设置状态码会默认200, 301, 302
proxy_cache_valid 200 302 10m;
proxy_cache_valid 301 1h;
proxy_cache_valid any 1m;
any指其他任意状态码
- proxy_cache_use_stale
默认off
在什么时候可以使用过期缓存
可选error
| timeout
| invalid_header
| updating
| http_500
| http_502
| http_503
| http_504
| http_403
| http_404
| http_429
| off
- proxy_cache_background_update
默认off
运行开启子请求更新过期的内容。同时会把过期的内容返回给客户端
- proxy_no_cache proxy_cache_bypass
指定什么时候不使用缓存而直接请求上游服务器
proxy_no_cache $cookie_nocache $arg_nocache$arg_comment;
proxy_no_cache $http_pragma $http_authorization;
如果这些变量如果存在的话不为空或者不等于0,则不使用缓存
- proxy_cache_convert_head
默认 on
是否把head请求转换成get请求后再发送给上游服务器 以便缓存body里的内容
如果关闭 需要在 cache key
中添加 $request_method 以便区分缓存内容
- proxy_cache_lock
默认off
缓存更新锁
- proxy_cache_lock_age
默认5s
缓存锁超时时间
- proxy_cache_max_range_offset
range最大值,超过之后不做缓存,默认情况下 不需要对单文件较大的资源做缓存
- proxy_cache_methods
默认 head get
- proxy_cache_min_uses
默认1
被请求多少次之后才做缓存
- proxy_cache_path
path 指定存储目录
以cache_key取md5值
- levels=1:2
目录层级数及目录名称位数
取mdb5后几位
TMPFS
- use_temp_path
默认创建缓存文件时,先向缓冲区创建临时文件,再移动到缓存目录
是否使用缓冲区
- inactive
指定时间内未被访问过的缓存将被删除