Nginx 学习笔记 (a4) —— 浅谈负载均衡
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>