LOGO 首页 OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 技术文档 其他文档  
 
网站管理员

一文吃透Nginx转发配置:正向跳转、反向代理、负载均衡全实战

admin
2026年7月18日 23:35 本文热度 50

一文吃透 Nginx 转发配置

正向跳转 · 反向代理 · 负载均衡 全实战

从踩坑到通透 · 所有配置均可线上直接复用

▲ Nginx 高性能代理服务器 - 现代架构核心网关

一、前言:为什么 Nginx 转发是运维必备核心能力

在 Web 服务架构中,Nginx 早已不只是静态资源服务器。请求转发是其落地业务最核心的能力。日常开发运维中,下面这些场景全部依赖 Nginx 转发能力实现:

 

🌐 域名跳转:旧域名迁移至新域名,301永久重定向,SEO友好

🔒 HTTPS 强制跳转:全站 HTTP 自动升级 HTTPS,一行配置搞定

🔀 接口统一入口:前后端分离场景下,/api 接口集中转发到后端

🛡️ 隐藏后端端口:外部只暴露 80/443,后端 8080 端口对外不可见

⚖️ 多服务负载分担:流量分摊到多台服务器,避免单点瓶颈

🔄 老旧地址迁移:旧路由平滑迁移新路由,不影响已收录搜索引擎

 

但很多开发者配置转发时常踩坑:

