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

相关推荐
記億揺晃着的那天8 小时前
NAS 内网域名访问为什么需要浏览器授权
网络·nginx·js·nas
骇客野人21 小时前
基于Nginx+Eureka+Apollo+Jenkins+SpringBoot Web系统分布式部署方案
nginx·eureka·jenkins
Kendra9191 天前
从 0 到上线:单文件网页 App 部署到阿里云 ECS 全流程(Nginx+Node+PM2+PostgreSQL)
nginx·阿里云·云计算·部署·个人开发·今天吃什么
暖核2 天前
Nginx 从入门到实践:部署、配置、反向代理与负载均衡全解
运维·nginx·负载均衡
.柒宇.2 天前
运维常见面试题_04_Nginx与DNS服务
运维·nginx·面试·dns
NGINX开源社区2 天前
NGINX Ingress Controller 5.5:安全性与性能提升,迁移更轻松
java·服务器·nginx
weixin_307779132 天前
PHP 大文件上传:内存占用、超时与最佳实践
linux·服务器·开发语言·nginx·php
闲云野鹤在人间2 天前
项目实战:LNMP-电商平台-ECshop
linux·运维·nginx·apache·lvs
暖核2 天前
Keepalived 高可用全解析:从 VRRP 原理到生产环境 Nginx 主备切换实践
网络·nginx·智能路由器
SatanII2 天前
403 禁地:Nginx 拒绝所有生者进入
运维·nginx