Nginx中应优先用location匹配静态资源路径或扩展名并本地服务,再将剩余请求代理至后端;静态匹配推荐alias配前缀路径、root配正则扩展名,动态代理需置后且配置关键header。

在 Nginx 中实现 HTTP 代理时,将静态资源(如 CSS、JS、图片等)与动态请求分离处理,是提升性能和降低后端压力的关键做法。核心思路是:让 Nginx 直接响应静态文件,不转发给上游应用服务器;而将非静态路径(如 /api/、/admin/)代理到后端服务。
明确静态资源路径特征
静态资源通常具有可预测的文件扩展名或固定路径前缀。Nginx 可通过 location 块匹配这些特征,优先拦截并本地处理。
- 常用扩展名匹配:
.js、.css、.png、.jpg、.woff2、.svg等 - 常见路径前缀:
/static/、/assets/、/images/、/dist/ - 注意:匹配顺序很重要,Nginx 按配置中 location 出现顺序或匹配精度(最长前缀、正则优先级)决定执行哪个块
配置静态资源本地服务
使用 location 匹配静态路径,并配合 root 或 alias 指向文件系统目录。推荐用 alias 处理带路径前缀的请求,避免路径拼接错误。
示例(服务 /static/ 下所有文件):
location /static/ {
alias /var/www/myapp/static/;
expires 1h;
add_header Cache-Control "public, immutable";
}说明:alias 会把匹配到的 /static/ 替换为指定目录,因此请求 /static/js/app.js 将映射到 /var/www/myapp/static/js/app.js。
代理动态请求到后端服务
对未被静态规则捕获的请求(尤其是 API 或页面路由),统一交给 upstream 或具体地址代理。建议用 location / 配合 proxy_pass,但需确保它放在静态规则之后,避免覆盖。
- 使用
proxy_pass http://backend;(backend 是已定义的 upstream) - 必须设置关键代理头:
proxy_set_header Host $host;、proxy_set_header X-Real-IP $remote_addr;、proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - 若后端依赖原始 URI(如 Spring Boot 的上下文路径),注意
proxy_pass末尾是否带斜杠——带斜杠会剥离匹配前缀,不带则保留
进阶:按扩展名精准分离(避免误判)
当静态资源散落在根路径(如 /app.css、/logo.png),无法靠路径前缀区分时,可用正则 location ~* \.(js|css|png|jpg|gif|ico|woff2|ttf|svg)$ 精确拦截。
注意点:
-
~*表示大小写不敏感正则匹配 - 该 location 优先级高于普通前缀匹配,但低于
=精确匹配和^~前缀终止匹配 - 需搭配
root(不是alias),因为正则 location 不支持alias的路径替换逻辑 - 示例:
location ~* \.(js|css|png|jpg|gif|ico|woff2|ttf|svg)$ { root /var/www/myapp/dist; expires 1h; }

















