Nginx-负载均衡

1. 负载均衡策略

Nginx支持多种负载均衡算法,通过upstream模块配置:

1.1 轮询(Round Robin)

  • 默认策略,按顺序分发请求。

  • 配置示例

    nginx 复制代码
    upstream backend {
        server backend1.example.com;
        server backend2.example.com;
    }

1.2 权重(Weighted Round Robin)

  • 根据服务器权重分配流量,权重越高请求越多。

  • 适用场景:后端服务器性能不均。

  • 配置示例

    nginx 复制代码
    upstream backend {
        server backend1.example.com weight=3;  # 处理3/5的请求
        server backend2.example.com weight=2;  # 处理2/5的请求
    }

1.3 IP哈希(IP Hash)

  • 根据客户端IP的哈希值固定分配到同一服务器。

  • 适用场景:需要会话保持(如Session)。

  • 配置示例

    nginx 复制代码
    upstream backend {
        ip_hash;
        server backend1.example.com;
        server backend2.example.com;
    }
  • 注意 :与weight参数不兼容,服务器宕机可能导致会话丢失。

1.4 最少连接(Least Connections)

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

  • 适用场景:处理长连接或请求耗时差异大的服务。

  • 配置示例

    nginx 复制代码
    upstream backend {
        least_conn;
        server backend1.example.com;
        server backend2.example.com;
    }

2. 健康检查

通过max_failsfail_timeout实现被动健康检查:

2.1 参数说明

  • max_fails :在fail_timeout时间内失败次数超过此值,标记服务器不可用。
  • fail_timeout:服务器被标记为不可用的时长,之后重新尝试。

2.2 配置示例

nginx 复制代码
upstream backend {
    server backend1.example.com max_fails=3 fail_timeout=30s;
    server backend2.example.com max_fails=2 fail_timeout=20s;
}
  • 行为 :30秒内失败3次,则backend1暂停30秒;20秒内失败2次,则backend2暂停20秒。

2.3 主动健康检查(需第三方模块)

  • 使用nginx_upstream_check_module模块定期主动探测:

    nginx 复制代码
    upstream backend {
        server backend1.example.com;
        server backend2.example.com;
        check interval=3000 rise=2 fall=5 timeout=1000 type=http;
        check_http_send "GET /health HTTP/1.1\r\nHost: localhost\r\n\r\n";
        check_http_expect_alive http_2xx http_3xx;
    }
    • interval:检查间隔(毫秒)。
    • rise:成功次数后标记为健康。
    • fall:失败次数后标记为不健康。

3. 高级配置

3.1 备用服务器(Backup)

  • 当主服务器全部不可用时启用。

    nginx 复制代码
    upstream backend {
        server backend1.example.com;
        server backend2.example.com;
        server backup.example.com backup;  # 备用服务器
    }

3.2 故障转移

  • 使用proxy_next_upstream定义重试条件:

    nginx 复制代码
    location / {
        proxy_pass http://backend;
        proxy_next_upstream error timeout http_500 http_502;
    }

3.3 动态DNS解析

  • 解决后端服务器IP变更问题:

    nginx 复制代码
    resolver 8.8.8.8 valid=30s;  # 使用Google DNS,30秒刷新
    upstream backend {
        server backend.example.com resolve;  # 动态解析域名
    }

4. 场景与策略选择

场景 推荐策略 配置要点
无状态服务,服务器性能均衡 轮询 无需额外参数。
服务器性能不均 权重 按性能分配weight值。
需要会话保持 IP哈希 确保用户请求固定后端。
长连接或处理时间差异大 最少连接 优化负载分配。
高可用性要求 健康检查 + Backup 设置max_failsbackup服务器。

5. 完整配置示例

nginx 复制代码
http {
    upstream backend {
        least_conn;
        server backend1.example.com weight=3 max_fails=2 fail_timeout=15s;
        server backend2.example.com weight=2 max_fails=3 fail_timeout=20s;
        server backup.example.com backup;
    }

    server {
        listen 80;
        location / {
            proxy_pass http://backend;
            proxy_next_upstream error timeout http_500;
        }
    }
}

6. 验证与测试

  1. 语法检查

    bash 复制代码
    nginx -t
  2. 重新加载配置

    bash 复制代码
    nginx -s reload
  3. 日志监控

    bash 复制代码
    tail -f /var/log/nginx/error.log

通过合理配置策略和健康检查,Nginx能有效提升服务的可用性和性能。

相关推荐
SHUIPING_YANG1 小时前
Nginx 返回 504 状态码表示 网关超时(Gateway Timeout)原因排查
运维·nginx·gateway
〆、风神4 小时前
面试真题 - 高并发场景下Nginx如何优化
java·nginx·面试
noravinsc14 小时前
国产化中间件 替换 nginx
运维·nginx·中间件
ZHOU_WUYI16 小时前
使用 Docker 部署 React + Nginx 应用教程
nginx·react.js·docker
梦在深巷、1 天前
nginx配置之负载均衡
运维·nginx·负载均衡
iRayCheung1 天前
Kind方式部署k8s单节点集群并创建nginx服务对外访问
nginx·kubernetes·kind
影龙帝皖2 天前
Linux服务之lvs+keepalived nginx+keepalived负载均衡实例解析
linux·nginx·lvs
nangonghen2 天前
Nginx stream模块是连接级别的负载均衡
nginx·负载均衡
YJQ99672 天前
Nginx与Tomcat负载均衡集群配置指南
nginx·tomcat·负载均衡
三天不学习2 天前
Vue3 本地环境 Vite 与生产环境 Nginx 反向代理配置方法汇总【反向代理篇】
运维·nginx·vue3·vite·反向代理