⚠️ proxy_pass 末尾斜杠歧义(全网最高发坑 #1)

⚠️ 请求头丢失 → 后端获取不到真实 IP → 鉴权失败

⚠️ location 路径匹配错乱 → 转发 404 找不到服务

⚠️ 跳转死循环 → HTTP→HTTPS→HTTP 无限重定向

⚠️ 跨域 CORS 失效 → 前端请求被浏览器拦截

⚠️ POST 请求转发后变成 GET → 表单数据丢失

 

本文从零梳理 Nginx 三大转发类型,拆解核心指令、匹配规则、全网高频场景配置 + 避坑指南,所有配置均可线上直接复用。

 

二、分清 Nginx 三大转发类型(核心区分)

全网 90% 转发问题,都是分不清三种转发类型。先理清概念,再写配置,事半功倍。

▲ Nginx 三大转发类型架构全览图

 

类型

工作原理

适用场景

核心指令

🔁 正向重定向

Nginx 通知浏览器重新访问新地址,地址栏 URL 改变

域名迁移、HTTP→HTTPS强跳

return / rewrite

🔀 反向代理

客户端只见 Nginx,内网转发给后端,地址栏不变

前后端分离、隐藏端口、统一网关

proxy_pass

⚖️ 负载均衡

反向代理拓展,流量均分至多个后端节点

集群业务、高可用、流量削峰

upstream + proxy_pass

 

 

三、必备前置知识:转发两大核心规则

📌 3.1 location 路由匹配优先级(决定转发命中规则)

转发全部依托 location 匹配 URL,优先级从高到低固定排序,配置必须遵守顺序:

🥇 =(精确匹配):优先级最高,完全相等才匹配

🥈 ^~(前缀匹配):前缀匹配成功后不再匹配正则,推荐接口转发使用

🥉 ~ 或 ~*(正则匹配):~ 区分大小写,~* 不区分,优先级低于精确匹配

🏅 无前缀(普通前缀):优先级最低,常用于根路径兜底

💡 避坑提醒:接口转发优先使用 ^~ 前缀匹配,避免正则路由抢占匹配,导致转发错乱!

⚡ 3.2 proxy_pass 末尾斜杠歧义(全网最高发坑)

这是新手转发 404 第一原因!直接记结论,永远不要凭感觉写:

  nginx — 无斜杠示例(路径完整保留)

  # 无斜杠:携带 location 匹配前缀一起转发

  location /api/ {

      proxy_pass http://127.0.0.1:8080;

      # 访问 /api/user → 转发后端 /api/user

  }

  nginx — 有斜杠示例(前缀被截断)

  # 有斜杠:截断 location 匹配前缀,只转发剩余路径

  location /api/ {

      proxy_pass http://127.0.0.1:8080/;

      # 访问 /api/user → 转发后端 /user(/api/ 被截断)

  }

✅ 口诀:proxy_pass 加斜杠 = 截断前缀;不加斜杠 = 路径完整传入后端

 

四、类型一:正向重定向转发(return / rewrite 实战)

正向重定向由 Nginx 通知客户端浏览器重新发起请求。浏览器地址栏 URL 会发生改变,共消耗两次 HTTP 请求。

▲ 正向重定向工作原理 — 浏览器地址栏 URL 发生改变

🚀 4.1 return 指令(简单跳转首选,性能最优)

语法:return 状态码 跳转地址;  |  状态码:301 永久重定向(SEO友好)  /  302 临时重定向(实时跳转)

 

🌐 场景 1:全站 HTTP 强制跳转 HTTPS(生产通用配置)

这是生产环境必备配置。所有 HTTP 流量强制升级到 HTTPS,301 永久重定向利于 SEO 收录更新。

  nginx — HTTP 强制跳转 HTTPS

  server {

      listen 80;

      server_name www.test.com test.com;

   

      # 301 永久跳转,搜索引擎收录自动更新 HTTPS

      return 301 https://$host$request_uri;

  }

✅ 效果验证:浏览器访问 http://www.test.com 将自动跳转到 https://www.test.com,地址栏 URL 变更

🔗 场景 2:旧域名跳转新域名(域名改版必用)

域名改版、品牌升级后,旧域名流量需要无缝迁移到新域名,301 保留 SEO 权重传递。

  nginx — 旧域名跳转新域名

  server {

      listen 80;

      server_name old-domain.com www.old-domain.com;

   

      # 旧域名所有流量跳转新域名

      return 301 https://www.new-domain.com$request_uri;

  }

📄 场景 3:单页面旧地址跳转新地址

  nginx — 单页面地址跳转

  location = /old.html {

      return 302 https://www.test.com/new.html;

  }

   

  # 说明:= 精确匹配,只有 /old.html 才触发跳转

  # 302 临时重定向适合 A/B 测试、临时活动页

🔧 4.2 rewrite 指令(复杂正则路径跳转)

适用于批量路径改写、参数保留跳转。flag 标识说明:

🔚 last:终止当前匹配,继续匹配新 location(内部跳转)

🛑 break:终止所有 rewrite,不再匹配

↩️ redirect:302 临时重定向,地址栏变更

📌 permanent:301 永久重定向,地址栏变更

 

📦 场景 4:批量旧路由 /api/* 跳转 /v2/api/*(接口版本迁移)

  nginx — rewrite 批量路径迁移

  location / {

      # 正则捕获 /api/ 后面的路径部分

      rewrite ^/api/(.*)$ /v2/api/$1 permanent;

      # 示例:/api/user/list → 301 跳转 /v2/api/user/list

  }

⚠️ 避坑:rewrite 的正则规则若写错会导致死循环!务必用 nginx -t 校验后再 reload

 

五、类型二:反向代理转发(业务最常用,全文核心)

反向代理是 Nginx 最核心的转发能力。客户端只见 Nginx,Nginx 在内网将请求转发给后端服务,浏览器地址不变,用户完全无感知。

📋 5.1 反向代理标准头部套件(所有转发场景直接复制)

所有反向代理转发,必须配置此标准头部套件,否则后端无法获取客户端真实 IP、请求域名、协议,业务鉴权、日志统计会失效:

  nginx — 反向代理标准头部套件(必加)

  # =====================================================

  # Nginx 反向代理标配头部 —— 所有 proxy_pass 场景通用

  # =====================================================

   

  # 传递请求域名(Host)

  proxy_set_header Host              $host;

   

  # 传递客户端真实 IP(重要!不加则后端看到的是 127.0.0.1)

  proxy_set_header X-Real-IP         $remote_addr;

   

  # 传递代理链路 IP,适配多层 Nginx 转发

  proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for;

   

  # 传递前端请求协议 http/https

  proxy_set_header X-Forwarded-Proto $scheme;

   

  # 超时优化,防止转发超时断连

  proxy_connect_timeout  60s;

  proxy_read_timeout     60s;

  proxy_send_timeout     60s;

⚠️ 高频坑:忘加 X-Real-IP 请求头 → 后端获取 IP 始终是 127.0.0.1 → 限流、IP黑名单全部失效!

⚡ 5.2 场景 1:全站转发(Nginx 做端口暴露层)

适用:后端单服务,Nginx 只做端口暴露,所有请求移交后端处理。

  nginx — 全站反向代理配置

  server {

      listen 80;

      server_name api.test.com;

   

      location / {

          proxy_pass http://127.0.0.1:8080;

   

          # 粘贴标准头部

          proxy_set_header Host              $host;

          proxy_set_header X-Real-IP         $remote_addr;

          proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;

          proxy_set_header X-Forwarded-Proto $scheme;

          proxy_connect_timeout  60s;

          proxy_read_timeout     60s;

      }

  }

✅ 效果:外部访问 http://api.test.com:80 → 转发 127.0.0.1:8080,后端端口对外不可见

🏗️ 5.3 场景 2:路径差异化转发(前后端分离经典配置)

这是企业最常见的部署模式:静态资源 Nginx 本地处理,/api 接口转发 Java/Node 后端,/admin 转发后台管理服务。

  nginx — 前后端分离多路径转发配置

  server {

      listen 80;

      server_name www.test.com;

   

      # ① 静态资源本地直接返回,不走代理(性能最优)

      location ~* \.(png|jpg|js|css|html|ico|woff)$ {

          root /usr/local/nginx/html;

          expires 7d;     # 浏览器缓存7天

      }

   

      # ② API 接口转发,保留 /api/ 前缀(无斜杠)

      location ^~ /api/ {

          proxy_pass http://127.0.0.1:8080;

          proxy_set_header Host              $host;

          proxy_set_header X-Real-IP         $remote_addr;

          proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;

          proxy_set_header X-Forwarded-Proto $scheme;

      }

   

      # ③ 后台管理,截断 /admin/ 前缀转发(有斜杠)

      location ^~ /admin/ {

          proxy_pass http://127.0.0.1:8090/;  # 末尾有斜杠!截断前缀

          proxy_set_header Host              $host;

          proxy_set_header X-Real-IP         $remote_addr;

      }

  }

路径规则

静态资源 → Nginx本地 | /api/* → :8080 | /admin/* → :8090

斜杠说明

/api/ proxy_pass 无斜杠 → 转发路径保留 /api/ 前缀

斜杠说明

/admin/ proxy_pass 有斜杠 → 截断 /admin/ 前缀,只传后续路径

优先级

静态资源正则 ~* 优先级低于 ^~ 前缀匹配,请求不会抢占

 

🔌 5.4 场景 3:WebSocket 长连接转发(即时通讯专属)

普通 HTTP 代理不支持 WebSocket 长连接,需额外升级协议头。适用于 IM 聊天室、实时数据推送等业务。

  nginx — WebSocket 长连接转发配置

  location ^~ /ws/ {

      proxy_pass http://127.0.0.1:9000/ws/;

      proxy_set_header Host   $host;

      proxy_set_header X-Real-IP $remote_addr;

   

      # ===== WebSocket 专属协议升级配置 =====

      proxy_http_version 1.1;                        # 必须 HTTP/1.1

      proxy_set_header Upgrade    $http_upgrade;     # 协议升级标识

      proxy_set_header Connection "upgrade";         # 保持长连接

   

      # WebSocket 超时建议设长一点

      proxy_read_timeout 3600s;   # 1小时无消息不断开

  }

⚠️ 必须加 proxy_http_version 1.1 + Upgrade + Connection,缺一不可!否则 WebSocket 握手失败

🌍 5.5 场景 4:跨域转发(Nginx 统一解决跨域,无需改后端代码)

前端项目部署在 www.test.com,接口在 api.test.com,会产生跨域问题。在 Nginx 配置 CORS 响应头,一次性解决所有跨域,后端代码零改动。

  nginx — 跨域统一处理配置

  location ^~ /api/ {

      proxy_pass http://127.0.0.1:8080;

      proxy_set_header Host              $host;

      proxy_set_header X-Real-IP         $remote_addr;

   

      # ===== 跨域响应头配置 =====

      add_header Access-Control-Allow-Origin  *  always;  # 允许所有域名(生产可指定域名)

      add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS;

      add_header Access-Control-Allow-Headers *;

   

      # 预检请求(OPTIONS)直接 200 放行,不转发后端

      if ($request_method = OPTIONS) {

          return 200;

      }

  }

✅ 效果:浏览器跨域请求不再被拦截,OPTIONS 预检请求直接返回200,接口正常调用

 

六、类型三:负载均衡转发(多节点集群转发)

负载均衡基于反向代理拓展,使用 upstream 模块定义后端服务池,结合 proxy_pass 实现流量分发,支持加权、故障熔断、会话绑定。

▲ Nginx 加权负载均衡 — 多节点分流转发架构

⚖️ 6.1 基础加权负载均衡(生产最常用)

weight 权重越大,分配流量越多。适配高低配置服务器混合集群,按能力分流。

  nginx — 加权负载均衡配置

  # ① 定义后端服务池

  upstream backend_api {

      server 192.168.1.10:8080 weight=5;          # 高配服务器,承接 50% 流量

      server 192.168.1.11:8080 weight=3;          # 中配服务器,承接 30% 流量

      server 192.168.1.12:8080 weight=2;          # 低配服务器,承接 20% 流量

      server 192.168.1.13:8080 backup;            # 备用节点,主节点全宕机才启用

  }

   

  # ② 引用服务池

  server {

      listen 80;

      server_name api.test.com;

   

      location / {

          proxy_pass http://backend_api;          # 指向 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;

      }

  }

✅ 效果:请求按 5:3:2 比例分配到三台服务器,:13 备用节点正常情况不参与分流

🧠 6.2 进阶负载均衡策略

根据业务场景选择合适的负载策略:

📌 ip_hash(会话保持):同一客户端 IP 固定访问同一后端,解决登录 Session 丢失问题

📊 least_conn(最少连接):分发至当前连接数最少的服务器,均衡长连接场景压力

🎯 默认轮询 Round Robin:按权重轮流分配,最简单高效,短连接 API 接口首选

🔧 max_fails + fail_timeout:自动故障熔断,失败 N 次后暂时剔除节点,超时后重试

 

  nginx — ip_hash + 健康检查配置

  upstream backend_api {

      ip_hash;    # 开启会话保持,同IP固定访问同一服务器

   

      # max_fails=2: 连续失败2次标记为不可用

      # fail_timeout=30s: 30秒内不再转发,30秒后重试

      server 192.168.1.10:8080 max_fails=2 fail_timeout=30s;

      server 192.168.1.11:8080 max_fails=2 fail_timeout=30s;

      server 192.168.1.12:8080 max_fails=2 fail_timeout=30s;

  }

⚠️ ip_hash 与 backup 不可同时使用!ip_hash 启用后,backup 节点配置会被忽略

📊 三种负载策略对比速查

策略

适用场景

关键配置

轮询(默认)

无状态 REST API、短连接接口

weight=N

ip_hash

有状态业务(Session登录)

ip_hash;

least_conn

长连接、大文件下载

least_conn;

 

 

七、高频故障排查 + 避坑汇总(运维自查清单)

以下是生产环境中最常见的 Nginx 转发问题,按照频率排序,每条都附带原因分析和解决方案:

▲ Nginx 配置调试与故障排查工作流程

❌ 故障 1:转发后接口返回 404

【原因】排查顺序:① proxy_pass 末尾斜杠是否正确 → ② location 前缀是否匹配到正确路径 → ③ 后端服务是否已启动 → ④ 防火墙是否放行内网端口

【解决】核心口诀:proxy_pass 加斜杠截断前缀,不加斜杠保留路径。先用 curl 127.0.0.1:8080 直接访问后端确认服务存活

❌ 故障 2:后端获取客户端 IP 始终是 127.0.0.1

【原因】原因:Nginx 未配置 X-Real-IP 请求头转发,后端收到的 remote_addr 是 Nginx 本机地址

【解决】解决:在 proxy_pass 块内加入 proxy_set_header X-Real-IP $remote_addr; 后 reload 立即生效

❌ 故障 3:跳转死循环(浏览器报 ERR_TOO_MANY_REDIRECTS)

【原因】原因:HTTPS 转发给后端,后端程序再次跳转 HTTPS,或 rewrite 规则形成闭环

【解决】解决:后端识别 X-Forwarded-Proto 头,当其值为 https 时不再二次跳转。Nginx 侧检查 rewrite 规则是否有循环

❌ 故障 4:POST 转发后变成 GET 请求,表单数据丢失

【原因】原因:使用 301/302 redirect,浏览器重定向时会将 POST 请求改为 GET

【解决】解决:复杂业务用 proxy_pass 反向代理,不用 rewrite redirect。如必须重定向,使用 307(临时)/308(永久)状态码保留 POST 方法

❌ 故障 5:WebSocket 连接建立后瞬间断开

【原因】原因:未配置 proxy_http_version 1.1 和 Upgrade/Connection 头部,代理强制关闭了长连接

【解决】解决:参考场景3的 WebSocket 配置,必须加三行专属配置,且 proxy_read_timeout 建议设置为 3600s

❌ 故障 6:跨域 CORS 依然报错,已加 add_header 无效

【原因】原因:后端接口也返回了 Access-Control 响应头,两个头部冲突导致浏览器拒绝

【解决】解决:Nginx 加 add_header ... always; 的 always 参数,并让后端移除重复的 CORS 头部,只保留 Nginx 侧统一处理

 

🔧 7.7 配置校验命令(修改转发后必执行)

  bash — Nginx 配置验证与调试命令

  # 1. 校验配置语法,有错误会明确提示行号

  nginx -t

   

  # 2. 平滑重启,不中断现有请求

  nginx -s reload

   

  # 3. 查看 Nginx 错误日志(排查转发失败原因)

  tail -100f /var/log/nginx/error.log

   

  # 4. 测试单个接口转发是否通(在服务器上直接 curl)

  curl -v http://127.0.0.1:8080/api/test

 

八、全文总结:转发选型极简口诀

记住这四条口诀,90% 的转发场景可以做到开箱即用:

🔁  地址栏需要变更、域名迁移:用 return 301/302 正向重定向

🔀  浏览器地址不变、内网转发接口:用 proxy_pass 反向代理,必带标准请求头

⚖️  多台服务器分流:搭配 upstream 做负载均衡,按需选 轮询/ip_hash/least_conn

  写配置先定斜杠、先定 location 匹配规则:减少 80% 转发报错

 

 

九、附录:全网通用转发模板(直接复制改 IP/域名即用)

📋 9.1 通用反向代理模板

  nginx — 通用反向代理模板

  # =====================================================

  # Nginx 通用反向代理转发模板

  # 使用方法:替换「你的域名」和「后端IP:端口」即可

  # =====================================================

  server {

      listen 80;

      server_name 你的域名;

   

      # 静态资源本地服务(可选)

      location ~* \.(png|jpg|gif|ico|css|js|woff|woff2)$ {

          root /usr/local/nginx/html;

          expires 30d;

      }

   

      # 接口转发(路径完整保留)

      location ^~ /api/ {

          proxy_pass http://后端IP:端口;

   

          # === 标准头部套件 ===

          proxy_set_header Host              $host;

          proxy_set_header X-Real-IP         $remote_addr;

          proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;

          proxy_set_header X-Forwarded-Proto $scheme;

   

          # === 超时配置 ===

          proxy_connect_timeout  60s;

          proxy_read_timeout     60s;

          proxy_send_timeout     60s;

      }

  }

📋 9.2 通用负载均衡模板

  nginx — 负载均衡通用模板

  # =====================================================

  # Nginx 负载均衡通用模板

  # =====================================================

  upstream my_backend {

      # 选择一种策略(取消注释其中一行):

      # ip_hash;        # 会话保持(登录类业务)

      # least_conn;     # 最少连接(长连接业务)

      # 默认不写 = 加权轮询(API接口首选)

   

      server 192.168.1.10:8080 weight=5 max_fails=2 fail_timeout=30s;

      server 192.168.1.11:8080 weight=3 max_fails=2 fail_timeout=30s;

      server 192.168.1.12:8080 weight=2 max_fails=2 fail_timeout=30s;

      server 192.168.1.13:8080 backup;  # 备用节点

  }

   

  server {

      listen 80;

      server_name api.test.com;

   

      location / {

          proxy_pass http://my_backend;

          proxy_set_header Host              $host;

          proxy_set_header X-Real-IP         $remote_addr;

          proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;

          proxy_set_header X-Forwarded-Proto $scheme;

          proxy_connect_timeout  60s;

          proxy_read_timeout     60s;

      }

  }

📋 9.3 HTTP 强跳 HTTPS + 负载均衡完整生产配置

  nginx — 完整生产级 HTTPS + 负载均衡配置

  # =====================================================

  # 完整生产级配置:HTTP → HTTPS + 负载均衡

  # =====================================================

   

  # 后端服务池

  upstream app_servers {

      least_conn;

      server 192.168.1.10:8080 max_fails=2 fail_timeout=30s;

      server 192.168.1.11:8080 max_fails=2 fail_timeout=30s;

  }

   

  # HTTP → HTTPS 强跳

  server {

      listen 80;

      server_name www.yoursite.com;

      return 301 https://$host$request_uri;

  }

   

  # HTTPS + 负载均衡

  server {

      listen 443 ssl;

      server_name www.yoursite.com;

   

      ssl_certificate     /etc/nginx/ssl/cert.pem;

      ssl_certificate_key /etc/nginx/ssl/cert.key;

      ssl_protocols       TLSv1.2 TLSv1.3;

   

      # 静态资源

      location ~* \.(png|jpg|css|js)$ {

          root /usr/local/nginx/html;

          expires 7d;

      }

   

      # API 负载均衡

      location ^~ /api/ {

          proxy_pass http://app_servers;

          proxy_set_header Host              $host;

          proxy_set_header X-Real-IP         $remote_addr;

          proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;

          proxy_set_header X-Forwarded-Proto $scheme;

          proxy_connect_timeout  60s;

          proxy_read_timeout     120s;

      }

  }

 


阅读原文:点击这里


该文章在 2026/7/18 23:35:23 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2026 ClickSun All Rights Reserved  粤ICP备13012886号-9  粤公网安备44030602007207号