在 Linux 下,Nginx 本身就可以作为反向代理和负载均衡器,常用于将请求分发到多台后端服务器(如 Tomcat、Node、Python、PHP 等)。
下面从 原理 → 配置示例 → 常用策略 → 健康检查 → 实用建议 一步步说明。
Nginx 通过 upstream 模块定义一组后端服务器,然后在 server 中通过 proxy_pass 将请求转发到这组服务器。
客户端 → Nginx(负载均衡) → 后端服务器1
→ 后端服务器2
→ 后端服务器3
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;
}
}
✅ 默认使用 轮询(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;
}
➡ 101 处理 3/4 的请求
upstream backend {
ip_hash;
server 192.168.1.101;
server 192.168.1.102;
}
✅ 同一 IP 始终访问同一台服务器
❌ 不支持服务器动态上下线
upstream backend {
least_conn;
server 192.168.1.101;
server 192.168.1.102;
}
适合 请求耗时不均 的场景
upstream backend {
fair;
server 192.168.1.101;
server 192.168.1.102;
}
⚠ 需要 nginx-upstream-fair 模块
server 192.168.1.101 max_fails=3 fail_timeout=30s;
含义:
health_check;
nginx_upstream_check_modulehttp {
upstream app_cluster {
least_conn;
server 10.0.0.11:8080 max_fails=3 fail_timeout=20s;
server 10.0.0.12:8080 max_fails=3 fail_timeout=20s;
}
server {
listen 80;
location / {
proxy_pass http://app_cluster;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 5s;
proxy_read_timeout 10s;
}
}
}
nginx -t
systemctl reload nginx
| 场景 | 推荐 |
|---|---|
| Web 服务 | Nginx |
| TCP 负载 | LVS / HAProxy |
| 高可用 | Nginx + Keepalived |
| 微服务 | Nginx + Consul / K8s |
如果你愿意,我可以:
你现在的后端是什么服务?