在 Linux 上使用 Nginx 做负载均衡,本质上就是利用 Nginx 的 反向代理 + upstream 模块 把请求分发到多台后端服务器。下面从「原理 → 配置 → 常用策略 → 示例 → 健康检查」一步步说明。
客户端
|
Nginx(负载均衡器)
|------------------\
| | |
后端1 后端2 后端3
Nginx 监听一个端口(如 80 / 443),将请求转发到 upstream 中定义的一组服务器。
http {
upstream backend {
server 192.168.1.101:8080;
server 192.168.1.102:8080;
server 192.168.1.103:8080;
}
}
server {
listen 80;
server_name 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;
}
}
✅ 此时 Nginx 默认使用 轮询(round-robin) 方式分发请求。
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;
}
upstream backend {
ip_hash;
server 192.168.1.101;
server 192.168.1.102;
}
upstream backend {
least_conn;
server 192.168.1.101;
server 192.168.1.102;
}
server 192.168.1.101 max_fails=3 fail_timeout=30s;
含义:
health_check;
http {
upstream app {
least_conn;
server 10.0.0.1:8080 weight=2;
server 10.0.0.2:8080;
server 10.0.0.3:8080 backup;
}
server {
listen 80;
location / {
proxy_pass http://app;
proxy_set_header Host $host;
}
}
}
backup:主节点都挂了才启用
server {
listen 443 ssl;
ssl_certificate /etc/nginx/ssl/cert.pem;
ssl_certificate_key /etc/nginx/ssl/key.pem;
location / {
proxy_pass http://backend;
}
}
nginx -t
systemctl reload nginx
❌ session 丢失 → 用 ip_hash 或 Redis 存 session
❌ 后端端口不对
❌ 防火墙未开放
❌ 未配置 Host 头
如果你愿意,我可以:
你现在是哪种使用场景?