在 Nginx 中实现基于域名的七层负载均衡,核心是在 http 块中定义不同的 upstream 后端池,并在 server 块中通过 server_name 匹配域名,最后利用 proxy_pass 将请求转发至对应的 upstream。
核心要点:该方案适用于多域名共用同一 Nginx 入口且需分流至不同业务集群的场景。配置前需确保域名解析已指向 Nginx IP,且后端服务端口存活。
- 关键配置:upstream 定义后端地址,server_name 匹配域名,proxy_pass 指定转发池。
- 风险控制:必须配置默认 server 兜底,防止未绑定域名请求转发错乱。
- 验收标准:修改配置后执行语法检查,并通过 curl 携带 Host 头验证转发路径。
核心配置示例
以下是一个完整的配置片段,展示了 upstream 定义与 server 块嵌套的正确结构。请根据实际业务 IP 和域名修改相应字段:
http {
# 定义 Web 业务后端池
upstream web_pool {
server 192.168.1.10:8080;
server 192.168.1.11:8080;
}
# 定义 API 业务后端池
upstream api_pool {
server 192.168.1.20:8080;
server 192.168.1.21:8080;
}
# Web 域名配置
server {
listen 80;
server_name www.example.com;
location / {
proxy_pass http://web_pool;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
# API 域名配置
server {
listen 80;
server_name api.example.com;
location / {
proxy_pass http://api_pool;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
# 默认兜底配置,防止非法域名访问
server {
listen 80 default_server;
server_name _;
return 403;
}
}实施步骤
1. 编辑配置文件:通常位于 /etc/nginx/nginx.conf 或 /etc/nginx/conf.d/ 目录下。将上述配置逻辑写入 http 块中。
2. 语法检查:修改完成后,务必先执行语法检查,避免配置错误导致服务无法启动:
nginx -t3. 重载服务:检查显示 successful 后,平滑重载配置:
nginx -s reload验证方法
浏览器会自动隐藏 Host 头,建议使用 curl 命令模拟请求进行验证:
curl -H "Host: www.example.com" http://<Nginx_IP>/观察返回内容是否来自预期的后端池。同时查看 Nginx 访问日志(通常位于 /var/log/nginx/access.log),确认 upstream 地址是否匹配配置。
常见故障排查
1. 502 Bad Gateway:检查 upstream 中的后端 IP 和端口是否存活,确保 upstream 地址中不要带 http:// 前缀,仅写 IP:Port。
2. 转发错乱:如果请求的域名未匹配到任何 server_name,Nginx 会使用默认 server。若未配置 default_server,可能随机匹配一个 server 块。建议始终配置一个 return 403 的默认 server 兜底。
3. 后端获取 IP 错误:若后端应用获取到的客户端 IP 均为 Nginx IP,请检查 location 块中是否添加了 proxy_set_header X-Real-IP $remote_addr;。
4. 连接复用问题:如果后端支持 HTTP/1.1,建议在 upstream 中配置 keepalive 连接,并同时在 location 中设置 proxy_http_version 1.1; 和 proxy_set_header Connection ""; 以减少握手开销。