服务器 nginx 负载均衡如何搭建
照着做完,你就能用 Nginx 把流量分发到多台后端服务器上,并知道怎么验证、怎么调策略。
第一步:准备机器,明确角色
这一步要把机器角色分清楚,做完后你手上应该有 3 台可互相访问的服务器。
- Nginx 负载均衡节点:192.168.1.10(对外提供服务)
- 后端节点 A:192.168.1.11
- 后端节点 B:192.168.1.12
系统以 Ubuntu 22.04 为例,三台机器执行 sudo apt update && sudo apt install -y curl,确认能互相 ping 通。
注意:云服务器要放行安全组端口。负载均衡节点放行 80/443,后端节点只对内网放行 8080/80,不要把后端直接暴露到公网。
第二步:在后端节点上启动服务
这一步在后端两台机器上各起一个能返回内容的 Web 服务,做完后能用 curl 直接访问到。
用 Python 临时起一个最简单:
echo 'backend-A' | sudo tee /var/www/html/index.html
sudo apt install -y nginx && sudo systemctl start nginx
# 在 192.168.1.12 上执行
echo 'backend-B' | sudo tee /var/www/html/index.html
sudo apt install -y nginx && sudo systemctl start nginx
验证:curl http://192.168.1.11 返回 backend-A,curl http://192.168.1.12 返回 backend-B。
第三步:在负载均衡节点安装 Nginx
这一步在 192.168.1.10 上装 Nginx,做完后 systemctl status nginx 显示 active。
sudo apt install -y nginx
sudo systemctl enable --now nginx
nginx -v # 确认版本,Ubuntu 22.04 默认是 1.18.x
默认站点配置在 /etc/nginx/sites-available/default,稍后我们会新建一个独立配置文件,避免污染默认配置。
第四步:写 upstream 和反向代理配置
这一步是核心:定义后端池并让请求转发过去。做完后访问 192.168.1.10 会轮流返回 A 和 B。
新建 /etc/nginx/conf.d/lb.conf(Ubuntu 的 nginx.conf 里 include /etc/nginx/conf.d/*.conf; 已默认开启):
upstream backend_pool {
server 192.168.1.11:80 weight=1 max_fails=2 fail_timeout=10s;
server 192.168.1.12:80 weight=1 max_fails=2 fail_timeout=10s;
keepalive 32;
}
server {
listen 80;
server_name _;
location / {
proxy_pass http://backend_pool;
proxy_http_version 1.1;
proxy_set_header Connection "";
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 5s;
proxy_read_timeout 30s;
}
}
参数说明:weight 是权重,越大分到越多;max_fails=2 fail_timeout=10s 表示 10 秒内失败 2 次就暂时摘掉这台,10 秒后再试;keepalive 32 保持到后端的连接复用。
注意:upstream 的名字(这里是
backend_pool)不能带下划线、短横线等特殊字符,否则nginx -t会直接报错。另外proxy_set_header Connection ""是配合 keepalive 必须写的,漏了长连接不生效。
第五步:检查配置并生效
这一步校验语法并平滑加载,做完后配置生效且不中断已有连接。
sudo nginx -t # 输出 syntax is ok / test is successful
sudo systemctl reload nginx
reload 是平滑重启,旧连接处理完才退出,比 restart 安全。
第六步:验证负载均衡是否生效
这一步实际压一遍看轮询效果,做完后能确认流量确实分发到了两台后端。
for i in $(seq 1 6); do curl -s http://192.168.1.10; echo; done
正常输出交替出现 backend-A 和 backend-B。然后手动停掉 A 的 nginx(sudo systemctl stop nginx),再跑一次命令,应该全部返回 backend-B,说明故障转移生效。
第七步:按需要调整分发策略
这一步改 upstream 里的指令切换算法,做完后能适配不同业务场景。
- 加权轮询(默认,加
weight即可):适合后端配置不一致,按机器能力分配。 least_conn;:加到 upstream 内部,优先分给当前连接数最少的机器,适合请求耗时差异大的场景。ip_hash;:同一客户端 IP 固定打到同一台后端,适合没做 session 共享的老系统。缺点是 NAT 出口 IP 相同的一批用户会全压到一台。hash $request_uri consistent;:按 URL 哈希,适合缓存类服务提高命中率。
改完都要 sudo nginx -t && sudo systemctl reload nginx。
注意:开源版 Nginx 只有被动健康检查(靠 max_fails 判断),没有主动探测。要主动探活得上 Nginx Plus 或用 OpenResty、或者在前面挂 Keepalived 做高可用。别以为配了 max_fails 就能秒级摘除故障机器,它至少要等失败次数达到阈值。
小结
- 角色分离:一台 Nginx 做入口,多台后端提供内容,后端只走内网。
- 核心配置在
upstream块加proxy_pass,四个proxy_set_header必写,否则后端拿不到真实 IP 和协议。 - 用 keepalive 时要同时写
proxy_http_version 1.1和proxy_set_header Connection ""。 - 每次改动先
nginx -t再reload,不要用 restart。 - 分发策略按场景选:默认轮询、
least_conn、ip_hash、hash $request_uri consistent。 - 故障转移靠
max_fails和fail_timeout,属于被动检查,不是实时探活。
原文链接:https://www.gj0.com/thread-488.html
转载请注明出处并保留本声明;内容仅代表作者观点,与本站立场无关。若本文涉嫌侵权,请联系本站处理。