加入收藏 | 设为首页 | 会员中心 | 我要投稿 威海站长网 (https://www.0631zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长资讯 > 外闻 > 正文

负载均衡与反向代理(Nginx/OpenResty)

发布时间:2019-09-18 14:48:33 所属栏目:外闻 来源:今日头条
导读:我们使用Nginx时,大多数场景下使用的都是七层的HTTP负载均衡(ngx_http_upstream_module)。在1.9.0版本以后,Nginx也开始支持TCP(ngx_stream_upstream_module)四层负载均衡。 四层/七层负载均衡的区别 四层负载均衡,就是基于IP+端口的负载均衡(TCP/UDP)。

如上所示,如果其中一个分类在60S内的请求过多,则可以通过以下改进来平滑请求。

  1. local consistent_key = args.cat 
  2. if not consistent_key or consistent_key == '' then 
  3.  consistent_key = ngx_var.request_uri 
  4. end 
  5. -- 大于5000时,生成新key 
  6. local value = balancing_cache:get(consistent_key) 
  7. if value > 5000 then 
  8.  consistent_key = consistent_key .. '_' .. value 
  9. end 
  10. if not value then 
  11.  success, err = balancing_cache:set(consistent_key, 1, 60) 
  12. else 
  13.  newval, err = balancing_cache:incr(consistent_key, 1) 
  14. end 

least_conn:将请求负载均衡到最小活跃连接的上游服务器。如果配置的服务器较少,则转为基于权重轮询的算法。

除了上面的负载均衡策略,商业版的Nginx还提供了least_time,就是基于最小平均响应时间进行负载均衡。

失败重试

失败重试主要包含两部分配置:upstream server和proxy_pass。

  1. upstream backend { 
  2.  server 192.168.0.1:8080 max_fails=2 fail_timeout=10s weight=1; 
  3.  server 192.168.0.2:8080 max_fails=2 fail_timeout=10s weight=1; 

通过配置上游服务器的max_fails和fail_timeout,来指定每个上游服务器,当fail_timeout时间内失败了max_fails次请求,则认为该上游服务器不可用。然后剔除该服务器,fail_timeout时间后会再次将该服务器加入到存活列表中进行重试。

  1. location /test { 
  2.  proxy_connect_timeout 5s; 
  3.  proxy_read_timeout 5s; 
  4.  proxy_send_timeout 5s; 
  5.  proxy_next_upstream error timeout; 
  6.  proxy_next_upstream_timeout 10s; 
  7.  proxy_next_upstream_tries 2; 
  8.  proxy_pass http://backend; 
  9.  add_header upstream_addr $upstream_addr; 

上述参数详情请参见:《分布式系统超时重试》

健康检查

Nginx对上游服务器的健康检查采用的是惰性策略。(Nginx商业版提供了health_check的主动检查)社区版的Nginx可以集成nginx_upstream_check_module进行主动健康检查。配置如下:

TCP 心跳检查

  1. upstream backend { 
  2.  server 192.168.0.1:8080 weight=1; 
  3.  server 192.168.0.2:8080 weight=2; 
  4.  check interval=3000 rise=1 fall=3 timeout=2000 type=tcp; 
  • interval:检测间隔时间,此处配置了每隔3s检测一次。
  • fall:检测失败多少次后,上游服务器被标识为不存活。
  • rise:检测成功多少次后,上游服务器被标识为存活,并可以处理请求。
  • timeout:检测请求超时时间配置。

HTTP心跳检查

  1. upstream backend { 
  2.  server 192.168.0.1:8080 weight=1; 
  3.  server 192.168.0.2:8080 weight=2; 
  4.  check interval=3000 rise=1 fall=3 timeout=2000 type=http; 
  5.  check_http_send "HEAD /status HTTP/1.0rnrn"; 
  6.  check_http_expect_alive http_2xx http_3xx; 

HTTP心跳配置比TCP额外多了2个配置:

  • check_http_send:健康检查时所发送的请求内容。
  • check_http_expect_alive:当上游服务器返回匹配的状态码,就认为上游服务器存活。

这里面需要注意的是,健康检查的时间间隔不宜过短。否则有可能会造成拥堵,更甚至造成上游服务器挂掉。

长连接配置

可以使用 keepalive 指令配置Nginx与上游服务器可缓存的空闲连接的最大数量。当超出数量时,最近最少使用的连接将被关闭。keepalive指令不限制Worker进程与上游服务器的总连接数。

  1. upstream backend { 
  2.  server 192.168.0.1:8080 weight=1; 
  3.  server 192.168.0.2:8080 weight=2 backup; 
  4.  keepalive 100; 

要想与上游服务器建立长连接,还需要如下配置:

  1. location / { 
  2.  # 支持 keep-alive 
  3.  proxy_http_version 1.1; 
  4.  proxy_set_header Connection ""; 
  5.  proxy_pass http://backend; 

总长连接数=空闲连接池+释放连接池。首先,长连接配置不会限制Worker进程可以打开的总连接数(超出的作为短连接)。连接池需要根据不同的场景进行设置。

空闲连接池太小,连接不够用,就需要不断的重新建立连接;如果太大,就会造成还没用就超时了。

其他配置

(编辑:威海站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读