最常用、最轻量的动静分离方式是用location按后缀匹配:静态资源由本地文件系统服务,动态请求转给后端应用服务器;需配置root路径、expires缓存、proxy_pass代理及安全规则,并注意匹配顺序与权限。

直接用 location 按后缀匹配,把静态资源交给本地文件系统服务,动态请求转给后端应用服务器——这是最常用、最轻量的动静分离方式。
匹配常见静态文件后缀
在 server 块内添加类似这样的配置:
location ~* \.(jpg|jpeg|png|gif|ico|bmp|webp)$ { root /data/static; expires 30d; add_header Cache-Control "public"; }location ~* \.(css|js|woff2?|ttf|eot|svg)$ { root /data/static; expires 7d; add_header Cache-Control "public, immutable"; }-
location ~* \.(html|htm)$ { root /data/static; }(可选,若 HTML 也静态托管)
注意:~* 表示不区分大小写的正则匹配;root 路径是文件实际存放位置(如 /data/static/image/logo.png 对应请求 /image/logo.png);expires 控制浏览器缓存时长,减少重复请求。
统一转发动态请求
所有未被上述规则捕获的请求,默认交给后端处理:
- 先定义 upstream(例如指向 Tomcat 或 Node.js):
upstream app_backend { server 127.0.0.1:8080; } - 再配置通用代理:
location / { proxy_pass http://app_backend; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; }
这个 location / 必须放在静态规则之后,因为 Nginx 按顺序匹配,优先使用最长、最具体的 location。
关键细节和避坑点
几个容易出错但影响明显的地方:
-
路径拼接逻辑:使用
root时,Nginx 会把匹配到的 URI 全路径拼到 root 后面;比如root /data/static;+ 请求/css/app.css→ 实际读取/data/static/css/app.css -
权限与目录结构:确保 Nginx worker 进程对
/data/static有读取权限;目录需真实存在,且文件路径要和 URL 路径一致 -
避免覆盖 index:如果用了
index index.html;,又同时配了location ~ \.html$,可能造成重复匹配或 404,建议静态 HTML 单独归入一个目录(如/pages/)并用路径前缀控制 -
禁止访问敏感文件:加一条安全规则防止泄露配置或源码:
location ~ /\.(conf|htaccess|ini|log|sh|env)$ { deny all; }
验证是否生效
改完配置后执行 nginx -t 测试语法,再 nginx -s reload 生效。验证方法:
- 访问
/js/main.js,响应头应含Cache-Control: public,状态码 200,且响应时间接近 0ms(说明走本地磁盘) - 访问
/api/user,响应头不应有Cache-Control: public,状态码应来自后端(如 200 或 500),开发者工具 Network 面板显示 Remote Address 是后端地址 - 尝试访问
/.git/config,应返回 403 Forbidden


















