Nginx 的反向代理缓存是一种高性能的方案,可以大大减少后端服务器的负载,提升响应速度和用户体验。下面详细介绍如何在 Nginx 中配置反向代理缓存及其最佳实践。
步骤 1:配置反向代理
首先,确保 Nginx 已经配置好反向代理,将请求转发至后端服务器。例如:
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://backend_server;
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_pass 指定了后端服务器的地址,proxy_set_header 设置了转发的头部信息。
步骤 2:设置缓存路径
在全局或者 http 块中添加缓存配置:
http {
proxy_cache_path /data/nginx/proxy_cache levels=1:2 keys_zone=my_cache:10m invalid=60m;
# 缓存区大小、层级和键值空间大小
# levels=1:2 创建两级缓存目录,my_cache 是缓存区域名,10M 缓存大小
}
invalid=60m 意味着缓存项目过期时间为 60 分钟,之后才会重新从后端服务器拉取。
步骤 3:配置缓存规则
在具体的 location 块中激活缓存:
location / {
proxy_pass http://backend_server;
proxy_cache my_cache; # 使用前面定义的缓存
proxy_cache_valid 200 302 60m; # 当状态码为 200 或 302 时,缓存 60 分钟
proxy_cache_valid any 1m; # 其他状态码的缓存时间设置为 1 分钟
}
步骤 4:排除不需缓存的内容
有些内容可能不适合缓存,例如用户登录或私人数据:
location /api/ {
proxy_pass http://backend_api;
proxy_cache_bypass $http_pragma; # 如果 Pragma header 存在,则不缓存
proxy_no_cache $cookie_session_id; # 根据 session id 不缓存
}
步骤 5:优化缓存行为
- 添加 Last-Modified 和 ETag 支持:利用条件请求,减少不必要的完全请求:
add_header Last-Modified "$upstream_http_last_modified"; add_header ETag "$upstream_etag"; - 使用 Stale While Revalidate:在后端服务器不可达时继续提供缓存内容:
proxy_cache_use_stale updating error timeout invalid_header http_500 http_502 http_503 http_504; - 添加 CDN Cache Headers:增加公共缓存提示:
add_header Cache-Control "public, max-age=3600"; # 公共缓存控制
步骤 6:清除缓存
有时,当需要立即更新缓存时,可以手动清除特定 URI 的缓存:
location /cache_buster {
if ($request_method = PURGE) {
proxy_cache_purge $request_uri;
return 200;
}
}
通过 POST 请求 /cache_buster 即可触发清除缓存。
最佳实践
- 性能监控:定期检查缓存命中率和内存使用情况。
- 安全性:确保敏感信息不被缓存。
- 适配更新:跟踪后端更改,适时刷新缓存内容。
通过以上配置,Nginx 反向代理缓存可以显著提高网站的响应速度和用户体验,同时也减轻了后端服务器的压力。注意,应持续监控缓存的效果,确保其符合预期目标,并根据业务需求做出调整。