文档首页> 技术教程> 动静分离:把静态资源从应用里摘出来

动静分离:把静态资源从应用里摘出来

发布时间:2026-04-10 17:23        更新时间:2026-04-10 22:40
应用进程接到一个请求,走完路由、会话、连接池一整套流程,最后只是吐回一张 logo 图片——动静分离解决的就是这种浪费。把静态资源从应用里摘出来交给 Nginx 直接返回,应用只处理动态请求,两边各干各的。 一、用 location 拆分 ``` server { listen 80; server_name example.com; location ~* \.(css|js|jpg|png|gif|webp|woff2)$ { root /data/www/static; expires 30d; } location / { proxy_pass http://127.0.0.1:8080; } } ``` 静态请求由 Nginx 直接读盘返回,其余全部转给应用。路径对应关系:请求 /img/logo.png 会读到 /data/www/static/img/logo.png。静态 location 里补两条实用配置:try_files $uri =404 让路径拼错时返回明确的 404 而不是穿透到应用;access_log off 关掉静态访问日志,日志量少一大截,需要审计时再开。 二、root 与 alias 的区别 两个指令都指定磁盘路径,行为不同: ``` location /static/ { root /data/www; # /static/a.css 读 /data/www/static/a.css } location /static/ { alias /data/www/; # /static/a.css 读 /data/www/a.css } ``` root 把 location 路径原样拼在后面,alias 把 location 路径整个替换掉。用 alias 时结尾斜线务必写全,少了就拼出错位路径——这是动静分离上线后 404 的第一大原因。正则里的 ~* 修饰符表示后缀大小写不敏感,用户手输大写 JPG 的地址也能命中规则。 三、过期头怎么配 带指纹的资源(app.3f9c2.js 这类文件名)过期可以给足: ``` expires 1y; add_header Cache-Control "public, immutable"; ``` 没带指纹的资源给短一些,比如 expires 1h。过期头让浏览器本地缓存生效,二次访问根本不发请求,这是静态分离最大的收益来源,比省下的那点 CPU 还值钱。 四、收益与边界 收益有三块:应用进程从静态请求里解放出来,动态接口容量上升;Nginx 读静态文件的吞吐远高于应用框架,页面加载变快;缓存命中后流量成本下降。摘出去之后应用的负载曲线会明显干净,容量规划也更容易做。边界也要清楚:单机内做动静分离不解决磁盘 IO 上限。资源量继续涨,下一步是把 /static/ 指向对象存储或 CDN,Nginx 保留一层回源即可平滑过渡。上传入口要单独校验文件类型,静态目录只放确认安全的资源,防止别有用心的人传脚本上来。 上线后用 curl -I 抽查几个静态地址,确认 Cache-Control 与 Content-Type 都对,再放量。