Nginx负载均衡配置,upstream多台服务器
前言
网站访问量上来了,一台服务器扛不住,想用多台服务器一起跑。Nginx 的负载均衡功能就是干这个的:前面一台 Nginx 当入口,后面多台服务器一起干活。
什么是负载均衡
用户请求 → Nginx(负载均衡)→ 服务器A
→ 服务器B
→ 服务器C
Nginx 把请求按规则分发到不同的后端服务器,分担压力。
基础配置
第一步:定义 upstream
在 http 块里定义后端服务器组:
upstream backend {
server 192.168.1.101:80;
server 192.168.1.102:80;
server 192.168.1.103:80;
}
第二步:反向代理到后端
server {
listen 80;
server_name www.example.com;
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
负载均衡策略
轮询(默认)
默认就是轮询,一个一个轮流来。
upstream backend {
server 192.168.1.101;
server 192.168.1.102;
}
加权轮询
服务器性能不一样,性能好的多分点请求:
upstream backend {
server 192.168.1.101 weight=3;
server 192.168.1.102 weight=1;
}
意思是:每4个请求,3个给101,1个给102。
ip_hash
同一个用户的请求永远打到同一台服务器(解决 session 问题):
upstream backend {
ip_hash;
server 192.168.1.101;
server 192.168.1.102;
}
健康检查
某台服务器挂了,Nginx 自动把它踢出去:
upstream backend {
server 192.168.1.101 max_fails=3 fail_timeout=30s;
server 192.168.1.102 max_fails=3 fail_timeout=30s;
}
意思是:3次失败就暂停30秒不发请求给它。
完整配置示例
http {
upstream backend {
server 192.168.1.101 weight=3 max_fails=3 fail_timeout=30s;
server 192.168.1.102 weight=1 max_fails=3 fail_timeout=30s;
}
server {
listen 80;
server_name www.example.com;
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}
常见坑
坑1:session 不一致
用户登录了,刷新一下又掉登录。
原因: 轮询把请求分到不同服务器,session 没共享。
解决: 用 ip_hash,或者用 Redis 统一存 session。
坑2:后端服务器改了但 Nginx 没生效
加了一台新服务器,配置也写了,但没重载。
解决: nginx -s reload。
坑3:后端服务端口不对
后端跑在 8080 端口,upstream 里写的 80。
解决: upstream 里写对端口。
坑4:后端获取不到真实 IP
后端日志里记的都是 Nginx 的 IP。
解决: 加 X-Forwarded-For 头:
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
总结
负载均衡就两步:
- upstream 定义后端服务器列表
- proxy_pass 转发到 upstream
记住: 多台服务器用负载均衡,记得处理 session 共享问题。
遇到问题加QQ23979811 协助处理
Nginx 负载均衡配置
Nginx 负载均衡配置实战
网站流量大了,单台服务器扛不住,就得用负载均衡。Nginx 做负载均衡很简单,几行配置就行。
1. 基本配置
http {
upstream backend {
server 192.168.1.101:80;
server 192.168.1.102:80;
server 192.168.1.103:80;
}
server {
listen 80;
server_name www.example.com;
location / {
proxy_pass http://backend;
}
}
}
默认是轮询(round robin),请求轮流分到三台服务器。
2. 四种分配策略
轮询(默认):一个一个来。
权重(weight):按比例分配,性能好的服务器多分担。
upstream backend {
server 192.168.1.101 weight=3;
server 192.168.1.102 weight=2;
server 192.168.1.103 weight=1;
}
3:2:1 的比例,第一台分一半请求。
ip_hash:同一个 IP 固定分到同一台服务器,解决 session 问题。
upstream backend {
ip_hash;
server 192.168.1.101;
server 192.168.1.102;
}
least_conn:最少连接数优先,分给当前最闲的服务器。
upstream backend {
least_conn;
server 192.168.1.101;
server 192.168.1.102;
}
3. 健康检查
upstream backend {
server 192.168.1.101 max_fails=3 fail_timeout=30s;
server 192.168.1.102 max_fails=3 fail_timeout=30s;
}
一台服务器挂了,自动从列表里摘掉,恢复了再加回来。
4. 常用参数
- max_fails:失败几次算挂了,默认1次
- fail_timeout:挂了多久再重试,默认10秒
- down:标记服务器下线,不分配请求
- backup:备用服务器,其他都挂了才用
5. 完整示例
upstream backend {
server 192.168.1.101 weight=3 max_fails=3 fail_timeout=30s;
server 192.168.1.102 weight=2 max_fails=3 fail_timeout=30s;
server 192.168.1.103 backup;
}
server {
listen 80;
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
总结
Nginx 负载均衡核心:
- upstream 定义服务器组
- 四种策略:轮询、权重、ip_hash、最少连接
- 健康检查自动摘除故障节点
- 生产环境用权重 + 健康检查就够了
搞懂这些,多台服务器集群就跑起来了。