Nginx 应直接托管静态资源并分级设置缓存:带哈希的 JS/CSS/图片等用 expires 1y; add_header Cache-Control "public, immutable";无哈希通用资源设 expires 7d;HTML 入口禁用强缓存,配 expires -1; add_header Cache-Control "no-cache, must-revalidate, max-age=0";需验证响应头及 location 匹配有效性。

Python 应用(如 Django、Flask)部署在 Nginx 后,静态资源(JS/CSS/图片/字体等)通常由 Nginx 直接服务,而非经 Python 进程处理。这时缓存策略应完全交由 Nginx 控制,而不是在 Python 框架里设响应头——因为那会绕过 Nginx 的高效文件服务,还可能被覆盖或忽略。
明确静态资源由 Nginx 直接托管
确保 Python 应用的静态文件已收集并放在 Nginx 可访问的目录中(例如 /var/www/myapp/static/),并在 Nginx 配置中用 location + alias 或 root 显式指向:
-
Django 常用方式:运行
python manage.py collectstatic,输出到/var/www/myapp/static/ -
Nginx 配置示例:
location /static/ {<br> alias /var/www/myapp/static/;<br> expires 1y;<br> add_header Cache-Control "public, immutable";<br>}
按文件稳定性分级设置 expires 和 Cache-Control
不能所有静态资源都设 1 年。关键看 URL 是否带内容指纹(哈希):
-
带哈希的资源(如
main.a1b2c3.js,style.e4f5d6.css):路径变化即内容变化,可放心设长期缓存:expires 1y;add_header Cache-Control "public, immutable"; -
无哈希但更新较少的文件(如
favicon.ico,robots.txt,manifest.json):设 7 天较稳妥:location = /favicon.ico { expires 7d; add_header Cache-Control "public"; } -
HTML 入口(如
/index.html或由 Python 渲染的模板页):必须禁用强缓存,避免版本滞留:location ~* \.(html|htm)$ { expires -1; add_header Cache-Control "no-cache, must-revalidate, max-age=0"; }
验证缓存头是否真实生效
配置写完不等于生效。必须检查实际响应头:
立即学习“Python免费学习笔记(深入)”;
- 用
curl -I https://yoursite.com/static/js/app.8e9f2a.js查看是否返回:Cache-Control: public, immutable, max-age=31536000Expires: [未来日期] - 打开浏览器开发者工具 → Network → 找对应资源,确认状态码是 200 (from memory cache) 或 200 (from disk cache),而非 304 或 200(网络请求)
- 若没看到缓存头,常见原因:文件路径不匹配 location 规则、静态文件权限不足(Nginx 用户不可读)、或配置未重载(执行
nginx -t && nginx -s reload)
避免常见陷阱
Python 部署场景下容易踩的坑:
-
不要在 Django/Flask 中重复设置 Cache-Control:比如 Django 的
cache_page装饰器对静态文件无效,反而可能干扰 Nginx 缓存逻辑 -
不要把静态资源代理给 Python 进程处理:例如用
location /static/ { proxy_pass http://127.0.0.1:8000; }—— 这会让 Nginx 失去直接读文件+加缓存头的能力,性能大幅下降 -
注意 Gzip 和 Brotli 压缩与缓存兼容性:启用
gzip on;或brotili on;不影响缓存,但需确保压缩后仍能正确添加Cache-Control头(Nginx 默认支持)



















