upstream、轮询、权重、健康检查
负载均衡是将请求分发到多个后端服务器的技术,可以提高系统的可用性、可扩展性和性能。Nginx通过upstream模块实现负载均衡,支持多种负载均衡算法。
upstream指令用于定义后端服务器组。
upstream backend {
server 192.168.1.10:8000;
server 192.168.1.11:8000;
server 192.168.1.12:8000;
}
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;
}
}
轮询是默认的负载均衡算法,按顺序将请求分配给后端服务器。
upstream backend {
# 默认使用轮询算法
server 192.168.1.10:8000;
server 192.168.1.11:8000;
server 192.168.1.12:8000;
}
server {
listen 80;
location / {
proxy_pass http://backend;
}
}
通过weight参数设置服务器权重,权重越高,分配的请求越多。
upstream backend {
# 权重比例为 3:2:1
server 192.168.1.10:8000 weight=3;
server 192.168.1.11:8000 weight=2;
server 192.168.1.12:8000 weight=1;
}
server {
listen 80;
location / {
proxy_pass http://backend;
}
}
根据客户端IP进行哈希,同一IP的请求总是分配到同一台服务器,实现会话保持。
upstream backend {
ip_hash;
server 192.168.1.10:8000;
server 192.168.1.11:8000;
server 192.168.1.12:8000;
}
server {
listen 80;
location / {
proxy_pass http://backend;
}
}
将请求分配给当前连接数最少的服务器。
upstream backend {
least_conn;
server 192.168.1.10:8000;
server 192.168.1.11:8000;
server 192.168.1.12:8000;
}
server {
listen 80;
location / {
proxy_pass http://backend;
}
}
upstream支持多种服务器参数来控制负载均衡行为。
upstream backend {
# weight: 权重
server 192.168.1.10:8000 weight=5;
# max_fails: 最大失败次数
# fail_timeout: 失败超时时间
server 192.168.1.11:8000 max_fails=3 fail_timeout=30s;
# backup: 备份服务器(其他服务器都不可用时才使用)
server 192.168.1.12:8000 backup;
# down: 标记服务器为不可用
server 192.168.1.13:8000 down;
# max_conns: 最大并发连接数
server 192.168.1.14:8000 max_conns=100;
}
server {
listen 80;
location / {
proxy_pass http://backend;
}
}
Nginx通过被动健康检查来监控后端服务器状态。
upstream backend {
server 192.168.1.10:8000 max_fails=3 fail_timeout=30s;
server 192.168.1.11:8000 max_fails=3 fail_timeout=30s;
server 192.168.1.12:8000 max_fails=3 fail_timeout=30s;
# 备份服务器
server 192.168.1.13:8000 backup;
}
server {
listen 80;
location / {
proxy_pass http://backend;
# 这些状态码触发故障转移
proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
# 故障转移超时时间
proxy_next_upstream_timeout 10s;
# 最多尝试次数
proxy_next_upstream_tries 3;
}
}
使用ip_hash或hash指令实现会话保持。
# 方式1:基于IP的会话保持
upstream backend_ip {
ip_hash;
server 192.168.1.10:8000;
server 192.168.1.11:8000;
}
# 方式2:基于Cookie的会话保持
upstream backend_cookie {
hash $cookie_sessionid;
server 192.168.1.10:8000;
server 192.168.1.11:8000;
}
# 方式3:基于URI的会话保持
upstream backend_uri {
hash $request_uri consistent;
server 192.168.1.10:8000;
server 192.168.1.11:8000;
}
server {
listen 80;
location /app1/ {
proxy_pass http://backend_ip;
}
location /app2/ {
proxy_pass http://backend_cookie;
}
location /app3/ {
proxy_pass http://backend_uri;
}
}
配置Nginx与后端服务器之间的长连接,提高性能。
upstream backend {
server 192.168.1.10:8000;
server 192.168.1.11:8000;
# 每个worker进程保持的空闲长连接数
keepalive 32;
# 长连接最大请求数
keepalive_requests 100;
# 长连接超时时间
keepalive_timeout 60s;
}
server {
listen 80;
location / {
proxy_pass http://backend;
# 使用HTTP/1.1协议
proxy_http_version 1.1;
# 清除Connection头
proxy_set_header Connection "";
}
}
upstream backend {
# 使用最少连接算法
least_conn;
# 主服务器
server 192.168.1.10:8000 weight=3 max_fails=3 fail_timeout=30s;
server 192.168.1.11:8000 weight=2 max_fails=3 fail_timeout=30s;
server 192.168.1.12:8000 weight=1 max_fails=3 fail_timeout=30s;
# 备份服务器
server 192.168.1.13:8000 backup;
# 长连接配置
keepalive 32;
keepalive_requests 100;
keepalive_timeout 60s;
}
server {
listen 80;
server_name example.com;
# 访问日志
access_log /var/log/nginx/backend.access.log;
error_log /var/log/nginx/backend.error.log;
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;
proxy_set_header X-Forwarded-Proto $scheme;
# 长连接配置
proxy_http_version 1.1;
proxy_set_header Connection "";
# 超时配置
proxy_connect_timeout 30s;
proxy_send_timeout 30s;
proxy_read_timeout 30s;
# 故障转移配置
proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
proxy_next_upstream_timeout 10s;
proxy_next_upstream_tries 3;
# 缓冲配置
proxy_buffering on;
proxy_buffer_size 4k;
proxy_buffers 8 4k;
# 添加响应头
add_header X-Upstream-Addr $upstream_addr;
add_header X-Upstream-Status $upstream_status;
add_header X-Upstream-Response-Time $upstream_response_time;
}
# 健康检查端点
location /health {
access_log off;
return 200 "healthy\n";
add_header Content-Type text/plain;
}
}
for i in {1..10}; do curl http://localhost/; done负载均衡是提高系统可用性和性能的重要手段。Nginx提供了丰富的负载均衡功能,包括多种算法、健康检查、故障转移等。通过合理配置upstream,可以构建高可用、高性能的分布式系统。