反向代理服务器实现路径转发
在同一域名下通过不同路径路由到多个服务(如 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)。
二、前置条件
- 安装 Nginx:确保服务器已安装 Nginx(若未安装,可通过 apt install nginx 或 yum install nginx 安装)。
- 服务端口开放:确认服务A(5050)和服务B(5051)已在服务器上运行,且防火墙(如 ufw 或 firewalld)开放了这些端口(或通过 Nginx 代理间接暴露)。
- 域名解析:确保 www.example.com 已解析到当前服务器的公网 IP。
三、Nginx 核心配置
修改 Nginx 的虚拟主机配置文件(通常位于 /etc/nginx/conf.d/default.conf 或 /etc/nginx/sites-available/default),添加路径路由规则。
示例配置
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 配置:
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;
}
}
六、验证与测试
检查 Nginx 配置是否正确:
执行 nginx -t 验证配置文件语法(若提示 syntax is ok 则配置正确)。重启 Nginx 生效:
systemctl reload nginx # 或 service nginx reload(旧版本)测试路由效果:
• 访问 http://www.example.com/auth/api/v1/test → 应转发到服务A的 5050 端口。• 访问 http://www.example.com/user/api/v1/test → 应转发到服务B的 5051 端口。
七、其他实现方式
除了 Nginx,还可以使用以下工具实现类似功能:
- HAProxy
HAProxy 是另一种高性能反向代理工具,配置示例如下(haproxy.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
- 云负载均衡器(如 AWS ALB、阿里云 SLB)
云厂商提供的负载均衡器支持可视化配置路径路由: • AWS ALB:创建目标组(Target Group)分别关联服务A(5050)和服务B(5051),然后在监听规则中配置路径条件(如 /auth* 转发到服务A组)。
• 阿里云 SLB:在“转发规则”中添加路径匹配(如 /auth/*),并绑定对应的服务实例端口。
八、注意事项
路径前缀处理:
• 若后端服务需要保留原始路径前缀(如 /auth/api/v1/xx),需移除 proxy_pass 末尾的 /(但可能导致路径重复,需谨慎)。• 示例(保留前缀):
nginxlocation /auth/ { proxy_pass http://127.0.0.1:5050/auth/; # 不移除前缀 }
服务健康检查:
建议配置 Nginx 或负载均衡器的健康检查(如 proxy_next_upstream 或 check interval),确保后端服务不可用时自动切换或返回错误。跨域问题(CORS):
若前端应用与后端服务不同域,需在后端服务中配置 CORS 头(如 Access-Control-Allow-Origin: *),或通过 Nginx 添加:nginxlocation /auth/ { proxy_pass http://127.0.0.1:5050/; add_header Access-Control-Allow-Origin *; }
通过以上方案,可以轻松实现同一域名下多路径到多服务的路由转发。Nginx 是最通用的选择,适合大多数场景;云负载均衡器则适合需要高可用和可视化管理的企业级场景。