一、为什么要从单机代理升级到负载均衡

原笔记先给出了一个非常典型的背景:

  • 如果后端只有一台 Web 服务器,访问量大了就会扛不住
  • 假设单台 Web 只能承受一定规模访问
  • 当访问量继续上涨,就要把多台 Web 组成集群
  • 集群前面再放一台统一调度流量的负载均衡

所以负载均衡的核心价值很明确:

  • 让网站能承受更高的访问量
  • 把请求分散到多个后端节点

当然,原笔记也提醒了一个现实问题:
如果访问量本来就很小,过早上负载均衡反而会增加复杂度。

二、负载均衡和反向代理是什么关系

原笔记专门把这两个概念放到一起比较。

共同点在于:

  • 两者都会把用户请求分发到后端节点

区别在于理解方式:

  • 反向代理更强调“中间代理代替用户去请求后端”
  • 负载均衡更强调“把请求调度到多台后端上”

在实际面试和运维讨论中,这两个概念经常交织出现。
而在 Nginx 中,它们也确实常常是一起使用的。

三、实验环境是如何搭起来的

原笔记给出的入门环境如下:

角色 地址 说明
lb01 192.168.1.21 / 172.16.1.21 负载均衡
web01 192.168.1.20 / 172.16.1.20 Web 节点 1
web02 192.168.1.22 / 172.16.1.22 Web 节点 2

站点信息:

  • 域名:lb.oldboylinux.cn
  • Web 站点目录:/app/code/lb/
  • 首页内容分别写成不同节点标识,便于观察请求落点

四、先把两个 Web 节点准备好

原笔记要求 web01web02 都安装 Nginx,并配置相同域名、相同站点目录,但首页内容不同。

示例配置:

server {
  listen 80;
  server_name lb.oldboylinux.cn;
  root /app/code/lb;

  error_log /var/log/nginx/lb-error.log notice;
  access_log /var/log/nginx/lb-access.log main;

  location / {
    index index.html;
  }
}

然后分别创建目录和首页:

mkdir -p /app/code/lb/
echo lb.oldboylinux.cn web01 > /app/code/lb/index.html

在另一台节点上则写成:

echo lb.oldboylinux.cn web02 > /app/code/lb/index.html

之后分别执行:

nginx -t
systemctl restart nginx

并用 curl -H "Host: lb.oldboylinux.cn" 分别验证两个节点都能独立返回正确内容。

五、负载均衡服务器的核心配置怎么写

原笔记中,负载均衡主机使用 upstream 定义后端池,再通过 proxy_pass 把请求转发过去:

upstream lb_pools {
 server 192.168.1.20:80;
 server 192.168.1.22:80;
}

server {
  listen 80;
  server_name lb.oldboylinux.cn;

  error_log /var/log/nginx/lb-error.log notice;
  access_log /var/log/nginx/lb-access.log main;

  location / {
    proxy_pass http://lb_pools;
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  }
}

原笔记还提醒了一点:

  • 因为 Nginx 会按字母顺序加载 .conf
  • 所以如果默认站点还在,最好先把 default.conf 改成 .bak

这样测试结果才不会被默认虚拟主机干扰。

六、默认情况下它是怎么分发请求的

原笔记通过循环测试演示了默认效果:

for i in {1..10};do curl -H "Host: lb.oldboylinux.cn" http://192.168.1.21;done

结果会看到输出在 web01web02 之间交替出现。
这说明 Nginx 默认会按轮询方式把请求分发到后端节点。

因此,这个入门案例最核心的关系可以概括为:

  • upstream 负责定义一个后端池
  • proxy_pass 负责把请求丢给这个池

七、upstream server 后面常见的参数该怎么理解

原笔记后面还总结了几个非常实用的参数。

参数 含义 典型用途
weight 权重 机器配置不同、流量按比例分配
max_fails 最大失败次数 超过阈值后认为节点异常
fail_timeout 失败后多久再尝试恢复 控制健康检查恢复周期
backup 备用节点 主节点都不可用时再启用

示例:

upstream lb_pools {
 server 192.168.1.20:80 weight=1 max_fails=3 fail_timeout=10s;
 server 192.168.1.22:80 weight=1 max_fails=3 fail_timeout=10s;
 server 192.168.1.22:80 backup;
}

结合原笔记的解释,可以把它们理解为:

  • weight 更偏向流量分配策略
  • max_failsfail_timeout 更偏向简单健康检查
  • backup 更偏向兜底容灾

八、小结

Nginx 负载均衡的入门关键其实只有两步:

  • upstream 定义后端池
  • proxy_pass 把用户请求送进池子

在此基础上,再逐步理解:

  • 默认轮询如何工作
  • 请求头如何继续透传
  • 权重、失败次数和备份节点如何调优

这就是后续接入 WordPress、会话保持和更复杂集群架构的基础。