NGINX 负载均衡配置

小TOT 创建于 2017-02-07

什么是负载均衡

负载均衡(又称为负载分担),英文名称为Load Balance,其意思就是将负载(工作任务)进行平衡、分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。负载均衡一般分为硬件负载均衡和软负载均衡。其中硬件负载均衡以F5为代表,软负载均衡实现的方式有很多种,不同的服务器都有自己实现,下面介绍下nginx如何配置负载均衡。

nginx的upstream

upstream是Nginx的HTTP Upstream模块,这个模块通过一个简单的调度算法来实现客户端IP到后端服务器的负载均衡。在上面的设定中,通过upstream指令指定了一个负载均衡器的名称ixdba.net。这个名称可以任意指定,在后面需要的地方直接调用即可。 nginx的upstream目前支持4种方式的分配

轮询(默认) : 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某台服务器宕机,故障系统被自动剔除,使用户访问不受影响。Weight 指定轮询权值,Weight值越大,分配到的访问机率越高,主要用于后端每个服务器性能不均的情况下。

ip_hash : 每个请求按访问IP的hash结果分配,这样来自同一个IP的访客固定访问一个后端服务器,有效解决了动态网页存在的session共享问题。当然如果这个节点不可用了,会发到下个节点,而此时没有session同步的话就注销掉了。

least_conn : 请求被发送到当前活跃连接最少的realserver上。会考虑weight的值。

url_hash : 此方法按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率。Nginx本身是不支持url_hash的,如果需要使用这种调度算法,必须安装Nginx 的hash软件包 nginx_upstream_hash 。

fair : 这是比上面两个更加智能的负载均衡算法。此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。Nginx本身是不支持fair的,如果需要使用这种调度算法,必须下载Nginx的 upstream_fair 模块。

upstream 配置如下;

upstream backend{
    ip_hash;
    server 192.168.12.133:80;
    server 192.168.12.134:80  down;
    server 192.168.12.135:8009  max_fails=3  fail_timeout=20s;
    server 192.168.12.136:8080 backup;
}

server{

   location /{
       proxy_pass http://backend;

    }
}

Upstream可对后端服务器进行健康检查。

a) down表示当前的server暂时不参与负载。

b) weight默认为1.weight越大,负载的权重就越大。

c) max_fails :在fail_timeout时间内对后台服务器请求失败的次数。

d) fail_timeout:max_fails次失败后,暂停的时间。

e) backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。

使用nginx的sticky模式

这个模块的作用是通过cookie黏贴的方式将来自同一个客户端(浏览器)的请求发送到同一个后端服务器上处理,这样一定程度上可以解决多个backend servers的session同步的问题 —— 因为不再需要同步,而RR轮询模式必须要运维人员自己考虑session同步的实现。

另外内置的 ip_hash也可以实现根据客户端IP来分发请求,但它很容易造成负载不均衡的情况,而如果nginx前面有CDN网络或者来自同一局域网的访问,它接收的客户端IP是一样的,容易造成负载不均衡现象。淘宝Tengine的 ngx_http_upstream_session_sticky_module 也是类似的功能。nginx-sticky-module的cookie过期时间,默认浏览器关闭就过期,也就是会话方式。

这个模块并不合适不支持 Cookie 或手动禁用了cookie的浏览器,此时默认sticky就会切换成RR。它不能与ip_hash同时使用。

sticky的配置

配置起来超级简单,一般来说一个sticky指令就够了。 sticky [name=route] [domain=.foo.bar] [path=/] [expires=1h] [hash=index|md5|sha1] [no_fallback];:

name: 可以为任何的 string 字符,默认是 route domain:哪些域名下可以使用这个 cookie path:哪些路径对启用 sticky,例如 path/test,那么只有 test 这个目录才会使用 sticky 做负载均衡 expires:cookie 过期时间,默认浏览器关闭就过期,也就是会话方式。 no_fallbackup:如果设置了这个,cookie 对应的服务器宕机了,那么将会返回502(bad gateway 或者 proxy error),建议不启用

upstream backend{
    sticky;# 使用该模式可以解决大多数问题
    server 192.168.12.133:80;
    server 192.168.12.134:80  down;
    server 192.168.12.135:8009  max_fails=3  fail_timeout=20s;
    server 192.168.12.136:8080 backup;
}