你是不是也遇到过这种情况:
-
上了多台服务器,流量分配不均,有的忙死、有的闲死?
-
用户明明登录了,一刷新就掉线,因为请求跳到了另一台机器?
Nginx 的负载均衡功能可以解决这些问题。今天这篇文章,我直接给你 4 种常用算法的配置模板,复制就能用,顺便告诉你什么时候该选哪一种。
一、先看一个最基础的 upstream 模板
upstream backend {
server 192.168.1.10:8080;
server 192.168.1.11:8080;
server 192.168.1.12:8080;
}
server {
listen 80;
location / {
proxy_pass http://backend;
}
}
这个配置使用默认的 轮询(round-robin) 算法,请求会依次发给三台服务器:第一台 → 第二台 → 第三台 → 第一台...
适用场景:服务器性能差不多,且服务是无状态的(比如静态资源、简单的 API)。
二、四种负载均衡算法对比
| 算法 | 配置关键词 | 行为 | 适用场景 |
|---|---|---|---|
| 轮询 | 默认(不写) | 轮流分发,平均 | 服务器性能均衡,无状态服务 |
| 权重 | weight=3 |
按比例分发,权重高的多接请求 | 服务器性能不均,强的多分点活 |
| IP 哈希 | ip_hash; |
同一客户端 IP 始终打到同一台服务器 | 需要保持 session(如登录状态) |
| 最少连接 | least_conn; |
优先分发给当前活动连接数最少的服务器 | 请求处理时间差异大(如文件上传、慢查询) |
三、配置模板(直接复制)
1. 轮询(默认)
upstream backend {
server 192.168.1.10:8080;
server 192.168.1.11:8080;
}
2. 权重
upstream backend {
server 192.168.1.10:8080 weight=3; # 处理 3 倍流量
server 192.168.1.11:8080 weight=1;
}
3. IP 哈希
upstream backend {
ip_hash;
server 192.168.1.10:8080;
server 192.168.1.11:8080;
}
4. 最少连接
upstream backend {
least_conn;
server 192.168.1.10:8080;
server 192.168.1.11:8080;
}
四、健康检查(可选,但推荐)
不加健康检查时,如果某台服务器挂了,Nginx 还是会往它发请求,直到超时。加上 max_fails 和 fail_timeout 可以自动剔除故障节点:
upstream backend {
server 192.168.1.10:8080 max_fails=3 fail_timeout=30s;
server 192.168.1.11:8080 max_fails=3 fail_timeout=30s;
}
-
max_fails=3:连续失败 3 次,标记为不可用 -
fail_timeout=30s:30 秒后重试
五、一个完整示例(权重 + 健康检查 + 反向代理)
upstream myapp {
server 192.168.1.10:8080 weight=3 max_fails=3 fail_timeout=30s;
server 192.168.1.11:8080 weight=1 max_fails=3 fail_timeout=30s;
}
server {
listen 80;
server_name api.example.com;
location / {
proxy_pass http://myapp;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
六、总结
-
轮询:默认,适合性能相同的无状态服务。
-
权重:服务器性能有差异时用,强的多分点流量。
-
IP 哈希:需要保持 session 时用(注意:后端增减服务器会导致哈希重分配)。
-
最少连接:请求处理时间差异大时用,能避免慢请求堆积。
把这几个模板存下来,下次配负载均衡直接复制改 IP 就行。