微信公众号
扫描关注微信公众号
博客大厅

如何配置 Nginx 的负载均衡?

原创 来源:博客站 阅读 0 今天 07:49:18 听全文

配置 Nginx 的负载均衡功能可以将客户端请求分发到多个后端服务器,提高系统的可用性和性能。以下是 详细步骤最佳实践


1. 基础负载均衡配置

(1) 定义后端服务器组 (upstream)

http 块中定义一组后端服务器:

http {
    upstream backend {
        server 10.0.0.1:8080;  # 后端服务器1
        server 10.0.0.2:8080;  # 后端服务器2
        server 10.0.0.3:8080;  # 后端服务器3
    }
}

(2) 配置代理转发 (proxy_pass)

server 块中将请求转发到后端服务器组:

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://backend;  # 指向upstream名称
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

2. 负载均衡算法选择

Nginx 支持多种算法,根据需求选择:

算法 配置指令 适用场景
轮询(默认) 无需指定 后端服务器性能均衡的无状态服务
加权轮询 server ... weight=3; 后端服务器配置不均(权重越高,请求越多)
IP 哈希 ip_hash; 需要会话保持(如用户登录状态)
最少连接 least_conn; 后端服务器处理时间差异大
随机(带权重) random; 避免轮询热点

示例:加权轮询

upstream backend {
    server 10.0.0.1:8080 weight=3;  # 处理3倍请求
    server 10.0.0.2:8080 weight=1;
}

示例:IP 哈希

upstream backend {
    ip_hash;
    server 10.0.0.1:8080;
    server 10.0.0.2:8080;
}

3. 健康检查与故障转移

自动标记不可用服务器并启用备用节点:

upstream backend {
    server 10.0.0.1:8080 max_fails=3 fail_timeout=30s;  # 允许失败3次,超时30秒
    server 10.0.0.2:8080 backup;  # 备用服务器(主节点全部不可用时启用)
}
  • 参数说明
    • max_fails:最大失败次数。
    • fail_timeout:服务器恢复时间。
    • backup:标记为备用节点。

4. 高级优化配置

(1) 长连接复用

减少连接建立开销:

upstream backend {
    server 10.0.0.1:8080;
    keepalive 32;  # 每个Worker保持的连接池大小
}

server {
    location / {
        proxy_pass http://backend;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
    }
}

(2) 动态DNS解析

自动更新后端服务器IP(适用于云环境):

upstream backend {
    server backend.example.com resolve;  # 定期解析域名
    resolver 8.8.8.8 valid=30s;         # 指定DNS服务器和缓存时间
}

(3) 分片缓存

缓存后端响应,减轻负载:

proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m;

server {
    location / {
        proxy_pass http://backend;
        proxy_cache my_cache;
        proxy_cache_valid 200 302 10m;
    }
}

5. 完整配置示例

http {
    upstream backend {
        least_conn;               # 最少连接算法
        server 10.0.0.1:8080 weight=2 max_fails=3 fail_timeout=30s;
        server 10.0.0.2:8080;
        server 10.0.0.3:8080 backup;
        keepalive 32;
    }

    server {
        listen 80;
        server_name example.com;

        location / {
            proxy_pass http://backend;
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            
            # 超时控制
            proxy_connect_timeout 3s;
            proxy_read_timeout 10s;
        }

        # 健康检查端点(可选)
        location /health {
            access_log off;
            return 200 "OK";
        }
    }
}

6. 验证与监控

(1) 测试负载均衡

# 模拟请求(观察后端服务器日志)
for i in {1..10}; do curl http://example.com; done

(2) 监控状态

  • Nginx 状态页(需编译 ngx_http_stub_status_module):

    location /nginx_status {
        stub_status on;
        allow 127.0.0.1;
        deny all;
    }
    

    访问 http://localhost/nginx_status 查看活跃连接数。

  • 第三方工具

    • Prometheus + Grafana
    • Zabbix

常见问题

  1. 502 Bad Gateway
    • 检查后端服务是否运行,防火墙是否放行端口。
  2. 负载不均
    • 调整算法(如改用 least_conn)或权重。
  3. DNS 解析失败
    • 确保 resolver 配置正确,网络可达。

总结

  • 基础步骤:定义 upstream → 配置 proxy_pass → 选择算法。
  • 关键优化:健康检查、长连接、缓存。
  • 生产建议
    • 使用最少连接或IP哈希算法维持会话。
    • 启用健康检查避免请求转发到故障节点。
    • 监控后端服务器负载及时扩容。
学在每日,进无止境!更多精彩内容请关注微信公众号。
原文出处: 内容由AI生成仅供参考,请勿使用于商业用途。如若转载请注明原文及出处。
出处地址:http://www.07sucai.com/tech/970.html
版权声明:本文来源地址若非本站均为转载,若侵害到您的权利,请及时联系我们,我们会在第一时间进行处理。
轻松 一刻
>