nginx动静分离核心是静态资源由nginx直接读取返回、动态请求通过proxy_pass转发至后端;依赖location按后缀(如~*.(css|js)$)或路径前缀(如^~/static/)匹配,优先级高者先执行,并配合root、upstream、缓存头及透传请求头等配置确保正确分流与高效响应。

直接用 Nginx 把静态资源和动态请求分开处理,核心就两点:静态文件由 Nginx 自己读取返回,动态请求转给后端(比如 Tomcat、SpringBoot 或 Node.js);关键靠 location 规则匹配路径或后缀,再配合 root 和 proxy_pass 指令区分流向。
明确区分动静请求的匹配方式
静态资源通常按后缀或固定路径识别。Nginx 会优先匹配更具体的 location 块,所以要把静态规则写在动态规则前面:
- 按文件后缀匹配:例如
location ~* \.(css|js|png|jpg|gif|ico)$,加上~*表示忽略大小写,覆盖常见前端资源 - 按路径前缀匹配:例如
location /static/或location /assets/,适合把所有静态资源统一放在某个目录下 - 避免遗漏:HTML 文件常被误当动态内容,若前端是纯静态站点(如 Vue/React 打包产物),也应归入静态处理,可用
location / { try_files $uri $uri/ /index.html; }配合
静态资源由 Nginx 直接服务
匹配到静态请求后,Nginx 不转发,而是从本地磁盘读取并响应。需确保:
-
root路径设置正确,比如root /data/www;,那么请求/css/app.css就对应文件/data/www/css/app.css - 开启高效传输:加上
sendfile on;和tcp_nopush on;,减少系统调用开销 - 启用缓存头:例如
add_header Cache-Control "public, max-age=31536000, immutable";,让浏览器长期缓存不常变的资源 - 开启 Gzip 压缩:对
text/css、application/javascript等类型启用压缩,节省带宽
动态请求统一代理到后端服务
所有未被静态规则捕获的请求,默认交给后端应用处理:
- 用
location /匹配根路径及子路径,内部配置proxy_pass http://backend; - 定义 upstream 块管理后端地址,支持多实例与简单负载均衡:
upstream backend { server 127.0.0.1:8080; } - 透传关键请求头:
proxy_set_header Host $host;、X-Real-IP、X-Forwarded-For,确保后端能拿到真实客户端信息 - 设置合理超时:
proxy_connect_timeout 3;、proxy_read_timeout 30;,防止长连接拖慢整体响应
注意几个易错细节
配置看似简单,但线上容易出问题的地方集中在路径和头信息上:
-
proxy_pass结尾加不加/影响路径重写:写成proxy_pass http://backend/;会剥离匹配的前缀;不加斜杠则原样转发,容易导致 404 - 静态资源目录权限要放开,Nginx 工作进程(如 www-data 或 nginx 用户)必须有读取权限
- 如果后端依赖原始 Host 或协议(如生成 HTTPS 链接),务必通过
proxy_set_header显式传递X-Forwarded-Proto和Host - 上线前用
nginx -t检查语法,再nginx -s reload平滑重启,避免中断服务











