使用nginx做负载均衡的两大模块: - upstream 定义负载节点池。
- location 模块 进行URL匹配。
- proxy模块 发送请求给upstream定义的节点池。
upstream模块解读
nginx 的负载均衡功能依赖于 ngx_http_upstream_module模块,所支持的代理方式有 proxy_pass(一般用于反向代理),fastcgi_pass(一般用于和动态程序交互),memcached_pass,proxy_next_upstream,fastcgi_next_pass,memcached_next_pass 。 upstream 模块应该放于http{}标签内。 模块写法: upstream backend { ip_hash; server backend1.example.com weight=5; server backend2.example.com:8080; server backup1.example.com:8080 backup; server backup2.example.com:8080 backup;} 实例一: upstream dynamic { zone upstream_dynamic 64k; server backend1.example.com weight=5; server backend2.example.com:8080 fail_timeout=5s slow_start=30s; server 192.0.2.1 max_fails=3; server backend3.example.com resolve; server backup1.example.com:8080 backup; server backup2.example.com:8080 backup;} 语法解释: nginx默认支持四种调度算法 - 轮询(rr),每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器故障,故障系统自动清除,使用户访问不受影响。
- 轮询权值(weight),weight值越大,分配到的访问几率越高,主要用于后端每个服务器性能不均的情况。
- ip_hash,每个请求按访问IP的hash结果分配,这样来自同一个IP的固定访问一个后端服务器,主要解决动态网站session共享的问题。
- url_hash,按照访问的URL的hash结果来分配请求,是每个URL定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率,nginx本身不支持,如果想使用需要安装nginx的hash软件包。
- fair,这个算法可以依据页面大小和加载时间长短智能的进行负载均衡,也就是根据后端服务器的响应时间来分配请求,相应时间短的优先分配,默认不支持,如果想使用需要安装upstream_fail模块。
- least_conn 最少链接数,那个机器连接数少就分发。
server模块的写法
server IP 调度状态 server指令指定后端服务器IP地址和端口,同时还可以设定每个后端服务器在负载均衡调度中的状态。 - down 表示当前的server暂时不参与负载均衡。
- backup 预留的备份服务器,当其他所有的非backup服务器出现故障或者忙的时候,才会请求backup机器,因为这台集群的压力最小。
- max_fails 允许请求失败的次数,默认是1,当超过最大次数时,返回proxy_next_upstream模块定义的错误。0表示禁止失败尝试,企业场景:2-3.京东1次,蓝汛10次,根据业务需求去配置。
fail_timeout,在经历了max_fails次失败后,暂停服务的时间。京东是3s,蓝汛是3s,根据业务需求配置。常规业务2-3秒合理。 例:如果max_fails是5,他就检测5次,如果五次都是502.那么,他就会根据fail_timeout 的值,等待10秒,再去检测。 server 如果接域名,需要内网有DNS服务器,或者在负载均衡器的hosts文件做域名解析。server后面还可以直接接IP或IP加端口。 长连接 keepalive
upstream backend { server backend2.example.com:8080; server backup1.example.com:8080 backup; keepalive 100;} 通过该指令配置了每个worker进程与上游服务器可缓存的空闲连接的最大数量。 当超出这个数量时,最近最少使用的连接将被关闭。keepalive指令不限制worker进程与上游服务器的总连接。 location / { # 支持keep-alive proxy_http_version 1.1; proxy_set_header Connection ""; proxy_pass http://backup;} - 如果是http/1.0 需要配置发送"Connection: Keep-Alive" 请求头。
- 上游服务器不要忘记开启长连接支持。
连接池配置建议 - 总长连接数是"空闲连接池"+"释放连接池"的长连接总数。
- 首先,长连接配置不会限制worker进程可以打开的总连接数(超了的作为短连接)。另外连接池一定要根据场景合理进行设置。
空闲连接池太小,连接不够用,需要不断建连接。 空闲连接池太大,空闲连接太多,还没使用就超时。 建议只对小报文开启长连接。
location 模块解读
location作用:基于一个指令设置URI。
基本语法: |