Nginx多虚拟主机应统一缓存配置:SSL会话缓存设于http块,共享static_cache;用map按host精细化控制静态资源缓存策略;禁用冗余日志与rewrite,改用try_files提升性能。

缓存层不是“加得越多越快”,而是要让多个虚拟主机共享同一套缓存资源,避免各自为政带来的内存膨胀和管理混乱。核心思路是:统一定义、按需复用、精细控制。
统一配置 SSL 会话缓存
HTTPS 站点若每个 server 块都单独写 ssl_session_cache builtin:1000,不仅效率低,还会让每个 worker 进程重复加载私有缓存结构。正确做法是:
- 把
ssl_session_cache shared:SSL:10m和ssl_session_timeout 4h放到http块顶层 - 所有 HTTPS
server块只需保留listen 443 ssl http2和证书路径(SNI 支持下可共用通配符证书) - 10MB 共享缓存约支持 4 万个活跃 TLS 会话,足够数百个轻量站点共用
合并静态资源缓存策略
纯静态站点(如文档页、营销页、前端 SPA)无需各自定义缓存规则。可通过以下方式降维管理:
- 在
http块统一设置proxy_cache_path,指定一个全局缓存区,例如:proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=static_cache:50m max_size=5g inactive=1h; - 用
map指令按$host匹配缓存开关或过期时间,避免为每个域名写独立location - 对 HTML 文件设短缓存(
proxy_cache_valid 200 302 10m),对 CSS/JS/图片设长缓存(1h或1y)
关闭冗余日志与调试型缓存指令
看似中立的日志和缓存相关配置,在海量 server 场景下会变成隐形内存杀手:
- 禁用
gzip_vary on,除非明确对接 CDN 且其要求响应头带Vary: Accept-Encoding - 移除所有
log_not_found on、access_log /path custom_format等非必需日志行;统一在http块设access_log off,仅对关键域名单独开启 - 不启用
underscores_in_headers on,减少请求头解析开销;Nginx 默认忽略带下划线的 header,无需额外处理
用 try_files 替代 rewrite 实现轻量缓存路由
重写规则(尤其是含正则的 rewrite)每次匹配都要编译和执行,增加 CPU 和内存压力。静态服务应优先走 try_files:
- 将
rewrite ^/(.*)\.html$ /$1 permanent;改为try_files $uri.html $uri/ =404; - 配合
error_page 404 = @fallback+location @fallback实现兜底逻辑,比嵌套 if 更稳定高效 - 删除所有未使用的
location ~ \.php$、if ($args ~ ...)等易触发运行时解析的块


















