想要通过Nginx配置反向代理结合负载均衡,让Nginx将客户端请求分发到多台后端服务器(或同一服务器的多个端口服务),从而提升服务的可用性和并发能力,这是生产环境中非常常用的架构方案。我会以阿里云ECS环境为例,从核心配置、常见负载均衡策略、实操步骤三个维度带你完成配置。
一、核心原理与前置准备
1. 核心逻辑
Nginx通过upstream模块定义后端服务器集群(也叫"上游服务器组"),再通过反向代理的proxy_pass将请求转发到这个集群,同时按照指定的策略(如轮询、权重、IP哈希)分发请求,实现负载均衡。
2. 前置准备
- 阿里云ECS已安装Nginx(
yum install nginx -y/apt install nginx -y); - 准备多台后端服务节点(示例用3个节点:
192.168.1.101:8080、192.168.1.102:8080、127.0.0.1:8081,可替换为你的实际服务地址); - ECS安全组放行Nginx监听的端口(80/443),后端服务端口仅需内网互通,无需暴露到公网。
二、Nginx负载均衡+反向代理配置(实操)
步骤1:定义后端服务器集群(upstream)
首先在Nginx配置中定义上游服务器组,指定负载均衡策略,再配置反向代理转发请求到该集群。
创建专用的负载均衡配置文件:
bash
vim /etc/nginx/conf.d/load-balancer.conf
写入以下配置(注释标注核心参数):
nginx
# 第一步:定义后端服务器集群(upstream模块)
# 集群名称:backend_servers(可自定义)
upstream backend_servers {
# 负载均衡策略(默认轮询,以下是常用策略,选其一即可)
# 策略1:轮询(默认)- 按顺序依次分发请求到各节点
# 策略2:权重(weight)- 权重越高,分配的请求越多(适合节点性能不同的场景)
server 192.168.1.101:8080 weight=3; # 权重3,接收3/6的请求
server 192.168.1.102:8080 weight=2; # 权重2,接收2/6的请求
server 127.0.0.1:8081 weight=1; # 权重1,接收1/6的请求
# 策略3:IP哈希(ip_hash)- 同一客户端IP始终转发到同一节点(解决会话保持问题)
# ip_hash; # 启用时需注释掉weight,且不能使用backup节点
# 策略4:最少连接(least_conn)- 优先转发到当前连接数最少的节点
# least_conn;
# 可选:节点健康检查与容错配置
max_fails 3; # 失败3次认为节点不可用
fail_timeout 30s; # 30秒内不再转发请求到不可用节点
# server 192.168.1.103:8080 backup; # 备份节点(仅所有主节点不可用时启用)
}
# 第二步:配置反向代理,将请求转发到上述集群
server {
listen 80;
server_name your-domain.com; # 替换为你的域名/ECS公网IP
location / {
# 核心:转发请求到定义的后端集群(注意:http://后是upstream的名称,无端口)
proxy_pass http://backend_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;
# 可选:超时配置(避免后端响应慢导致Nginx超时)
proxy_connect_timeout 60s;
proxy_read_timeout 60s;
proxy_send_timeout 60s;
}
}
步骤2:关键参数说明(新手必看)
| 参数 | 作用 |
|---|---|
upstream 集群名 |
定义后端服务器集群,是负载均衡的核心模块 |
server 地址:端口 |
配置单个后端节点,可加weight(权重)、backup(备份)等参数 |
max_fails |
节点连续失败次数阈值,超过则标记为不可用 |
fail_timeout |
节点标记为不可用后,多久内不再尝试转发请求 |
ip_hash |
按客户端IP哈希分配节点,解决会话(Session)保持问题 |
proxy_pass 集群名 |
反向代理核心,将请求转发到定义的上游集群(而非单个节点) |
步骤3:验证并重启Nginx
-
检查配置语法(避免错误导致Nginx崩溃):
bashnginx -t输出
test is successful表示配置无误。 -
重启Nginx使配置生效:
bashsystemctl restart nginx
三、测试负载均衡效果
-
简单测试(验证请求分发) :
给每个后端节点的服务返回不同标识(比如
192.168.1.101:8080返回node1,192.168.1.102:8080返回node2),然后多次访问http://你的域名,会看到页面交替显示不同节点标识,且权重高的节点出现次数更多。 -
节点故障测试 :
手动停止其中一个后端节点(如
192.168.1.101:8080),再次访问域名,请求会自动分发到其他可用节点,fail_timeout时间后才会重试该节点。
四、阿里云环境特殊优化
- 内网互通 :若后端节点是阿里云其他ECS,建议使用内网IP(192.168.x.x)通信,避免走公网,提升速度且节省带宽。
- 安全组:仅放行Nginx的80/443端口,后端节点的8080等端口仅允许Nginx服务器的内网IP访问(在后端ECS安全组中配置授权对象为Nginx服务器内网IP)。
- HTTPS负载均衡 :若需HTTPS访问,只需在Nginx的
server块中添加SSL证书配置(和普通HTTPS反向代理一致),Nginx解密后转发HTTP请求到后端节点即可。
总结
- Nginx负载均衡的核心是
upstream模块定义后端集群,结合proxy_pass实现反向代理+请求分发; - 常用策略:轮询(默认)、权重(适配不同性能节点)、IP哈希(解决会话保持)、最少连接(适配高并发);
- 必配
max_fails/fail_timeout实现节点容错,阿里云环境优先用内网IP通信后端节点,提升安全性和性能。