发布日期
· 阅读约 3 分钟

静态资源很慢:Nginx 先开 sendfile/gzip 再谈 CDN

静态资源(JS/CSS/图片)经 Nginx 输出缓慢,或动静没有分开——先别急着上复杂 CDN。先确认请求是否命中静态 location,再打开传输与压缩相关开关,并用一次真实请求验收。

更系统的笔记见 Nginx 排障索引

你遇到的问题

现象更可能是
所有静态文件 TTFB 都高未走 sendfile / 压测打到错误机器
文本资源体积大未开 gzip/br
HTML 与 API 同慢动静未分离,静态也被动态链路拖住
只有图片慢未压缩/未改尺寸,或不该由源站扛全球流量

2 分钟诊断

curl -I https://你的域名/static/app.js
# 看 Content-Type、Content-Encoding、Cache-Control、是否被错误地 proxy_pass
  • 若静态 URL 进了上游 Node/Java,先改 location 分流
  • 若已是本地 root/alias,再查传输与压缩

解法(最小集)

location /static/ {
  alias /var/www/app/static/;
  sendfile on;
  tcp_nopush on;

  gzip on;
  gzip_comp_level 5;
  gzip_types text/css application/javascript application/json image/svg+xml;

  expires 7d;
  add_header Cache-Control "public";
}

原则:

  1. 动静分离/static/、带哈希的产物走文件服务;API 再 proxy_pass
  2. sendfile:减少用户态拷贝(注意与某些异步模块的组合)
  3. gzip:优先压文本;图片应在构建期优化,而不是靠 gzip 救 JPG
  4. 长缓存:只给带内容哈希的文件;HTML 入口保持短缓存

如何验证

  • curl -I 静态资源出现预期的 Cache-Control / Content-Encoding
  • 浏览器 Network:静态命中磁盘/CDN,不再每次都回动态上游
  • 关键 JS/CSS 体积或传输耗时下降

下一步

  1. 若用户全球分布,再把 hashed 静态挂到 CDN(见 CDN 文)。
  2. 限流/防刷见索引文「请求限制」。
  3. 接口 504 走 proxy_read_timeout

相关文章

浏览全部 →