<返回目录     Powered by claud/xia兄

第5课: 负载均衡

upstream、轮询、权重、健康检查

什么是负载均衡

负载均衡是将请求分发到多个后端服务器的技术,可以提高系统的可用性、可扩展性和性能。Nginx通过upstream模块实现负载均衡,支持多种负载均衡算法。

负载均衡的优势

upstream基础配置

upstream指令用于定义后端服务器组。

示例1:基础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;
    }
}

轮询策略(默认)

轮询是默认的负载均衡算法,按顺序将请求分配给后端服务器。

示例2:轮询配置

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参数设置服务器权重,权重越高,分配的请求越多。

示例3:加权轮询配置

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进行哈希,同一IP的请求总是分配到同一台服务器,实现会话保持。

示例4: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;
    }
}

最少连接

将请求分配给当前连接数最少的服务器。

示例5:最少连接配置

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支持多种服务器参数来控制负载均衡行为。

示例6:服务器参数配置

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通过被动健康检查来监控后端服务器状态。

示例7:健康检查配置

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指令实现会话保持。

示例8:会话保持配置

# 方式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与后端服务器之间的长连接,提高性能。

示例9:长连接配置

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 "";
    }
}

示例10:完整的生产环境配置

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;
    }
}
负载均衡最佳实践:
常见问题:

实践练习

练习任务:
  1. 配置一个包含3台后端服务器的upstream
  2. 使用加权轮询,权重比例为3:2:1
  3. 配置健康检查参数(max_fails=3, fail_timeout=30s)
  4. 添加一台备份服务器
  5. 配置长连接(keepalive=32)
  6. 使用curl测试负载均衡:for i in {1..10}; do curl http://localhost/; done
  7. 停止一台后端服务器,观察故障转移行为
  8. 查看Nginx日志,分析请求分发情况

总结

负载均衡是提高系统可用性和性能的重要手段。Nginx提供了丰富的负载均衡功能,包括多种算法、健康检查、故障转移等。通过合理配置upstream,可以构建高可用、高性能的分布式系统。