Nginx动静分离核心是静态资源(如.js、.css、图片)由Nginx直接响应,动态请求(如/api/、/user/login)proxy_pass至后端;需通过location按后缀或前缀精确匹配,配合缓存与代理头优化。

用 Nginx 做动静分离,核心是让静态资源(如 JS、CSS、图片)绕过后端应用服务器,直接由 Nginx 响应;动态请求(如 /api/、/user/login)才转发给上游服务(如 Tomcat、Node.js、Python 应用)。这样能显著降低后端压力,提升整体响应速度和并发能力。
明确动静资源的判断依据
静态资源通常具备以下特征:文件路径有明确后缀(.js、.css、.png、.woff2)、不依赖服务端逻辑、可长期缓存;动态请求则多为无后缀路径(如 /api/v1/users)、含查询参数、需 Session 或数据库交互。Nginx 本身不识别业务语义,所以分离规则要靠 location 匹配路径或后缀来定义。
- 优先按后缀匹配静态文件(更稳定,不易误伤)
- 对 RESTful 接口等无后缀路径,统一约定前缀(如 /api/、/admin/)并 proxy_pass 到后端
- 避免用正则过度复杂化,简单精确匹配更高效、易维护
配置动静分离的核心 location 规则
在 server 块中,按匹配顺序从上到下写 location。Nginx 会优先使用最长前缀匹配或正则匹配(正则优先级高于前缀,但建议少用)。推荐结构如下:
- 根路径 /:设为默认代理,兜底处理所有未被静态规则捕获的请求
- 静态后缀组:用 location ~* \.(js|css|png|jpg|gif|ico|svg|woff2|ttf|eot)$ { ... },加 * 表示忽略大小写,内部用 root 或 alias 指向本地静态目录
- API 前缀路径:用 location ^~ /api/ { proxy_pass http://backend; },^~ 表示前缀匹配且不进入正则阶段,性能更好
- 如需区分管理后台,可单独配 location ^~ /admin/ { proxy_pass http://admin_backend; }
静态资源优化与缓存控制
仅分离还不够,要真正发挥静态优势,必须配合合理缓存策略:
- 在静态 location 块中添加 expires 1y;(强缓存),对带哈希值的文件(如 main.a1b2c3.js)可设永久缓存
- 加上 add_header Cache-Control "public, immutable"; 防止中间代理强制重验
- 若静态文件放在独立域名(如 static.example.com),可在该 server 块中统一配置,再通过 CNAME 解析指向同一台 Nginx
- 注意:root 和 alias 的行为不同——root 是拼接完整路径,alias 是替换匹配部分,配置错误会导致 404
动态请求的代理与关键头设置
转发到后端时,需透传真实客户端信息,否则后端拿不到 IP、协议、Host 等关键字段:
- 必设:proxy_set_header Host $host;(保持原始 Host)
- 必设:proxy_set_header X-Real-IP $remote_addr; 和 X-Forwarded-For $proxy_add_x_forwarded_for;
- 若站点启用了 HTTPS,加 proxy_set_header X-Forwarded-Proto $scheme;,方便后端生成正确跳转链接
- 建议开启 proxy_buffering on; 并适当调大 buffer(如 proxy_buffer_size 128k),避免小响应频繁刷写


















