Nginx的Web缓存服务主要由proxy_cache相关指令集和fastcgi_cache相关指令集构成,
前者用于反向代理时,对后端内容源服务器进行缓存,后者主要用于对FastCGI的动态程序进行缓存。
配置nginx.conf
upstream myweb { server 127.0.0.1:8080; } #注:proxy_temp_path和proxy_cache_path指定的路径必须在同一分区 proxy_temp_path/data0/proxy_temp_dir; #设置Web缓存区名称为cache_one,内存缓存空间大小为200MB,1天没有被访问的内容自动清除,硬盘缓存空间大小为1GB。 proxy_cache_path/data0/proxy_cache_dirlevels=1:2keys_zone=cache_one:200minactive=1dmax_size=1g; server { listen 80; server_name localhost; location / { #root html; #index index.php index.html index.htm; #########cache #proxy_redirect off; #如果后端的服务器返回502、504、执行超时等错误,自动将请求转发到upstream负载均衡池中的另一台服务器,实现故障转移。 proxy_next_upstream http_502 http_504 error timeout invalid_header; 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_ignore_headers Set-Cookie Cache-Control; #proxy_hide_header Cache-Control; #proxy_hide_header Set-Cookie; proxy_cache cache_one; add_header Nginx-Cache $upstream_cache_status; proxy_cache_valid 200 304 301 302 8h; proxy_cache_valid 404 1m; proxy_cache_valid any 2d; proxy_cache_key $host$uri$is_args$args; expires 1d; proxy_ignore_headers "Cache-Control" "Expires" "Set-Cookie"; proxy_pass http://myweb; } } server { listen 8080; location / { root html; index index.html index.htm; } }
proxy_temp_path : 缓存临时目录。后端的响应并不直接返回客户端,而是先写到一个临时文件中,然后被rename一下当做缓存放在 proxy_cache_path 。0.8.9版本以后允许temp和cache两个目录在不同文件系统上(分区),然而为了减少性能损失还是建议把它们设成一个文件系统上。
proxy_cache_path ... : 设置缓存目录,目录里的文件名是 cache_key 的MD5值。
levels=1:2 keys_zone=cache_one:100m:表示采用2级目录结构,Web缓存区名称为cache_one,内存缓存空间大小为100MB,这个缓冲zone可以被多次使用。
inactive=1d max_size=1g:表示1天没有被访问的内容自动清除,硬盘最大缓存空间为1GB,超过这个大学将清除最近最少使用的数据。
proxy_cache : 引用前面定义的缓存区 cache_one
proxy_cache_key : 定义cache_key
proxy_cache_valid : 为不同的响应状态码设置不同的缓存时间,比如200、302等正常结果可以缓存的时间长点,而404、500等缓存时间设置短一些,这个时间到了文件就会过期,而不论是否刚被访问过。
expires : 在响应头里设置Expires:或Cache-Control:max-age,返回给客户端的浏览器缓存失效时间。
关于缓存的失效期限上面有三个选项:X-Accel-Expires、inactive、proxy_cache_valid、expires,它们之间是有优先级的,按上面的顺序如果在header里设置 X-Accel-Expires 则它的优先级最高,否则inactive优先级最高。
proxy_cache 可以缓存 upstream 响应,其中 proxy_cache_valid 设置缓存有效时间,需要注意的是 Nginx 检查缓存是否有效的优先级问题。根据文档和 Igor,Nginx 判断缓存有效的顺序是:
1、X-Accel-Expires
2、Expires/Cache-Control
3、proxy_cache_valid
也就是说 Nginx 会优先用 upstream 设置的缓存有效期,这种情况下 Nginx 相当于 Client,如果想忽略缓存直接到 upstream 更新,类似浏览器忽略本地缓存,可以这样设置:
proxy_ignore_headers X-Accel-Expires Expires Cache-Control;
另外 proxy_cache_path ... inactive=10m; 不受 upstream 影响,缓存文件在指定时间内没有被再次访问会被清理删除。
访客评论