1. 配置 Upstream 服务器
首先,定义一个 upstream
块,其中包含后端服务器的列表。upstream
块告诉 Nginx 如何与多个后端服务器进行通信。
http {
upstream backend {
# 定义后端服务器
server backend1.example.com; # 后端服务器 1
server backend2.example.com; # 后端服务器 2
server backend3.example.com; # 后端服务器 3
}
server {
listen 80;
location / {
proxy_pass http://backend; # 转发请求到 upstream 块中定义的后端服务器
}
}
}
2. 常用的负载均衡策略
Nginx 提供了几种负载均衡算法,可以根据需要选择不同的策略:
轮询(默认)
默认情况下,Nginx 使用轮询(round-robin)策略,即请求会按顺序依次分配给后端服务器,适用于负载均衡。
upstream backend {
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
}
最少连接(Least Connections)
通过配置 least_conn
,Nginx 将请求转发给当前连接数最少的后端服务器。
upstream backend {
least_conn;
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
}
IP 哈希(IP Hash)
当你需要让同一个客户端始终连接到相同的后端服务器时,可以使用 ip_hash
。这基于客户端的 IP 地址来决定请求应该转发到哪个后端服务器。
upstream backend {
ip_hash;
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
}
加权轮询(Weight)
你可以为每个后端服务器配置一个权重,Nginx 会根据权重来分配请求,权重越大,分配到该服务器的请求就越多。
upstream backend {
server backend1.example.com weight=3; # 权重为 3
server backend2.example.com weight=1; # 权重为 1
server backend3.example.com weight=2; # 权重为 2
}
健康检查(Health Check)
Nginx 的商业版本(Nginx Plus)支持健康检查,可以自动检测后端服务器的健康状态,并将流量只发送到健康的服务器。
upstream backend {
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
# 健康检查配置(需要 Nginx Plus)
health_check;
}
3. 配置 Proxy Pass
在 location
块中使用 proxy_pass
指令,将请求代理到 upstream
块定义的后端服务器:
server {
listen 80;
location / {
proxy_pass http://backend; # 请求被转发到 upstream 定义的后端服务器
proxy_set_header Host $host; # 保持客户端的原始主机头
proxy_set_header X-Real-IP $remote_addr; # 转发客户端的 IP 地址
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 传递客户端 IP
proxy_set_header X-Forwarded-Proto $scheme; # 转发协议(http 或 https)
}
}
4. 设置负载均衡的超时和重试机制
你可以设置一些参数来控制负载均衡的超时、最大重试次数等:
upstream backend {
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
# 配置超时和最大重试次数
keepalive 32; # 保持连接数,减少每次请求的连接开销
fail_timeout 30s; # 每台服务器失败的超时时间
max_fails 3; # 服务器失败的最大次数
}
5. 完整的配置示例
http {
upstream backend {
# 轮询负载均衡
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
# 额外配置
keepalive 32;
fail_timeout 30s;
max_fails 3;
}
server {
listen 80;
location / {
proxy_pass http://backend; # 请求代理到 backend upstream
proxy_set_header Host $host; # 保留 Host 头
proxy_set_header X-Real-IP $remote_addr; # 转发客户端 IP 地址
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 转发代理链
proxy_set_header X-Forwarded-Proto $scheme; # 转发协议(http 或 https)
}
}
}
6. 负载均衡的高级配置
权重 + 健康检查(Nginx Plus)
upstream backend {
server backend1.example.com weight=3; # 权重为 3
server backend2.example.com weight=1; # 权重为 1
server backend3.example.com weight=2; # 权重为 2
# 健康检查
health_check;
}
反向代理 + SSL 配置
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
location / {
proxy_pass https://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;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
总结
在 Nginx 中配置负载均衡需要定义一个 upstream
块并将多个服务器列出,然后在 server
块中的 location
配置中使用 proxy_pass
转发请求。通过设置负载均衡算法、健康检查、超时等参数,你可以根据需求优化流量分发的策略。