Nginx之负载均衡配置(二)

  前文咱们聊到了nginx做为负载均衡的配置,前端nginx做为调度器调度http或https请求,回顾请参考http://www.javashuo.com/article/p-tdqnqrnw-cn.html;其实nginx面向客户端一侧它除了能够代理http或https的请求外,它还能够代理tcp的请求,由于nginx它自己工做在应用层,一般状况下咱们把它代理tcp的请求叫作伪四层调度;在以前的文章中咱们有说到过四层调度,好比LVS,它就是一个纯粹的四层调度,用户的请求报文根本就不会到达应用层,在TCP通讯子网的三层或四层中就会把用户的请求处理(转发)调度给后端主机;早期版本的nginx是不支持tcp调度的,在1.9.0以后的版本中,nginx新增了ngx_stream_core_module模块后,就支持对tcp请求的调度;咱们来看看这个模块的相关介绍吧!!!html

  1、ngx_stream_core_module:此模块模拟了反代基于TCP或UDP的服务链接,即工做于传输层的反代或调度器;前端

    一、stream {……}:此指令只能用于mian配置段中,主要用于定义stream相关的服务;mysql

    二、listen:定义监听地址和端口;默认为tcp协议;此指令只能用于server 配置段中,表示定义虚拟主机的监听地址和端口;nginx

    三、server:定义虚拟服务器,此指令只能用于stream的配置段中;表示定义虚拟服务器的属性;用法相似http配置段的server用法;算法

  2、ngx_stream_proxy_module:此模块在1.9.0后的版本支持对tcp请求的代理,在1.9.13后的版本支持udp请求的代理和unix_domain sockets的代理;sql

    一、 proxy_pass address:设置代理服务器的地址。地址能够指定为一个域名或IP地址,以及一个端口或者unix-domain socket路径文件;后端

    二、proxy_timeout time:设置客户端或代理服务器链接上的两个连续读或写操做之间的超时。若是在此时间内没有传输数据,则链接关闭。默认时长是10分钟;服务器

    三、proxy_connect_timeout time;设置nginx与被代理的服务器尝试创建链接的超时时长;默认为60s;负载均衡

  3、ngx_stream_upstream_module:此模块(1.9.0)用于定义能够由proxy_pass指令引用的服务器组。dom

    一、upstream name {……}:此指令表示定义一个服务器组,以及组中各server的地址和属性,用法同ngx_http_upstream_module中的upstream用法一致,二者不一样的是这里的upstream只能用于stream配置段,表示该组服务器是支持经过nginx基于tcp或udp协议进行调度;

    二、server:定义组中服务器成员以及服务器属性;用法同ngx_http_upstream_module中的server用法一致;

    三、hash key:基于指定的key的hash表实现请求调度,此处的key能够文本、变量或两者的组合;同ngx_http_upstream_module中的hash指令用法一致;

    四、least_conn:定义调度算法为最近最少链接算法;当server拥有不一样的权重时为wlc;当全部后端主机的链接数相同时,则使用wrr进行调度;

  示例:

    提示:以上配置在/etc/nginx/nginx.conf这个主配置文件中的main配置段中配置,表示把/etc/nginx/conf.d/stream.d/下的全部以.conf的文件导入到该位置,这样配置咱们就能够把stream配置段单独的用一个文件来书写,方便管理;

    提示:以上配置表示在stream配置段中定义一个服务器组,名称为sshserver,该组下有两个服务器,分别是0.20的22号端口,和0.22的22号端口;而且在stream配置段中定义了一个虚拟主机,监听在192.168.0.30的41319号端口,该虚拟主机做用是接受用户的请求,而且基于用户的请求把用户请求代理到到sshserver组上,代理超时时间为60s,若是客户端请求该虚拟主机,在60s未获得任何响应,将被断开;设置nginx与被代理服务器创建链接的超时时长为10s;有了以上配置,咱们就能够经过访问192.168.0.30:41319这个socket就能够实现远程链接后端服务器;

  提示:从上面的现实结果咱们能够看到nginx此时能够代理ssh,并且仍是以轮询的方式向后端服务器调度客户端的请求;以这样的逻辑,咱们不难想象它能够基于tcp或udp代理其余应用层协议,好比nginx代理mysql也能够用相似的配置来代理后端mysql服务器;

  固然咱们也能够给不一样的服务器给定不一样的权重,这个配置同咱们上一篇文中的配置相同,都是用weight来指定权重;

    提示:以上配置就表示给定0.20的权重为5,0.22的权重为2,也就是说7个请求中有5个会被调度到0.20上,有2个会被调度到0.22上;

    提示:能够看到咱们给不一样的服务器加上不一样的权重后,客户端的请求也就以不一样比例调度到后端服务器上;不加权重默认是1;

  示例:

    提示:以上配置咱们在原有的基础上加了一组新负载均衡虚拟服务器,用于代理后端两台mariadb服务;

    提示:能够看到在默认状况下,nginx负载均衡是使用的rr轮询的调度算法;

  假如后端服务器宕机了,nginx还会日后端宕机的服务器上调度请求吗?

  提示:能够看到nginx不论是基于http仍是tcp调度用户请求都会自动对后端服务器作健康状态检测,当发现后端主机有服务不可用时,它就不会把用户的请求调度到有问题的主机上;

有关nginx基于tcp作伪四层调度的方法,基本上同基于http协议的七层调度方法是同样的,这里就不过多演示;更多有关于nginx的指令和配置说明请参考nginx官方文档http://nginx.org/en/docs/

相关文章
相关标签/搜索