Nginx动静分离的核心是按规则提前划分静态与动态请求归属:静态资源(如CSS/JS/图片)由Nginx直接响应或交CDN处理,动态请求则准确路由至后端服务,避免路径劫持。

核心在于让静态资源请求不经过后端应用服务器,而是由 Nginx 直接响应或交由专用节点/CDN 处理;同时确保动态请求准确路由到对应服务,且其静态路径不被错误劫持。关键不是“避免冲突”,而是“提前划分归属”。
明确静态与动态的边界规则
静态内容必须有可识别的特征,Nginx 才能按规则分流。常用方式有两种:
-
按文件后缀匹配:在
location中用正则匹配常见静态类型,例如:location ~* \.(css|js|png|jpg|gif|ico|woff2|svg)$ { expires 1y; add_header Cache-Control "public, immutable"; }
这类请求直接由 Nginx 读取本地磁盘或返回 404,不走proxy_pass。 -
按路径前缀隔离:为不同后端服务分配专属静态路径,比如:
主服务用/static/,限流服务用/numberLimit/static/;
然后在 Nginx 中分别配置:location /static/ { alias /var/www/main/static/; }location /numberLimit/static/ { alias /var/www/limit/static/; }
修复多服务共用 /static 导致的路径劫持
这是最典型的冲突场景——多个 Flask/Django 服务都生成 /static/xxx.css,但 Nginx 只有一个 location /static/ 规则,结果全被转发到默认后端(如主服务)。
- 不要依赖后端框架自动生成的
/static/路径,改用带前缀的静态 URL,例如 Flask 中设置:app.config['STATIC_URL_PATH'] = '/numberLimit/static',再配合url_for('static', filename='...')就会输出带前缀的链接。 - 在 Nginx 中为每个服务的静态路径单独定义
location,并用alias指向各自物理目录,避免使用root+ 路径拼接,防止路径越界。 - 如果无法修改后端代码,可用
sub_filter在响应 HTML 中重写静态链接(慎用,仅作兜底)。
动静分离 + 负载均衡的协同配置
负载均衡组(upstream)只应承接动态请求;静态请求要么本地处理,要么转发给静态专用集群或 CDN。
- 把静态资源统一放在独立目录(如
/data/static/),Nginx 用location /static/直接服务,不进 upstream。 - 动态请求走负载均衡,例如:
upstream api_backend { server 192.168.1.10:5000; server 192.168.1.11:5000; }location /api/ { proxy_pass http://api_backend; } - 若需对静态资源也做负载(如多台静态服务器),应另建 upstream,并用
location显式指向它,和动态 upstream 完全隔离。
验证与调试要点
光配对不行,得确认浏览器实际请求是否落到预期位置:
- 打开浏览器开发者工具 → Network 标签,看每个 CSS/JS 请求的 Headers → Request URL 和 Response → X-Upstream(可自定义添加该 header 标识上游节点)。
- 检查 Nginx access log,确认静态请求是否出现
"GET /static/xxx.js HTTP/1.1" 200(说明本地处理),而非"GET /static/xxx.js HTTP/1.1" 404或转发日志。 - 用
curl -I https://domain.com/static/test.css查看返回头中是否有Content-Type和Cache-Control,验证是否由 Nginx 原生响应。


















