一、为什么要从单机代理升级到负载均衡¶
原笔记先给出了一个非常典型的背景:
- 如果后端只有一台 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 节点准备好¶
原笔记要求 web01 和 web02 都安装 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
结果会看到输出在 web01 和 web02 之间交替出现。
这说明 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_fails和fail_timeout更偏向简单健康检查backup更偏向兜底容灾
八、小结¶
Nginx 负载均衡的入门关键其实只有两步:
- 用
upstream定义后端池 - 用
proxy_pass把用户请求送进池子
在此基础上,再逐步理解:
- 默认轮询如何工作
- 请求头如何继续透传
- 权重、失败次数和备份节点如何调优
这就是后续接入 WordPress、会话保持和更复杂集群架构的基础。