为什么要分离
一个大促页面引用了 40 张图、8 个 CSS、12 个 JS——这些请求如果全打到 Tomcat,每个都占一个线程去做"读文件吐文件"的活,业务线程池被静态请求挤满,接口 RT 跟着遭殃。而 Nginx 处理静态文件走 sendfile:文件从磁盘直接进内核缓冲区再到网卡,不进用户态、不占应用线程,单机轻松几万 QPS。动静分离的本质:让贵的算力只干业务,便宜的活交给专业的。
root 与 alias 的大坑
location /static/ {
root /data/www; # 拼接规则:/data/www + /static/logo.png
} # 最终读 /data/www/static/logo.png
location /static/ {
alias /data/www/; # 替换规则:/static/ 整段换成 /data/www/
} # 最终读 /data/www/logo.png
#
# 记法:root 是"加上",alias 是"换成"
# 经典翻车:想用 alias 却写了 root(或反之),404 找半小时
# alias 末尾斜杠要对齐:/data/www/ 配 location /static/ ——注意两边都带静态资源的缓存策略
静态资源要跟浏览器配合:带指纹的文件名 + 长强缓存。构建工具输出的 app.a3f9c2.js 内容一变文件名就变,可以放心给一年缓存(expires 365d);而 index.html 是引用入口,必须不缓存或短缓存,否则用户拿到旧 HTML 引不到新资源。这套"入口不缓存、指纹长缓存"的组合拳,是前端发布不乱套的基石——呼应缓存系列里"给谁缓存、缓存多久"的思路。
目录安全
location /static/ {
alias /data/www/;
autoindex off; # 默认就是 off,别手贱打开
# autoindex on 会列目录:/static/ 直接展示全部文件——信息泄露
}
# 敏感文件一律封死
location ~* .(env|git|bak|sql|log)$ {
return 404;
}
# .env、.git/config、备份包被扫到就是数据泄露事故,全封掉最稳一份完整的动静分离 server
server {
listen 80;
server_name shop.example.com;
location ^~ /static/ { # ^~ 截断正则,静态优先(呼应 location 篇)
alias /data/www/static/;
expires 365d;
add_header Cache-Control "public, immutable";
}
location /uploads/ { # 用户上传:可读,但禁执行、限缓存
alias /data/uploads/;
expires 7d;
}
location / { # 其余全走应用
proxy_pass http://app_server;
proxy_set_header X-Real-IP $remote_addr;
}
}这个骨架能直接抄走改改上线。静态资源还有一半收益没拿到——压缩和缓存头,下一篇把它补齐。
评论 (0)