参考资料

  1. Nginx Logrotate:日志归档配置详细说明以及案例
  2. Nginx重启 linux
  3. Nginxgzip开启压缩及相关配置详细说明以及案例
  4. nginx配置
  5. nginx配置反向代理
  6. nginx配置文件在哪里
  7. nginx重启
  8. nginx -e详细说明以及案例

nginx反向代理缓存静态文件

nginx反向代理缓存静态文件

在反向代理架构中,nginx 除了承担负载均衡和 SSL 终结任务外,另一个极具价值的用途是缓存静态文件。图片、CSS、JavaScript、字体等资源通常变动较少,却被客户端反复请求。若每次请求都穿透到后端服务器,会白白消耗应用进程的 CPU 与内存。通过在 nginx 上建立缓存层,可将静态文件直接存储在代理服务器本地,当同一资源再次被请求时,nginx 直接返回缓存副本,无需访问后端。

核心原理

nginx 的 `proxy_cache` 机制以缓存键(cache key)区分请求,默认使用完整的 URL 作为键。首次请求时,nginx 将后端响应写入缓存目录;后续匹配到相同键的请求,直接读取缓存响应。静态文件缓存的关键在于:识别出可缓存的响应,并给予合理的过期时间。

推荐方案

下面是一个可运行的反向代理缓存配置。假设上游服务运行在 `127.0.0.1:8080`,需要缓存的静态资源路径为 `/static/`、`/images/`、`/assets/`。

1. 定义缓存路径与策略

在 `http` 块内(通常位于 `nginx.conf`)添加: nginx proxy_cache_path /var/cache/nginx/static_cache levels=1:2 keys_zone=static_cache:50m inactive=30d max_size=10g;

  • `/var/cache/nginx/static_cache`:缓存文件存放目录,需确保磁盘空间充足。
  • `levels=1:2`:生成两级子目录,避免单个目录文件过多。
  • `keys_zone=static_cache:50m`:设置共享内存区域,用于存储缓存键和元数据,50m 约可支撑几十万个键。
  • `inactive=30d`:文件在 30 天内未被访问则被清理,即使尚未过期。
  • `max_size=10g`:缓存目录上限,超出后 nginx 会依据最少使用算法自动淘汰。

2. 配置静态资源缓存规则

