nginx的ngx_http_proxy_module自带了缓存功能,下面介绍几个经常使用的指令以及如何配置。html
nginx缓存的内容是放在磁盘中的,因此咱们须要定义存放缓存的载体,proxy_cache_path设置缓存的路径和其余参数。缓存中的文件名为proxy_cache_key定义的字符串的hash结果nginx
语法 | proxy_cache_path path [levels=levels][use_temp_path=on丨off] keys_zone=name:size [inactive=time] [max_size=size] [manager_files=number] [manager_sleep=time] [manager_threshold=time] [loader_files=number] [loader_sleep=time] [loader_threshold=time] [purger=on丨off] [purger_files=number] [purger_sleep=time] [purger_threshold=time]; |
---|---|
默认 | - |
应用位置 | http |
用来指定使用哪一个共享内存,使用proxy_cache_path中的name来引用git
语法 | proxy_cache zone 丨 off; |
---|---|
默认 | proxy_cache off; |
应用位置 | http,server,location |
定义缓存的key,将以key的hash值做为缓存文件名 github
语法 | proxy_cache_key string; |
---|---|
默认 | proxy_cache_key $ scheme $ proxy_host $ request_uri; |
应用位置 | http,server,location |
用于设置不一样响应代码的缓存时间后端
语法 | proxy_cache_valid [code ...] time; |
---|---|
默认 | - |
应用位置 | http,server,location |
proxy_cache_valid 200 302 10m; proxy_cache_valid 404 1m; proxy_cache_valid 5m; proxy_cache_valid any 1m;
以上代码表示状态码为200和302的缓存有效期为10分钟,状态码为404的缓存有效期为1分钟,若是不指定状态码,那么只有缓存状态码200,301和302各五分钟,any表示缓存任何响应浏览器
定义不将响应保存到缓存的条件。当字符串参数为真时,则响应不会保存到缓存缓存
语法 | proxy_no_cache string ...; |
---|---|
默认 | - |
应用位置 | http,server,location |
定义不从缓存中获取响应的条件,当字符串参数为真时,则不会从缓存中获取响应服务器
语法 | proxy_cache_bypass string ...; |
---|---|
默认 | - |
应用位置 | http,server,location |
$upstream_cache_status是一个位于ngx_http_upstream_module模块来显示缓存状态的变量,能够在配置中添加一个http头来显示此变量的值app
为验证缓存,这里我将缓存超时时间设为1分钟 ide
proxy_cache_path /data/cache levels=1:2 keys_zone=cache:10m max_size=100m inactive=1m use_temp_path=off; server { listen 80; server_name wanger.com; include /etc/nginx/default.d/*.conf; location /wanger { proxy_pass http://192.168.0.52; proxy_cache cache; proxy_cache_valid 200 301 1m; add_header X-Cache $upstream_cache_status; proxy_cache_key $host$uri; } }
能够看到第一次访问并无命中缓存,而第二次访问的时候已经创建好缓存了
查看缓存目录,能够看到缓存文件已经存在,而且前两级的目录名是缓存文件名的后三个字符
进入后端服务器,添加响应头字段X-Accel-Expires,并将值设置为3
server { listen 80; server_name localhost; add_header X-Accel-Expires 3; location / { root html; index index.html; } }
再次进行测试,能够看到第一次请求显示缓存已通过期
再次进入后端服务器,添加响应头字段Vary,并将其值设置为"*",并进行测试
server { listen 80; server_name localhost; add_header X-Accel-Expires 3; add_header Vary *; location / { root html; index index.html; } }
能够看到index.htm文件一直没有被缓存
nginx提供了一个第三方模块ngx_cache_purge,GitHub地址:https://github.com/FRiCKLE/ngx_cache_purge
安装ngx_cache_purge模块须要从新编译nginx,并使用--add-module=模块位置参数添加模块到nginx里
这里须要用到proxy_cache_purge指令
语法 | proxy_cache_purge zone_name key |
---|---|
默认 | - |
应用位置 | location |
location ~ /purge(/.*) { proxy_cache_purge cache $host$1; } location /wanger { proxy_pass http://192.168.0.52; proxy_cache cache; proxy_cache_valid 200 301 1m; add_header X-Cache $upstream_cache_status; proxy_cache_key $host$uri; }
因为我缓存过时时间设置的是1分钟,当我命中缓存以后,就开始进行缓存清理测试,以后在一分钟内再次访问同一个URL,就发现缓存命中失败了
gzip压缩模块提供了压缩文件内容的功能,经过压缩可使服务器与浏览器之间传输的数据量更小,提升了客户端的响应速度,但压缩也会消耗nginx性能
server { listen 80; server_name 192.168.0.168; gzip on; gzip_types image/jpeg; gzip_buffers 32 4K; gzip_min_length 100; gzip_comp_level 6; gzip_vary on; }
浏览器要禁用浏览器缓存,能够看到压缩以后图片大小是75.9KB,响应头中也会多一个字段Content-Encoding: gzip
将gzip参数修改成off,重载nginx,再来看图片大小为76.4KB
欢迎各×××陈师傅”