服务器 nginx 负载均衡如何搭建

chinaz
chinaz 正式会员超兽战士
发布于 2026-10-07 19:07 ·0 浏览 ·0 回复

照着做完,你就能用 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,属于被动检查,不是实时探活。
版权声明:本文来自 GJ站长论坛《服务器 nginx 负载均衡如何搭建》
原文链接:https://www.gj0.com/thread-488.html
转载请注明出处并保留本声明;内容仅代表作者观点,与本站立场无关。若本文涉嫌侵权,请联系本站处理。

全部回复 0

还没有回复,来抢沙发~