Nginx 负载均衡配置教程以及 upstream 详解
一、通用配置
在 Nginx 中配置负载均衡非常简单。通过定义一个 upstream 块,你可以指定多个后端服务器用于负载均衡。下面是一个基本的例子:
http {
upstream myapp {
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
}
server {
listen 80;
server_name www.example.com;
location / {
proxy_pass http://myapp;
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;
}
}
}
详细说明:
- upstream 块: 定义了一个名为 myapp 的负载均衡组,包含了三台后端服务器。
- server 块: 用于处理进入的请求,并将它们代理到 upstream 定义的服务器组。
- proxy_pass 指令: 将请求转发到 myapp 这个 upstream 组。
- proxy_set_header 指令: 设置了一些头信息以保持客户端的原始请求信息。
二、负载均衡算法
Nginx 支持多种负载均衡算法,默认使用 轮询(Round Robin),选择适合应用的负载均衡策略可以帮助提升性能并确保高可用性。你可以通过在 upstream 块中指定不同的策略来更改这个行为:
- 轮询 (round-robin): 默认策略,轮流将请求分配给每个服务器。
- 权重 (weight): 为服务器分配不同权重,例如:
upstream myapp {
server backend1.example.com weight=3;
server backend2.example.com weight=1;
}
- 最少连接 (least_conn): 将新请求分配给当前活动连接数最少的服务器。
upstream myapp {
least_conn;
server backend1.example.com;
server backend2.example.com;
}
- IP 哈希 (ip_hash): 基于客户端 IP 地址进行哈希,从而使同一客户端的请求总是转发到同一台后端服务器。
upstream myapp {
ip_hash;
server backend1.example.com;
server backend2.example.com;
}
三、upstream 参数详解
在 Nginx 中,upstream 块支持多种配置选项,用于管理与后端服务器的连接,包括超时设置、失败重试次数等。下面是一个详细的 upstream 配置示例:
http {
upstream myapp {
# 定义后端服务器及其权重
server backend1.example.com weight=3 max_fails=3 fail_timeout=30s;
server backend2.example.com weight=2 max_fails=3 fail_timeout=30s;
server backend3.example.com backup;
# 设置空闲连接数
keepalive 16;
# 连接超时时间
connect_timeout 5s;
# 响应超时时间
send_timeout 10s;
proxy_read_timeout 30s;
}
server {
# 省略
.....
}
}
配置详解:
- server 指令
- weight=<number>: 指定服务器的权重,影响负载均衡分配。
- max_fails=<number>: 在指定时间内允许的最大失败次数。如果超过这个值,服务器将被标记为不可用。
- fail_timeout=<time>: 服务器被标记为不可用的时间长度。在这段时间后会重新尝试连接。
- backup 参数
该参数将当前服务器标记为备用服务器,仅在主服务器都不可用时才使用。
- keepalive
保持活动连接数,以减少建立连接的开销,提高性能。
- connect_timeout
设置与后端服务器建立连接的超时时间。
- send_timeout
定义发送请求到后端服务器时的超时时间。
- proxy_read_timeout
设置从后端服务器接收响应的超时时间。
注:以上配置可以根据应用需求进行调整,以便优化网络延迟和提高服务可靠性。确保在生产环境中仔细测试这些超时时间和重试策略,以找到最佳的设置。