Aaron Lau(韩栖)

Nginx 学习笔记 (a4) —— 浅谈负载均衡

459 字

Nginx 以高并发、低消耗而闻名,很适合作为一个负载均衡器,有策略地分发请求给不同的后端服务器。避免单点故障之余,亦增强整个系统的可用性,简单说不容易宕机。假设有一组名为 backend 的 upstream,调用方式是 proxy_pass http://backend。

热备:平时使用 www 提供服务,bad 暂时下线,bak 作为发生故障时兜底的一台机器。

upstream backend {
    server www.example.com;
    server bad.example.com down;
    server bak.example.com backup;
}

轮询是经(mò)典(rèn)的负载均衡算法,按照时间先后来分发请求。理论上会跳过不能用的 server,但预设的超时太长,实务上可把 proxy_connect_timeout 等改成 1。最小连接(least_conn)因应忙闲不均而生,把新请求分发至没那么忙的主机。源地址哈希(ip_hash)保证一个用户对应一台服务器,解决 Session 不一致的问题(通常表现为无法登录),但出于容灾理由,不建议大量使用。

集群中难免有算力不均的情况。不问性能的齐头式平等,很可能让配置最差的那个服务器决定整个集群的性能。可跑一次 bench.sh,再依据测试结果分配权重;max_fails 缺省值是 1,fail_timeout 缺省值是 10s。

upstream backend {
    server srv1.example.com weight=3;
    server srv2.example.com max_fails=2 fail_timeout=1d;
    server srv3.example.com;
}

即使某台后端返回了 500,它也会参与负载均衡,毕竟能收到状态码就表示它还活着。但这在用户眼里跟 Connection Refused 可没啥区别,所以把 500 一并纳入“在下一台服务器重试”的机制里。

proxy_next_upstream error timeout http_500;

<small>原载 App-scope,有删改。</small>

App-scope · 教程 · Nginx