使用Nginx代理缓存可以减少后端服务端压力,提升网站性能,减小并发延时。Nginx设置缓存的代码如代码清单4-13所示。
upstream zachary.sh.cn{ server 192.168.10.1:8081; server 192.168.10.2:8082; } proxy_cache_path /cache levels=1:2 keys_zone=cache:10m max_size=10g inactive=60m use_temp_path=off; server { listen 80; server_name zachary.sh.cn; index index.html; location / { proxy_pass http:// zachary.sh.cn; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; proxy_cache cache; proxy_cache_valid 200 304 6h; proxy_cache_valid any 6m; proxy_cache_key $uri$request_body; proxy_cache_methods GET POST; add_header Nginx-Cache "$upstream_cache_status"; proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504; } }
在代码清单4-13中,proxy_cache_path /cache用于设置Nginx缓存资源的存放地址。各参数说明如下。
1)levels:按照两层目录分层。
2)key_zone:在共享内存中设置一块存储区域来存放缓存的key和metadata(类似使用次数),Nginx可以快速判断一个请求是否命中缓存,1MB可以存储8000个key,10MB可以存储80000个key。
3)max_size:最大缓存空间,如果不指定,会使用所有硬盘空间,当达到配额后,会删除最少使用的缓存文件。
4)inactive:未被访问文件在缓存中的保留时间。如果文件60分钟未被访问,则不论状态是否为expired,缓存控制程序都会删掉文件。inactive默认是10分钟。需要注意的是,inactive和expired配置项的含义是不同的,expired只是使缓存过期,但不会删除缓存文件,inactive是删除指定时间内未被访问的缓存文件。
5)use_temp_path:如果为off,则Nginx会将缓存文件直接写入指定的缓存文件中,而不是使用temp_path存储。official建议为off,因为这可以避免文件在不同文件系统中被不必要拷贝。
6)proxy_cache:用于启用proxy缓存,并指定key_zone。另外,如果proxy_cache为off,则表示关闭缓存。
7)proxy_cache_valid:状态码200|304的过期时间为6h,其余状态码6分钟过期。
8)proxy_cache_key:缓存的key,一般为URL+请求参数。
9)proxy_cache_methods:支持缓存的请求方式。
10)add_header:增加头信息,观察客户端responce是否命中。
11)proxy_next_upstream:出现502~504或其他错误,会跳过此台服务器访问下一台服务器。
其中,$upstream_cache_status的可能值如下。
清除Nginx缓存的方法如下:
安装ngx_cache_purge,如代码清单4-14所示。
wget http:// labs.frickle.com/files/ngx_cache_purge-2.3.tar.gz tar -zxvf ngx_cache_purge-2.3.tar.gz ./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --add-module=../ngx_cache_purge-2.3 make make install
查看Nginx插件进程,如代码清单4-15所示。
ps -ef|grep nginx nginx:master process /usr/local/nginx/sbin/nginx nginx:worker process nginx:cache manager process // 插件进程 nginx:cache loader process // 插件进程
此时可以通过URL路线来清除缓存。