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

相关推荐
Re_Virtual8 小时前
centos 7环境下构建nginx 1.30
nginx·centos·rpmbuild
tonydf18 小时前
Nginx爆新的RCE漏洞!别担心,平滑升级即可。
后端·nginx
曹牧19 小时前
Nginx 504
运维·nginx
rockmelodies21 小时前
CentOS Stream 源码编译安装 Nginx 1.31.0(静态依赖版)
运维·chrome·nginx
成为你的宁宁1 天前
【Prometheus监控Nginx/Mysql/Redis/Docker/Rabbitmq】
mysql·nginx·prometheus
阿里-于怀1 天前
告别 Ingress Nginx:云原生 API 网关 Gateway API 使用指引
nginx·云原生·gateway
難釋懷1 天前
Nginx应用场景
运维·nginx
持梦远方1 天前
Nginx 静态资源挂载与前端部署实战笔记
linux·前端·笔记·nginx
艾莉丝努力练剑1 天前
【Linux网络】Linux 网络编程:HTTP(四)从手写服务器到生产级 Nginx 与 cpp-httplib 实战
linux·运维·服务器·网络·c++·nginx·http
Linux运维技术栈1 天前
一次暴力枚举攻击的防御实践:从 IP 封禁到 WAF,再到 Nginx+Lua 业务层防御
tcp/ip·nginx·安全·lua·云服务器