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能有效提升服务的可用性和性能。

相关推荐
我最爱吃鱼香茄子6 小时前
【踩坑实录】若依Vue宝塔部署:验证码空白、反复提示登录状态已过期|完整排错
nginx·宝塔·若依·ruoyi‑vue·登录状态已过期
dazhong20127 小时前
Docker 进阶篇(二) Docker Compose 部署 Nginx 实践
nginx·docker·容器
笑梦无境12 小时前
nginx安装(5)
linux·运维·nginx
墨着染霜华1 天前
SpringCloud Gateway线上Nginx代理后自定义下划线请求头丢失(app_name/app_version获取不到)完美解决
nginx·spring cloud·gateway
流光D1 天前
AI Era: Building Web Sites and Configuring Nginx Reverse Proxy Process
前端·人工智能·nginx
Lsetea1 天前
Cloudflare报526 Invalid SSL certificate:源站证书与Nginx回源TLS排查
nginx·https·ssl证书·cloudflare·tls
姚不倒1 天前
负载均衡架构设计:F5 ↔ Nginx/HAProxy ↔ Keepalived 全链路映射
运维·网络·nginx
姚不倒1 天前
Tengine 实战:主动健康检查 + 动态 Upstream 配置
运维·网络·nginx
qetfw1 天前
Debian Nginx + PHP-FPM 配置:FastCGI、站点目录与访问验证
linux·nginx·debian·php
hzxpaipai1 天前
企业官网 Nginx 部署完整流程:HTTPS、301、静态缓存与日志配置
nginx·缓存·https