要实现Nginx代理缓存能够实时响应网站变化,需要合理配置缓存策略和更新机制。以下是详细的解决方案:
首先,在nginx.conf或站点配置文件中设置基本的缓存参数:
proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m inactive=60m use_temp_path=off;
server {
# ...
location / {
proxy_cache my_cache;
proxy_pass http://backend;
# 缓存键设置
proxy_cache_key "$scheme$request_method$host$request_uri";
# 缓存有效时间
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
}
}
确保后端服务器返回适当的Cache-Control头:
location / {
# ...
proxy_ignore_headers Set-Cookie;
proxy_hide_header Set-Cookie;
# 遵循后端Cache-Control头
proxy_cache_revalidate on;
proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
}
后端应返回:
- Cache-Control: no-cache - 每次验证内容是否变化
- Cache-Control: max-age=0 - 立即过期
- Cache-Control: must-revalidate - 必须重新验证
使用proxy_cache_purge模块:
location ~ /purge(/.*) {
allow 127.0.0.1;
allow 192.168.1.0/24;
deny all;
proxy_cache_purge my_cache "$scheme$request_method$host$1";
}
然后通过访问http://example.com/purge/uri-to-purge来清除特定URL的缓存。
在网站更新时使用版本化URL:
<link href="/css/style.css?v=12345" rel="stylesheet">
这样Nginx会将其视为新资源进行缓存。
对于动态内容,可以设置更短的缓存时间:
# 静态资源长缓存
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
proxy_cache_valid 200 302 12h;
# ...
}
# 动态内容短缓存
location /api/ {
proxy_cache_valid 200 302 10s;
# ...
}
后端可以通过发送X-Accel-Expires头控制缓存:
proxy_cache_valid any 5m; # 默认值
proxy_ignore_headers X-Accel-Expires; # 不忽略此头
防止多个请求同时更新缓存:
proxy_cache_lock on;
proxy_cache_lock_timeout 5s;
添加调试头查看缓存状态:
add_header X-Cache-Status $upstream_cache_status;
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m inactive=60m use_temp_path=off;
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend;
proxy_cache my_cache;
proxy_cache_key "$scheme$request_method$host$request_uri";
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
proxy_cache_revalidate on;
proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
add_header X-Cache-Status $upstream_cache_status;
}
location ~ /purge(/.*) {
allow 127.0.0.1;
deny all;
proxy_cache_purge my_cache "$scheme$request_method$host$1";
}
}
通过以上配置,您可以实现Nginx代理缓存的灵活控制,既能享受缓存带来的性能优势,又能确保内容更新的及时性。