网站动静分离部署的核心思路是让Nginx直接响应图片、CSS、JS等静态文件并配置缓存过期时间,动态请求才转发到后端应用服务器,部署步骤围绕目录规划、location匹配和缓存规则三部分展开。
网站动静分离怎么部署:先分清静态请求与动态请求
动静分离不是把静态文件单独放到另一台服务器,而是把请求类型拆开处理,静态请求通常以扩展名结尾,.jpg、.png、.css、.js、.webp、.woff2,动态请求则是 /api/、/login、/cart 这类依赖后端逻辑的路径,Nginx 做为入口,看到静态扩展名直接读磁盘返回,看到动态路径就 proxy_pass 到后端 PHP、Java 或 Node 服务。
静态请求和动态请求怎么区分
- 静态请求:文件路径固定、内容变化少、可以安全缓存
- 动态请求:依赖登录态、实时数据、接口计算,不能随便缓存
- 分离依据:先看 URL 扩展名,再看路径前缀,
/static/、/assets/归静态,/api/、/admin/归动态
企业官网的图片、电商站的商品图、资讯站的文章配图,都属于典型静态请求,高并发时后端不再被这些重复请求拖住,是动静分离最直接的好处。
动静分离和CDN对比的核心区别
动静分离在源站内部完成,CDN 在边缘节点完成,两者解决的是不同层级的问题,行业共识认为,动静分离解决源站资源类型拆分,CDN 解决边缘节点分发,两者叠加使用效果更稳定,多数生产环境先做动静分离,再把静态目录接入 CDN,源站只保留回源副本。
nginx动静分离配置步骤:从目录规划到location匹配
第一步:规划静态资源目录
假设站点根目录为 /data/www/site,静态资源统一放在 /data/www/site/static 下,目录规划清晰后,location 匹配不会乱,后面接 CDN 也只需要同步这一个目录,不要把图片散落在上传目录、主题目录和插件目录里,否则规则会越来越难维护。
第二步:编写Nginx核心配置
核心配置如下:
server {
listen 80;
server_name www.example.com;
root /data/www/site;
loc
ation ~ .(jpg|jpeg|png|gif|webp|svg|css|js|woff2|ico)$ {
root /data/www/site/static;
expires 30d;
add_header Cache-Control "public, max-age=2592000";
access_log off;
try_files $uri =404;
}
location /api/ {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
location ~ 表示不区分大小写的正则匹配,扩展名列表可以按实际需求增减,静态 location 里的 root 要写静态资源实际根目录,不要无脑用 alias,两者路径拼接逻辑不同,混用容易引发 404。access_log off 可以减少静态请求日志写入,降低磁盘 IO。
第三步:验证并重载
改完配置先执行:
nginx -t systemctl reload nginx
或者用 nginx -s reload。nginx -t 会直接指出语法错误,不会中断现有服务,生产环境不要直接重启,重载即可平滑生效。
动静分离缓存规则配置:给静态资源加过期时间
缓存规则是动静分离收益最大的地方,配错会让用户拿到旧文件,或者让浏览器频繁回源,核心指令是 expires 和 add_header Cache-Control。
expires与Cache-Control设置
expires 30d 告诉浏览器资源 30 天后过期,Nginx 会自动生成 Expires 头。add_header Cache-Control "public, max-age=2592000" 更现代,优先级高于 Expires哈希的 CSS/JS 可以使用 immutable,表示文件永不变化,浏览器不用重新验证。
不同资源缓存时间参考
| 资源类型 | 建议缓存时间 | 原因 |
|---|---|---|
| HTML页面 | no-cache或max-age=0 | 页面更新频繁,需协商缓存 |
| CSS/JS(带哈希) | max-age=31536000, immutable | 文件名变化后产生新URL,可长缓存 |
| 图片/字体 | 30天到一年 | 改动频率较低 |
| 用户头像 | 短缓存或no-cache | 可能频繁更换 |
对应配置可以这样写:
location ~ .(css|js)$ {
root /data/www/site/static;
add_header Cache-Control "public, max-age=31536000, immutable";
try_files $uri =404;
}
location ~ .(jpg|jpeg|png|gif|webp|svg|ico)$ {
root /data/www/site/static;
expires 30d;
add_header Cache-Control "public, max-age=2592000";
try_files $uri =404;
}
location ~ .html$ {
add_header Cache-Control "no-cache, must-revalidate";
}
HTML 不建议长缓存,即使做了静态化,也可以用 no-cache 让浏览器先问服务器是否更新,业内专家指出,缓存规则配置错误比不配置更危险,因为错误长缓存会让用户拿到旧版页面。
缓存规则常见误区
- 对 HTML 直接设置一年缓存,发布后用户看不到新页面
- 对未加哈希的 CSS/JS 用
immutable,改完文件浏览器不请求新版本 - 把
Cache-Control值写成no-cache, max-age=2592000,两个指令互相矛盾 - 只配
expires不配Cache-Control,不同浏览器行为可能不一致
北京网站动静分离部署价格一般多少与成本构成
北京地区网站动静分离部署价格一般多少,没有统一报价,多数情况分两类:自己用云服务器配置,只有服务器和带宽成本,Nginx 部署本身不额外收费;找第三方运维配置,按改动复杂度和服务器数量计费,市场报价差异较大,中小网站更常见的做法是买一台北京地域的云服务器,把静态目录独立出来,再用 CDN 分担图片流量。
成本主要花在带宽和对象存储,而不是部署动作,如果后端已经是按量付费的数据库或负载均衡,动静分离不会显著增加费用,反而能降低源站 CPU 和带宽压力,不要为“部署”这个动作单独花高价,真正值钱的是后续缓存规则调优和故障排查。
高并发场景下动静分离怎么做才稳
静态资源独立域名
使用 static.example.com 这种独立域名承载静态资源,可以避免浏览器携带主站 Cookie,Cookie 通常有几百字节,每个静态请求都带着会浪费上行带宽,独立域名后,静态请求头更小,Nginx 处理更快。
配合sendfile与gzip
sendfile on;
tcp_nopush on;
location /static/ {
gzip on;
gzip_types text/css application/javascript image/svg+xml;
expires 30d;
}
sendfile 让内核直接传输文件,减少用户态和内核态之间的数据拷贝。gzip 对文本类静态资源压缩,图片和已压缩字体不需要重复压缩。
高频资源交给CDN
北京地域源站到全国用户的物理距离不同,高并发时单台 Nginx 带宽容易打满,将静态目录接入 CDN 后,边缘节点直接命中,源站压力明显下降,源站只保留回源副本,CDN 缓存规则可以和 Nginx 的 Cache-Control 头保持一致。
高并发下,同一个静态文件是否命中缓存,直接决定 Nginx 能否抗住流量,多数情况下,静态资源命中率越高,源站压力越小,响应时间越短。
动静分离部署的收益最终落在缓存规则上,把扩展名匹配、目录规划、缓存头三件事对齐,Nginx 就能替后端挡住大部分重复请求,高并发场景下这套方法仍然稳定。
网站动静分离部署常见问题
网站动静分离部署后静态资源404怎么排查?
先看请求路径是否拼错,location 里的 root 和 alias 行为不同,用 Nginx 错误日志定位:tail -f /var/log/nginx/error.log,确认静态文件是否真的在 root 指定目录下,URL 为 /static/img/logo.png,而 root 写成 /data/www/site/static,实际查找路径会变成 /data/www/site/static/static/img/logo.png,路径重复一层导致 404,把 root 改为 /data/www/site/ 即可,或者改用 alias。
nginx动静分离缓存规则多久更新一次合适?
看资源命名方式,带内容哈希的 CSS/JS 可以设置一年长缓存,文件名变了自然请求新文件;不带哈希的资源建议 30 天以内,发布前手动清理 CDN 或加版本号,HTML 页面保持 no-cache,不要长缓存。
动静分离和CDN对比哪个更省服务器带宽?
CDN 更省源站带宽,因为边缘节点直接命中,动静分离主要省源站 CPU 和并发连接,带宽还是从源站出去,生产环境通常先做动静分离,再把静态目录接入 CDN,两层叠加后源站带宽占用会明显下降。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/646277.html





