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 影响,缓存文件在指定时间内没有被再次访问会被清理删除。