在 `server` 或 `location` 块中启用缓存: nginx location ^~ /static/ { proxy_pass http://127.0.0.1:8080;

启用缓存区

proxy_cache static_cache;

为不同资源设置缓存有效期

proxy_cache_valid 200 304 24h; proxy_cache_valid 404 1m;

缓存键包含 URI 和必要的参数

proxy_cache_key $scheme$proxy_host$request_uri;

如果后端返回 Set-Cookie,则不缓存

proxy_cache_bypass $http_authorization; proxy_no_cache $cookie_session;

转发给后端的请求头

proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } 如果你的静态文件通过统一前缀暴露,也可以使用正则匹配: nginx location ~* \.(png|jpg|jpeg|gif|css|js|woff2?|svg|ico)$ { proxy_pass http://127.0.0.1:8080; proxy_cache static_cache; proxy_cache_valid 200 304 7d; add_header X-Cache-Status $upstream_cache_status; } `add_header X-Cache-Status $upstream_cache_status` 会在响应头中显示 `HIT`、`MISS` 或 `EXPIRED`,便于排查缓存是否生效。

3. 调整静态文件过期响应头

如果后端能够返回带 `Cache-Control` 或 `Expires` 的响应头,nginx 默认会尊重这些头。您也可以覆盖它们的有效期: nginx location ~* \.(css|js|jpg|png)$ { proxy_pass http://127.0.0.1:8080; proxy_cache static_cache; proxy_cache_valid 200 30d; expires 30d; } `expires 30d` 会同时影响客户端浏览器的缓存,使浏览器在有效期内不再向 nginx 请求资源。如只想让 nginx 缓存而客户端每次验证资源,可设置 `expires -1` 或省略该指令。

4. 主动清理缓存

静态文件发布新版本后,旧的缓存必须失效。推荐做法是重命名资源文件(如给 JS 文件名加哈希值),避免依赖手动清理。但若确需清理,可结合 ngx_cache_purge 模块实现,或直接删除缓存文件: bash find /var/cache/nginx/static_cache -type f -delete 删除后重启 nginx 不会清空缓存目录,仅需保证新请求能正常写回缓存。

备选方案

如果静态文件由前端服务动态生成,但文件名固定且不常变化,也可使用 `open_file_cache` 直接缓存打开的文件描述符,减少系统调用开销。该方案适用于 nginx 直接提供本地文件,而非反向代理模式。 对于纯静态资源,更高效的方案是迁移至对象存储(如阿里云 OSS、腾讯云 COS)或 CDN,在此基础上再配合 nginx 的反向代理缓存,可进一步降低回源流量。

验证方法

修改配置后,执行以下命令检查语法: bash nginx -t 无报错后重载配置: bash nginx -s reload 验证重点:

  • 首次访问某静态文件,响应头 `X-Cache-Status` 为 `MISS`。
  • 再次访问同一文件,变为 `HIT`。
  • 检查后端服务日志,确认第二次请求未到达上游。
  • 观察缓存目录大小是否稳定,以及响应体是否完整。

注意事项

  • 绝不缓存动态页面:登录后的用户信息页、购物车等响应一旦被代理缓存,会造成串号或信息泄露。务必用 `proxy_no_cache` 识别带 `Cookie` 或 `Authorization` 的请求。
  • 合理设计缓存键:如果静态资源会根据 `Accept-Encoding` 返回不同内容,则需将 `$http_accept_encoding` 加入缓存键,否则可能给部分客户端发送错误压缩格式。
  • 缓存目录权限:nginx 工作进程需要有写入权限,通常属主应为 `nginx` 用户或 `www-data`。
  • 磁盘空间监控:设置 `max_size` 并定期监控磁盘使用率,防止缓存膨胀挤占日志分区。
  • 回滚方式:如需紧急停止缓存,注释掉 `proxy_cache` 指令后执行 `nginx -s reload` 即可。缓存目录中的旧文件不影响直接访问。

nginx 反向代理缓存静态文件,是投入产出比极高的优化手段。合理配置后,不仅减轻了应用服务器压力,也显著缩短了用户等待时间。建议先在测试环境中验证缓存命中与更新策略,再逐步推向生产。 如有进一步需求,随时告诉我。

AIGEO优化摘要

AI可读摘要:nginx反向代理缓存静态文件 在反向代理架构中,nginx 除了承担负载均衡和 SSL 终结任务外,另一个极具价值的用途是缓存静态文件。图片、CSS、JavaScript、字体等资源通常变动较少,却被客户端反复请求。若每次请求都穿透到后端服务器,会白白消耗应用进程的 CPU 与内存。通过在 nginx 上建立缓存层,可将静态文件直接存储在代理服务器本地,当...
常见问题:
nginx反向代理缓存静态文件主要讲了什么?

nginx反向代理缓存静态文件 在反向代理架构中,nginx 除了承担负载均衡和 SSL 终结任务外,另一个极具价值的用途是缓存静态文件。图片、CSS、JavaScript、字体等资源通常变动较少,却被客户端反复请求。若每次请求都穿透到后端服务器,会白白消耗应用进程的 CPU 与内存。通过在 nginx 上建立缓存层,可将静态文件直接存储在代理服务器本地,当...

nginx反向代理缓存静态文件适合哪些人参考?

适合正在了解文章信息、进行对比筛选,或希望快速获得结论的用户参考。

阅读nginx反向代理缓存静态文件时应重点看哪些内容?

建议重点关注标题、摘要、正文说明、图片资料和更新时间。

AIGEO评分:95/100
作者:王壹杰
时间:2026-09-09 13:17:44
来源:https://bt.ciilii.com/