Nginx在HTTPS下缓存明文响应,需正确终止TLS、精细化设置cache_key(区分静态与用户态资源)、按敏感度分级缓存策略,并结合主动清理机制。

HTTPS 反向代理必须完成 TLS 终止
只有 Nginx 自己解密了请求,才能拿到原始响应去缓存。不能把加密流量直接透传后缓存——那是无效的。
需在 upstream 或 proxy_pass 所指后端为 HTTP 的前提下,在 server 块中监听 443 并配置 SSL:
- listen 443 ssl;
- ssl_certificate 和 ssl_certificate_key 指向你的证书与私钥
- 若后端也是 HTTPS(即 Nginx 作为中间代理再发 HTTPS 请求),则必须启用完整 SSL 校验:
proxy_ssl_verify on;proxy_ssl_trusted_certificate /path/to/ca-bundle.pem;proxy_ssl_name "backend.example.com";proxy_ssl_server_name on;proxy_ssl_session_reuse off;(防证书校验绕过)
缓存键(proxy_cache_key)必须体现 HTTPS 与用户上下文
默认的 $scheme$host$request_uri 在 HTTPS 站点中虽含 https,但若忽略 Cookie 或认证头,会导致用户 A 的私有数据被用户 B 命中。
- 静态资源(如
/static/app.js)可简化为:proxy_cache_key "$scheme$host$request_uri";(保留 scheme 防混合内容) - 带登录态的接口(如
/api/profile)必须加入身份标识:proxy_cache_key "$scheme$host$request_uri $cookie_sessionid $http_authorization"; - 用
map过滤无意义参数(如_t=123456),避免缓存碎片:map $args $clean_args { ~^(.*&)?_t=[^&]*(?:&.*)?$ $1; default $args; }
再写:proxy_cache_key "$scheme$host$request_uri $clean_args";
缓存策略要区分资源敏感等级
不能统一设 proxy_cache_valid 200 10m。应结合路径、状态码和业务含义动态控制:
安装并运行 Aperture(Lightning Labs 的 L402 闪电反向代理),用于创建 L402 付费墙、配置付费 API 端点、为其他代理托管付费内容或测试 L402 认证流程。
- 公开静态资源(
.js/.css/.png):proxy_cache_valid 200 365d;
配合:add_header Cache-Control "public, immutable"; - 用户专属动态接口(
/api/order):proxy_cache_valid 200 5m;
加上:proxy_ignore_headers Cache-Control;,再由后端返回Cache-Control: private, max-age=300,让 Nginx 尊重该语义 - 高敏操作(
/auth/logout、/api/payment/submit):
显式禁用:proxy_no_cache $http_pragma $http_authorization;
并配proxy_cache_bypass $http_pragma $http_authorization;
主动清理比等过期更实用
缓存自然失效无法应对价格更新、权限变更等业务事件。推荐两种方式:
- 启用
ngx_cache_purge模块,开放内网清理接口:location /purge { allow 127.0.0.1; deny all; proxy_cache_purge mycache $host$request_uri$is_args$args; } - 对关键页面(如用户首页),采用版本化缓存键:
定义set $cache_version "v2";,在proxy_cache_key中加入该变量;发布时更新变量值,实现整批失效

















