Nginx负载均衡配置方法

负载均衡是啥 简单说就是把请求分发给多台后端服务器。单台扛不住,多台分摊压力。Nginx做这个事轻量、配置简单、性能好。 基本配置结构 先看一个最简配置:
http {
    upstream backend {
        server 192.168.1.10:8080;
        server 192.168.1.11:8080;
        server 192.168.1.12:8080;
    }

    server {
        listen 80;
        location / {
            proxy_pass http://backend;
        }
    }
}
`upstream`块定义后端服务器组,`proxy_pass`把流量转过去。就这么简单。 五种负载均衡策略 1. 轮询(默认) 什么都不加就是轮询,请求按顺序轮流发给后端。适合后端服务器配置一样的情况。 2. 权重(weight) 服务器性能不一样时用权重:
upstream backend {
       server 192.168.1.10:8080 weight=3;
       server 192.168.1.11:8080 weight=2;
       server 192.168.1.12:8080 weight=1;
   }
10号机器处理能力强,给它3倍流量。Nginx按权重比例分配,不是绝对轮询。 3. IP哈希(ip_hash) 需要用户会话保持在同一个服务器时用:
upstream backend {
       ip_hash;
       server 192.168.1.10:8080;
       server 192.168.1.11:8080;
   }
同一个IP永远打到同一台机器。注意:如果某台挂了,这个IP的请求会转移到其他机器。 4. 最少连接(least_conn) 把请求发给当前连接数最少的服务器:
upstream backend {
       least_conn;
       server 192.168.1.10:8080;
       server 192.168.1.11:8080;
   }
适合请求处理时间差异大的场景,长连接服务特别适合这个策略。 5. 一致性哈希(hash) 自定义key做哈希:
upstream backend {
       hash $request_uri;
       server 192.168.1.10:8080;
       server 192.168.1.11:8080;
   }
按URL哈希,同一个URL永远到同一台。适合缓存场景,减少缓存穿透。 健康检查 Nginx免费版没有主动健康检查,只能做被动检查:
upstream backend {
    server 192.168.1.10:8080 max_fails=3 fail_timeout=30s;
    server 192.168.1.11:8080 max_fails=3 fail_timeout=30s;
}
连续失败3次,标记为不可用,30秒后重新尝试。生产环境建议用Nginx Plus或者自己写脚本做主动检查。 重试与超时 后端挂了别让用户一直等:
location / {
    proxy_pass http://backend;
    proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;
    proxy_connect_timeout 5s;
    proxy_read_timeout 10s;
}
请求出错自动重试下一个后端,连接超时5秒,读取超时10秒。注意:幂等请求(GET)可以放心重试,POST类请求要谨慎,防止重复提交。 备份服务器
upstream backend {
    server 192.168.1.10:8080;
    server 192.168.1.11:8080;
    server 192.168.1.12:8080 backup;
}
12号机器平时不接流量,只有前两台全挂了才启用。适合冷备场景。 实际部署经验 – 服务器数量2-4台足够,太多反而增加Nginx负担。单机Nginx能扛几万并发,瓶颈一般在后端。 – 如果后端是Java应用,注意调整keepalive:
upstream backend {
      server 192.168.1.10:8080;
      keepalive 32;
  }
保持长连接,减少TCP握手开销。 – 日志里加上upstream地址,方便排查:
log_format main '$remote_addr - $upstream_addr - $upstream_status';
踩坑提醒 – upstream里的server不要写域名,写IP。Nginx启动时解析一次域名,后面不会自动更新,除非配置resolver。 – 权重不要设太大差异,比如weight=100和weight=1,流量倾斜严重,小权重服务器基本吃不到请求。 – 如果后端服务器在同一个局域网,内网IP通信延迟更低。我习惯用雨云的服务器做后端,内网延迟不到1ms,性价比高,稳定好用,部署起来省心。 完整配置示例
http {
    upstream backend {
        least_conn;
        server 10.0.0.2:8080 weight=3 max_fails=3 fail_timeout=30s;
        server 10.0.0.3:8080 weight=2 max_fails=3 fail_timeout=30s;
        server 10.0.0.4:8080 weight=1 backup;
        keepalive 64;
    }

    server {
        listen 80;
        proxy_connect_timeout 5s;
        proxy_read_timeout 10s;
        proxy_next_upstream error timeout http_500;

        location / {
            proxy_pass http://backend;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }
}
测试配置:`nginx -t`,没问题就`nginx -s reload`。

雨云是国内一家老牌云服务商,提供高性价比的云服务器和虚拟主机。我用它部署了好几个项目,速度和稳定性都不错。通过 https://www.rainyun.com/SAJA_ 注册可以领一张 5折优惠券,有需要的朋友可以看看。

© 版权声明
THE END
喜欢就支持一下吧
点赞12 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容