动静分离是按请求行为(非物理位置)通过nginx的location匹配路径/后缀实现资源归类与分流:静态资源(如.jpg、/static/)由nginx直接响应,动态请求(如/api/、.jsp)proxy_pass转发至后端;关键在root/alias语义区别及proxy_set_header配置;带来释放后端连接、提升缓存命中、增强故障隔离三重收益;高并发时应演进至oss+cdn+upstream协同。

动静分离不是简单地把图片扔到 Nginx、把 JSP 交给 Tomcat,而是围绕请求生命周期做资源归类与路径分流——核心目标是让每类请求落到最擅长处理它的服务上,减少无效转发和资源争抢。
动静资源怎么分?看路径和后缀,不看文件放哪
区分动静的关键依据是请求行为,不是物理位置。Nginx 通过 location 指令匹配 URL 特征来判断:
- 以 .jpg、.png、.css、.js、.html 等结尾的请求,默认视为静态资源,由 Nginx 直接读取本地文件系统或 NFS/CDN 返回
- 以 /api/、/admin/、*.jsp、*.php、*.do 等为特征的请求,认定为需后端计算或数据库交互,必须 proxy_pass 转发给 Tomcat、PHP-FPM 或 Node.js
- 固定前缀如 /static/、/res/、/images/ 也可作为静态路由标识,适合统一管理 CDN 回源或灰度发布
Nginx 配置两个关键点:root/alias 和 proxy_pass
静态资源路径配置容易出错,重点在 root 和 alias 的语义差异:
- root /data; + location /img/ { ... } → 实际找的是 /data/img/xxx.jpg
- alias /data/static/; + location /img/ { ... } → 实际找的是 /data/static/xxx.jpg(注意 alias 会“替换掉” location 匹配部分)
- 动态转发用 proxy_pass http://backend;,记得加 proxy_set_header Host $host; 和 X-Real-IP,确保后端能拿到真实客户端信息
动静解耦带来三重实际收益
这套设计不只是为了“看起来合理”,它直接解决高并发场景下的真实瓶颈:
- 释放后端连接数:Tomcat 线程池不再被大量图片请求占满,可专注处理业务逻辑,QPS 提升通常达 3–5 倍
- 提升缓存命中率:Nginx 对静态资源支持 expires 1y、etag、gzip_static,浏览器和中间 CDN 可长期复用
- 故障隔离能力增强:Tomcat 宕机时,HTML 页面、JS、CSS 仍可正常加载,用户至少能看到基础界面,不会白屏
进阶建议:从单机分离走向分布式协同
当 PV 超过百万级,单一 Nginx 处理所有静态资源会成为新瓶颈。此时应自然演进:
- 静态资源迁移到 OSS 或对象存储,Nginx 只作回源代理,降低磁盘 IO 与带宽压力
- 搭配 CDN 使用,将 /images/、/static/ 等路径配置为 CDN 加速域名,实现全球边缘节点就近响应
- 动态接口层引入 upstream + keepalive,配合健康检查,自动剔除异常 Tomcat 实例,保障服务连续性











