服务器负载均衡零基础教程:配置、避坑与验证
## 负载均衡是什么?新手能做什么?
服务器负载均衡就是把访问你网站的流量分散到多台服务器上,避免一台机器扛不住导致网站变慢或崩溃。比如你只有一台服务器,用户一多就卡;加一台服务器后,用负载均衡把请求分到两台,体验就稳了。新手能直接用 Nginx 或宝塔面板快速配起来,不用懂底层原理。
## 搭建前需要做好哪些准备?
开始之前,确保你手里有这些东西:
* **至少两台云服务器**(可以是同一家云厂商的,也可以不同,推荐同一区域降低延迟)。
* **每台服务器上部署好相同的网站环境**(比如都装了 Nginx + PHP,网站文件放到相同的路径)。
* **一个域名**(可选,但推荐;负载均衡通常绑定域名)。
* **SSH 客户端**(如 Xshell、Putty 或者直接用服务器面板的终端)。
* **宝塔面板**已安装(如果你用面板操作,会省去很多命令)。
> 小提示:如果只有一台服务器,可以用 Docker 在本地创建两个容器模拟多台后端,或者先学理论,等有两台再实操。
## 手把手教你用 Nginx 配置负载均衡
以下以 Nginx 为例,假设你有两台后端服务器 IP:`192.168.1.10`(Web1) 和 `192.168.1.20`(Web2),端口都是 80。
### 1. 登录负载均衡服务器(代理服务器)
通过 SSH 连接你将要充当“调度员”的那台服务器(可以是全新装好 Nginx 的机器)。确认 Nginx 已安装:
```bash
nginx -v
```
如果没有安装,执行:
```bash
# CentOS / RHEL
yum install -y nginx
# Ubuntu / Debian
apt install -y nginx
```
### 2. 编辑 Nginx 配置文件
```bash
vim /etc/nginx/nginx.conf
```
在 `http {}` 块内添加一个 `upstream` 块,然后修改 `server` 块中的 `location /` 部分,把请求转发到这个 `upstream`。
```nginx
upstream backend {
server 192.168.1.10:80 weight=1;
server 192.168.1.20:80 weight=1;
}
server {
listen 80;
server_name your-domain.com;
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
```
* `weight=1` 表示两台服务器权重一样,轮流处理请求。
* `proxy_set_header` 是为了让后端服务器能拿到真实用户 IP。
### 3. 重启 Nginx 并测试
```bash
nginx -t # 测试配置语法
systemctl restart nginx # 或 service nginx restart
```
现在访问 `http://your-domain.com`,流量就会在后台两台服务器间轮转。
### 4. 宝塔面板操作方法(如果你用面板)
进入宝塔面板 → 网站 → 添加站点 → 反向代理 → 目标 URL 填写 `http://backend`(前提是你已经在“系统设置 - 负载均衡”里添加了 upstream 并指定了后端服务器列表)。面板会自动生成类似上面配置,你只需填写域名和 IP 列表即可。
## 配置过程中容易踩的坑
* **后端服务器没有正确返回数据**:检查后端 Nginx 是否启用了 `proxy_set_header`,或者后端防火墙是否放行了代理服务器 IP。
* **会话丢失问题(用户登录后刷新就退出)**:默认负载均衡会把同一个用户的请求随机发到不同服务器,导致登录状态丢失。解决办法是用 `ip_hash` 或 `sticky` 模块,让同一个 IP 固定访问同一台后端。修改 upstream 块:
```nginx
upstream backend {
ip_hash;
server 192.168.1.10:80;
server 192.168.1.20:80;
}
```
* **健康检查缺失**:某台后端挂了,Nginx 默认还会继续转发,导致部分用户看到 502。建议开启被动健康检查(`max_fails=3 fail_timeout=30s`):
```nginx
upstream backend {
server 192.168.1.10:80 max_fails=3 fail_timeout=30s;
server 192.168.1.20:80 max_fails=3 fail_timeout=30s;
}
```
* **超时设置太短**:如果后端处理慢,可能在代理层就超时报错。在 `location /` 中添加:
```bash
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
```
## 如何确认负载均衡正常工作?
完成配置后,不要只刷新一次网页就觉得完了,要做几个验证:
### 1. 查看 Nginx 访问日志
在代理服务器上执行:
```bash
tail -f /var/log/nginx/access.log
```
随后再做打开浏览器访问你的域名,看日志里 `upstream_addr` 字段是否轮换显示 `192.168.1.10:80` 和 `192.168.1.20:80`。
### 2. 用 curl 测试轮询
```bash
for i in {1..10}; do curl -s http://your-domain.com | grep -o 'Server IP: [0-9.]*'; done
```
前提是后端服务器返回内容里包含自己的 IP。如果没有,可以在后端服务器 `index.html` 中写一行 `
Server IP:
php echo $_SERVER['SERVER_ADDR']; ?
>