在 Nginx 反向代理架构中,最稳妥的做法是启用内置的 proxy_cache 模块,将后端静态资源缓存在网关层。这适合后端静态文件更新频率较低的场景,能显著降低后端负载。
先说结论:通过配置 upstream 负载均衡块、proxy_cache_path 和 proxy_cache 指令,让 Nginx 直接响应命中缓存的静态请求,减少回源。
- 必须定义 upstream 后端地址,否则 proxy_pass 无法生效
- 缓存目录权限需匹配 Nginx 进程用户(nginx 或 www-data)
- 生产环境建议自定义 proxy_cache_key 避免缓存碰撞
- 验收时务必检查响应头中的 X-Cache-Status 状态
完整配置示例
以下是最小可用的配置片段,包含 upstream 定义和缓存策略,放入 nginx.conf 的 http 块中即可生效:
http {
# 1. 定义负载均衡后端
upstream backend {
server 192.168.1.10:80;
server 192.168.1.11:80;
}
# 2. 定义缓存路径和层级
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=static_cache:10m max_size=1g;
server {
location ~* \.(jpg|jpeg|png|css|js)$ {
proxy_pass http://backend;
# 3. 启用缓存
proxy_cache static_cache;
# 4. 设置缓存键,避免负载均衡环境下缓存碰撞
proxy_cache_key "$scheme$host$request_uri";
# 5. 设置缓存有效期
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
# 6. 添加调试头(注意:可能覆盖原有响应头,生产环境慎用)
add_header X-Cache-Status $upstream_cache_status always;
}
}
}实操步骤
1. 准备缓存目录与权限
确保 Nginx 进程用户有权限写入缓存目录。不同 Linux 发行版的默认用户不同,请先确认:
# 查看 Nginx 进程用户
ps -ef | grep nginx
# CentOS/RHEL 通常为 nginx 用户
mkdir -p /var/cache/nginx
chown -R nginx:nginx /var/cache/nginx
# Ubuntu/Debian 通常为 www-data 用户
# chown -R www-data:www-data /var/cache/nginx2. 配置 upstream 与缓存
将上述完整配置示例放入 nginx.conf。注意 upstream 块必须定义在 http 块内,且 proxy_pass 引用的名称需一致。自定义 proxy_cache_key 可防止因后端多节点导致的内容混淆。
3. 检查配置并重载
修改配置后务必先检查语法,避免启动失败:
nginx -t
nginx -s reload验证缓存生效
使用 curl 命令查看响应头中的 X-Cache-Status 字段。第一次请求通常显示 MISS,第二次请求相同 URL 应显示 HIT。
curl -I https://your-domain.com/static/image.jpg观察输出中是否包含 X-Cache-Status: HIT。如果一直是 MISS,检查错误日志:
tail -f /var/log/nginx/error.log常见错误包括权限 denied 或 upstream 连接失败。
缓存清除方案
Nginx 开源版默认不支持主动清除特定缓存文件,可采用以下方案:
- 手动清除:直接删除缓存目录下的文件,会导致短暂缓存失效。
rm -rf /var/cache/nginx/* - 版本控制:静态资源文件名带版本号(如 image.v1.jpg),更新时变更文件名,自然失效旧缓存。
- 第三方模块:若编译了 ngx_cache_purge 模块,可使用 purge 指令清除,但需确认环境支持。
常见风险与排查
1. 502 Bad Gateway:未定义 upstream backend 或后端服务不可达。检查 upstream 配置和后端健康状态。
2. 缓存碰撞:默认 cache key 可能忽略 Host 或 Scheme。在负载均衡环境下,务必显式配置 proxy_cache_key 包含 $host。
3. 响应头覆盖:location 块中的 add_header 会覆盖 server 块中的 header。若需保留原有头,需谨慎使用或合并配置。
4. 动态内容误缓存:切勿对登录态、个人中心等动态页面开启缓存,否则会导致严重的隐私泄露。务必通过 location 路径严格区分静态资源。
5. 磁盘空间耗尽:max_size 设置过大可能占满磁盘。建议配置监控告警,或设置 proxy_cache_path 的 inactive 参数自动清理冷数据。
参考来源
- Nginx 官方文档 - ngx_http_proxy_module: https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cache
- Nginx 官方文档 - proxy_cache_path: https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cache_path