proxy_cache_methods 本身不提供负载均衡功能,仅控制哪些HTTP方法可被缓存;负载均衡由upstream+proxy_pass实现,缓存加速需proxy_cache_path、proxy_cache等协同,其唯一作用是在启用缓存前提下声明允许走缓存的请求方法。

直接说结论:proxy_cache_methods 本身不提供负载均衡功能,它只是控制哪些 HTTP 方法能被缓存;所谓“高性能负载均衡加速”需靠 proxy_cache + upstream 组合实现,而 proxy_cache_methods 只是其中一环——它的作用是精准放开缓存权限,让特定非默认方法(如 POST)也能享受本地缓存带来的响应提速。
明确 proxy_cache_methods 的定位和边界
它不是负载均衡指令,也不参与请求分发。Nginx 的负载均衡由 upstream + proxy_pass 实现;缓存加速由 proxy_cache_path + proxy_cache + proxy_cache_valid 等协同完成。proxy_cache_methods 的唯一职责是:在缓存已启用的前提下,声明“允许哪些请求方法走缓存路径”。默认只认 GET 和 HEAD,因为它们安全、可重复、无副作用。
需要缓存 POST/PUT 等方法的典型场景
适用于内部系统中语义幂等、结果稳定的接口,例如:
安装并运行 Aperture(Lightning Labs 的 L402 闪电反向代理),用于创建 L402 付费墙、配置付费 API 端点、为其他代理托管付费内容或测试 L402 认证流程。
- 搜索服务:/api/v1/search?keyword=nginx → 改为 POST 提交复杂 JSON 查询体,但结果不变时可缓存
- 配置查询接口:POST /api/v1/config 获取环境配置,后端返回 Cache-Control: public, max-age=3600
- 报表预生成接口:固定参数的 POST 请求返回静态 HTML 或 JSON,内容小时级不变
安全启用 POST 缓存的关键配置项
仅加 proxy_cache_methods GET HEAD POST 是远远不够的,必须同步满足以下条件:
-
必须定义 proxy_cache_key 包含请求体:否则相同 URL 的不同 POST 请求会相互覆盖。推荐写法:
proxy_cache_key "$scheme$request_method$host$request_uri$request_body";
注意:$request_body 在某些情况下为空(如使用了 proxy_buffering off 或大请求体),此时需搭配 $content_length 或自定义变量兜底 -
后端响应必须显式声明可缓存:返回头中至少含
Cache-Control: public, max-age=300或X-Accel-Expires: 300;仅靠 proxy_cache_valid 不足以覆盖无响应头的后端 -
按 location 精细控制,避免全局放开:不要在 http 块写 proxy_cache_methods POST,应在具体 API 路径下启用,例如:
location /api/v1/search {<br> proxy_cache my_search_cache;<br> proxy_cache_methods GET HEAD POST;<br> proxy_cache_key "$scheme$request_method$host$request_uri$request_body";<br> proxy_cache_valid 200 302 5m;<br> proxy_pass http://search_upstream;<br>} -
禁用不适用路径的缓存:上传、支付、登录类接口一律不配 proxy_cache,或显式设
proxy_cache off;
不可缓存的方法与常见误区
OPTIONS、TRACE、CONNECT 永远无法被 proxy_cache 缓存,无论是否写进 proxy_cache_methods —— Nginx 内部硬编码跳过。另外要注意:
- 即使配置了 POST 缓存,浏览器和 CDN 通常不识别 POST 响应的缓存头,该缓存仅对 Nginx 本机有效(即客户端→Nginx→上游)
- 缓存 POST 响应不等于“负载均衡”,它减少的是 Nginx 到上游的请求数,upstream 内部节点仍需靠 least_conn、ip_hash 等机制做真实负载分发
- 若后端返回 Set-Cookie 或 Vary: Cookie,Nginx 默认不缓存(除非显式配置 proxy_ignore_headers)


















