Skip to content

反向代理服务器实现路径转发

在同一域名下通过不同路径路由到多个服务(如 www.example.com/auth 到 5050 端口、www.example.com/user 到 5051 端口),核心是通过反向代理服务器(如 Nginx、HAProxy 或云负载均衡器)实现路径转发。以下是详细的实现方案,以最常用的 Nginx 为例:

一、方案概述

通过 Nginx 配置反向代理,将不同路径的请求转发到对应的服务端口: • 客户端请求 www.example.com/auth/api/v1/xx → Nginx 代理到 www.example.com:5050/api/v1/xx(服务A)。

• 客户端请求 www.example.com/user/api/v1/xx → Nginx 代理到 www.example.com:5051/api/v1/xx(服务B)。

二、前置条件

  1. 安装 Nginx:确保服务器已安装 Nginx(若未安装,可通过 apt install nginx 或 yum install nginx 安装)。
  2. 服务端口开放:确认服务A(5050)和服务B(5051)已在服务器上运行,且防火墙(如 ufw 或 firewalld)开放了这些端口(或通过 Nginx 代理间接暴露)。
  3. 域名解析:确保 www.example.com 已解析到当前服务器的公网 IP。

三、Nginx 核心配置

修改 Nginx 的虚拟主机配置文件(通常位于 /etc/nginx/conf.d/default.conf 或 /etc/nginx/sites-available/default),添加路径路由规则。

示例配置

nginx
server {
    listen 80;  # 监听 HTTP 端口(若需 HTTPS,改为 443 并配置 SSL)
    server_name www.example.com;  # 绑定的域名

    # 路由规则 1:匹配 /auth 路径,代理到服务A(5050端口)
    location /auth/ {
        proxy_pass http://127.0.0.1:5050/;  # 注意末尾的 / 会移除路径前缀 /auth
        proxy_set_header Host $host;  # 保留原始请求头中的 Host
        proxy_set_header X-Real-IP $remote_addr;  # 传递客户端真实 IP
    }

    # 路由规则 2:匹配 /user 路径,代理到服务B(5051端口)
    location /user/ {
        proxy_pass http://127.0.0.1:5051/;  # 末尾的 / 移除路径前缀 /user
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }

    # 可选:默认路由(若未匹配到 /auth 或 /user,返回 404)
    location / {
        return 404;
    }
}

四、配置参数详解

配置项 说明

listen 80 监听 HTTP 端口(若需 HTTPS,改为 listen 443 ssl; 并添加 ssl_certificate 和 ssl_certificate_key)。

server_name 绑定的域名(如 www.example.com),支持通配符(如 *.example.com)。

location /auth/ 匹配以 /auth/ 开头的请求路径(如 /auth/api/v1/xx)。

proxy_pass 指定代理目标地址(http://127.0.0.1:5050/ 表示本地 5050 端口的服务)。

proxy_set_header 传递原始请求头(如 Host 和客户端 IP),避免后端服务获取到错误的请求源信息。

末尾的 / 关键!proxy_pass 末尾的 / 会移除匹配的路径前缀(如 /auth/),确保后端服务接收正确路径(如 /api/v1/xx)。

五、HTTPS 配置(可选)

若需要 HTTPS 加密,需申请 SSL 证书(如 Let’s Encrypt 免费证书),并修改 Nginx 配置:

nginx
server {
    listen 443 ssl;  # 监听 HTTPS 端口
    server_name www.example.com;

    # SSL 证书配置(替换为你的证书路径)
    ssl_certificate /path/to/fullchain.pem;  # 证书链文件
    ssl_certificate_key /path/to/privkey.pem;  # 私钥文件

    # 强制 HTTP 跳转 HTTPS(可选)
    if ($scheme != "https") {
        return 301 https://$host$request_uri;
    }

    # 路由规则(同 HTTP 部分)
    location /auth/ {
        proxy_pass http://127.0.0.1:5050/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }

    location /user/ {
        proxy_pass http://127.0.0.1:5051/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

六、验证与测试

  1. 检查 Nginx 配置是否正确:
    执行 nginx -t 验证配置文件语法(若提示 syntax is ok 则配置正确)。

  2. 重启 Nginx 生效:
    systemctl reload nginx # 或 service nginx reload(旧版本)

  3. 测试路由效果:
    • 访问 http://www.example.com/auth/api/v1/test → 应转发到服务A的 5050 端口。

    • 访问 http://www.example.com/user/api/v1/test → 应转发到服务B的 5051 端口。

七、其他实现方式

除了 Nginx,还可以使用以下工具实现类似功能:

  1. HAProxy

HAProxy 是另一种高性能反向代理工具,配置示例如下(haproxy.cfg):

cfg
frontend http_front
    bind *:80
    default_backend http_back

backend http_back
    # 匹配 /auth 路径,转发到 5050 端口
    acl is_auth path_beg /auth/
    use_backend auth_server if is_auth

    # 匹配 /user 路径,转发到 5051 端口
    acl is_user path_beg /user/
    use_backend user_server if is_user

backend auth_server
    server server1 127.0.0.1:5050 check

backend user_server
    server server1 127.0.0.1:5051 check
  1. 云负载均衡器(如 AWS ALB、阿里云 SLB)

云厂商提供的负载均衡器支持可视化配置路径路由: • AWS ALB:创建目标组(Target Group)分别关联服务A(5050)和服务B(5051),然后在监听规则中配置路径条件(如 /auth* 转发到服务A组)。

• 阿里云 SLB:在“转发规则”中添加路径匹配(如 /auth/*),并绑定对应的服务实例端口。

八、注意事项

  1. 路径前缀处理:
    • 若后端服务需要保留原始路径前缀(如 /auth/api/v1/xx),需移除 proxy_pass 末尾的 /(但可能导致路径重复,需谨慎)。

    • 示例(保留前缀):

    nginx
      location /auth/ {
          proxy_pass http://127.0.0.1:5050/auth/;  # 不移除前缀
      }
  2. 服务健康检查:
    建议配置 Nginx 或负载均衡器的健康检查(如 proxy_next_upstream 或 check interval),确保后端服务不可用时自动切换或返回错误。

  3. 跨域问题(CORS):
    若前端应用与后端服务不同域,需在后端服务中配置 CORS 头(如 Access-Control-Allow-Origin: *),或通过 Nginx 添加:

    nginx
    location /auth/ {
        proxy_pass http://127.0.0.1:5050/;
        add_header Access-Control-Allow-Origin *;
    }

通过以上方案,可以轻松实现同一域名下多路径到多服务的路由转发。Nginx 是最通用的选择,适合大多数场景;云负载均衡器则适合需要高可用和可视化管理的企业级场景。

Last updated: