一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

Nginx 中 server 块如何实现不同目录映射不同后端

时间:2026-08-18 20:17:49 编辑:袖梨 来源:一聚教程网

Nginx 通过同一 server 块内多个 location 指令按路径前缀匹配并 proxy_pass 转发,实现同域名下不同目录精准分发;proxy_pass 结尾斜杠影响路径重写,多域名则用多个 server 块分别配置。

Nginx 通过 server 块 + location 指令组合,就能把同一域名下的不同路径(即不同目录)精准分发到不同后端服务。关键不在 server 块本身做目录映射,而是在一个 server 块里用多个 location 匹配路径前缀,再各自用 proxy_pass 转发。

同一 server 下按路径区分后端

一个 server 块监听某个端口和域名,内部用多个 location 规则识别请求路径,每个规则独立配置转发目标:

  1. location /api/ → 转发到 http://127.0.0.1:3000/
  2. location /admin/ → 转发到 http://127.0.0.1:8001/
  3. location /(根路径)→ 静态文件或主前端服务

示例配置:

server {listen 80;server_name example.com;# 静态资源或主站首页location / {root /var/www/frontend;try_files $uri $uri/ /index.html;}# API 接口统一走 /api/ 前缀location /api/ {proxy_pass http://127.0.0.1:3000/;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;}# 后台管理系统单独部署location /admin/ {proxy_pass http://127.0.0.1:8001/;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;}}

注意 proxy_pass 结尾的 /

  1. 写成 http://127.0.0.1:3000/,表示 /api/user → 转发为 /user
  2. 写成 http://127.0.0.1:3000(无尾斜杠),会原样带上 /api/user,后端容易 404

多个 server 块对应不同域名 + 各自根目录

如果不同“目录”实际是不同域名(如 a.example.comb.example.com),那就用多个 server 块,每个块用 server_name 匹配域名,并设置独立 rootproxy_pass

  1. server_name a.example.comroot /var/www/a/proxy_pass http://backend-a
  2. server_name b.example.comroot /var/www/b/proxy_pass http://backend-b

这种结构更清晰,适合完全隔离的站点。

路径重写与子路径兼容处理

某些后端不接受带前缀的路径(比如 /api/xxx 转过去变成 /xxx 才能识别),可用 rewrite 配合 proxy_pass

location /v1/ {rewrite ^/v1/(.*)$ /$1 break;proxy_pass http://127.0.0.1:9000;}

也可用 proxy_redirect 调整响应头中的跳转地址,避免后端返回的 Location 头暴露内网路径。

注意事项

  1. location 匹配遵循最长前缀优先原则,/api/v2/ 会优先进入 location /api/v2/ 而不是 /api/
  2. 若需精确匹配某路径(如只匹配 /health),用 location = /health
  3. 静态文件建议用 root + try_files,动态接口一律用 proxy_pass
  4. 所有 proxy_pass 后端地址必须带协议(http://https://),不能只写 localhost:3000

不复杂但容易忽略

热门栏目