Nginx通过proxy_pass实现动静分离,即静态资源(如CSS、JS、图片)由Nginx直接响应,动态请求(如/api/、.php)转发至后端服务器,并需配置location规则、超时控制、请求头透传及缓存优化。

使用 Nginx 的 proxy_pass 实现动静分离,核心是让静态资源(如 CSS、JS、图片)由 Nginx 直接响应,而动态请求(如 PHP、Java、Node.js 接口)转发给后端应用服务器。这样既能减轻后端压力,又能利用 Nginx 高效的静态文件处理和缓存能力。
明确动静资源路径规则
动静分离的前提是清晰区分两类请求。常见做法是按 URL 路径约定:
- 以
/static/、/images/、/css/、/js/等开头的请求视为静态资源 - 以
/api/、/admin/、根路径/(非静态后缀)或带特定后缀(如.php、.jsp)的请求视为动态请求 - 也可通过文件后缀判断:匹配
\.(jpg|png|gif|css|js|woff2|ttf|svg)$的请求直接由 Nginx 处理
配置 location 块实现分流
在 server 块中用多个 location 指令分别处理静态与动态请求:
- 静态路径用
location ^~ /static/或正则location ~* \.(js|css|png|jpg|gif)$,内部用root或alias指向本地文件目录 - 动态路径用
location /api/或location /(兜底),配合proxy_pass http://backend;转发到 upstream 定义的服务集群 - 注意
proxy_pass末尾是否带路径:如proxy_pass http://backend/;(结尾有/)会剥离匹配前缀;写成proxy_pass http://backend;(无/)则完整转发原始 URI
补充关键优化项
仅转发还不够,需配套设置提升稳定性和性能:
- 为 proxy_pass 添加超时控制:
proxy_connect_timeout 5s;、proxy_read_timeout 30s;、proxy_send_timeout 30s; - 透传真实客户端信息:
proxy_set_header X-Real-IP $remote_addr;、proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;、proxy_set_header Host $host; - 对静态资源启用缓存:
expires 1h;或add_header Cache-Control "public, max-age=3600"; - 避免静态 location 意外落入动态转发:确保静态规则优先级更高(如用
^~前缀或靠前定义),或用location = /favicon.ico单独处理高频小文件
验证与调试技巧
部署后快速确认是否生效:
- 用
curl -I http://yourdomain.com/static/logo.png查看响应头是否有Server: nginx且无X-Powered-By,说明 Nginx 直接返回 - 用
curl -I http://yourdomain.com/api/user查看响应头是否含后端标识(如X-Powered-By: Express或Server: Apache-Coyote/1.1) - 检查 Nginx 错误日志:
tail -f /var/log/nginx/error.log,关注upstream timed out或no live upstreams类报错 - 临时在 proxy_pass 块中加
return 200 "forwarded to backend\n";可快速验证路由逻辑










