利用 proxy_pass 可以将请求代理到后端服务器。之前的示例主要针对单台服务器进行配置,然而在实际应用中,我们经常需要将请求分发到多台服务器上来实现负载均衡和故障转移。Nginx 提供了 ngx_http_upstream_module 模块,能够为反向代理提供重要功能,如负载均衡和故障转移。
代理多台服务器
以下是一个简单的配置示例:
http {
upstream backend {
server 192.168.0.14;
server 192.168.0.15;
}
server {
listen 80;
location / {
proxy_pass http://backend;
}
}
}
指令详解
- upstream:定义一组 HTTP 服务器,这些服务器可以监听不同的端口,也可以是 TCP 和 UNIX 套接字。可以混合使用不同的端口、 TCP 和 UNIX 套接字。
upstream name {...}
- server:配置后端服务器,参数可以是不同的 IP 地址、端口号,甚至域名。其参数包括 IP 地址、端口号等。
server address [parameters];
故障转移
当某些后端服务器无法正常响应时,Nginx 提供了一些指令进行故障转移,如 proxy_next_upstream。
- proxy_next_upstream:定义转发条件,当请求返回 Nginx 时,如果 HTTP 状态满足 proxy_next_upstream 设置的条件,会将请求重新转发到下一台后端服务器。
proxy_next_upstream error | timeout | invalid_header | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | http_429 | non_idempotent | off ...;
- proxy_next_upstream_tries:定义尝试请求的次数,达到次数上限后停止转发。
proxy_next_upstream_tries number;
- proxy_next_upstream_timeout:限制尝试请求的超时时间,若设置为 0 表示无超时时间。
proxy_next_upstream_timeout time;
负载均衡
Nginx 不仅支持代理多台后端服务器,还支持各种负载均衡模式,如轮询、权重、IP 哈希等。
- 轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器:
upstream backend {
server 192.168.0.14;
server 192.168.0.15;
}
- weight
指定轮询几率,权重越大,负载的权重就越大:
upstream backend {
server 192.168.0.14 weight=10;
server 192.168.0.15 weight=10;
}
- ip_hash
按访问 IP 的 hash 结果分配,每个访客固定访问一个后端服务器:
upstream backend {
ip_hash;
server 192.168.0.14:88;
server 192.168.0.15:80;
}
- fair(第三方模块)
按后端服务器的响应时间分配请求,响应时间短的优先分配:
upstream backend {
server server1.example.com;
server server2.example.com;
fair;
}
- least_conn(第三方模块)
请求分配给连接数较少的后端:
upstream backend {
server server1.example.com;
server server2.example.com;
least_conn;
}
- url_hash(第三方模块)
按访问 URL 的 hash 结果分配请求,使每个 URL 定向到同一个后端服务器:
upstream backend {
server squid1:3128;
server squid2:3128;
hash $request_uri;
hash_method crc32;
}
示例配置
# 定义负载均衡的设备及状态
upstream backend {
ip_hash;
server 127.0.0.1:9090 down;
server 127.0.0.1:8080 weight=2;
server 127.0.0.1:6060;
server 127.0.0.1:7070 backup;
}
# 使用负载均衡的 server 配置
server {
listen 80;
location / {
proxy_pass http://backend;
}
}
负载均衡设备状态设置
- down:该服务器暂时不参与负载均衡。
- weight:权重,默认为1,权重越大,负载的权重就越大。
- max_fails:允许请求失败的次数,超过最大次数时返回 proxy_next_upstream 模块定义的错误。
- fail_timeout:max_fails 次失败后暂停的时间。
- backup:其它所有非 backup 机器 down 或忙时,请求 backup 机器。
通过上述配置和指令,Nginx 可以在多台服务器之间高效地实现负载均衡和故障转移,从而提升系统的可靠性和性能。