NGINX负载均衡

使用nginx做代理,并不能解决后端节点的单点故障的问题,当后端出现问题时,代理并不能实现故障转移,故我们需要使用upstream关键字指定一个资源池,然后使用proxy_pass关键字将请求转发给资源池中的后端主机。

基本语法

upstream web_cluster {
    server [ip]:[port];
    server [ip]:[port][arg1][arg2];
}

调度算法

关键字作用示例备注
平均分发请求至资源池的每台主机默认最常用的一种做法,也是默认的做法
weight加权轮询参见weight根据权重比分发请求,适用于后端资源池主机硬件配置不一致的场合
ip_hash基于IP请求的历史分发请求至对应的主机参见ip_hash使某一特定IP的客户端再次请求时还连接上次的主机,容易造成某一主机的系统负载过高,而资源池内的其他主机空闲
url_hash根据历史请求的URI相对应的后端主机 ip_hash雷同,只不过此处是基于URL
least_conn根据资源池主机的连接数调度 哪台主机连接数少就多分发请求
weight
upstream web_cluster {
    server 10.0.0.20:80 weight=5;		#分配到10.0.0.20的请求多5个
    server 10.0.0.21:80;				#不指定权重即为0
    #......
}
ip_hash
upstream web_cluster {
    ip_hash;				#直接指定在该upstream{}中即可
    server 10.0.0.20:80;
    server 10.0.0.20:80;
    ......
}
#可以解决会话问题,但同时产生了新的问题,调度不均衡
#忙的忙死,闲的闲死

注:ip_hash不能和weight共用。

url_hash
upstream web_cluster {
    hash $request_uri;					#指定该uri
    server 10.0.0.20:80;
    server 10.0.0.21:80;
    ......
}
least_conn
upstream web_cluster {
    least_conn;
    server 10.0.0.20:80;
    server 10.0.0.21:80;
    ......
}

监视主机状态

关键字作用备注
down停机维护也可使用#号注释
backup备用主机如果资源池内的所有主机down掉,则转发客户端请求至backup
max_fails允许请求失败的次数常搭配fail_timeout使用
fail_timeout经过max_fails次数后,服务的暂停时间搭配max_fails使用
max_conns限制最大的接受连接数参见官网upstream模块
down
upstaream web_cluster {
    server 10.0.0.20:80 down;			#该主机目前不参与调度
    server 10.0.0.21:80;
    ......
}
backup
upstream web_cluster {
    server 10.0.0.20:80 backup;			#该主机为备用主机,backup主机只能指定一个,当所有主机都down机后,请求会被传递到该主机
    server 10.0.0.21:80;
    ......
}
max_fails
upstream web_cluster {
    server 10.0.0.20:80 max_fails=2 fail_timeout=[time];
    server 10.0.0.21:80;
    ......
}

添加第三方的nginx模块做状态监视

nginx默认的监视不是很友好,我们可以通过添加第三方的nginx模块来实现图形化监视资源池主机的健康状态。

首先下载nginx源码包和nginx_upstrem_check_module模块源码:

#由于nginx更新较快,具体版本可去nginx.org下载,故此处只放nginx_upstream_check_module的下载地址
#wget方法
wget https://github.com/yaoweibin/nginx_upstream_check_module/archive/master.zip
#git clone
git clone https://github.com/yaoweibin/nginx_upstream_check_module.git

进入到nginx源码包目录,然后执行:

patch -p1 < [patch_dirctory]*.patch					#选择补丁目录和对应版本

然后执行./configure根据需要添加编译参数,本机已安装过nginx,可以使用nginx -V显示编译信息后将内容粘贴在./configure后,记得追加--add-module=[patch-dir]的,指定我们的第三方补丁源码的位置。配置完成后执行make生成可执行文件,此可执行文件可以使用make install命令安装,也可以直接替换掉nginx的已安装的nginx主程序(可执行文件位于nginx编译目录下的objs内)

注: 替换时,要确保编译生成的nginx的编译参数与本机原有的nginx编译参数一致(可以追加参数,但不能删减参数),不然nginx有可能无法启动。

添加监视的资源池:

#TCP的方式,不会产生访问日志
upstream web_cluster {
    server 10.0.0.20:80;
    server 10.0.0.21:80;
    #......
    check interval=5000 rise=1 fall=3 timeout=4000;
    #指定间隔,请求数,失败次数,超时时间
}
#监视多个资源池
upstream app_cluster {
    server 10.0.0.50:8080;
    #......
    check interval=5000 rise=1 fall=3 timeout=4000;
}
#HTTP的方式
upstream video_cluster {
    server 10.0.0.70:80;
    server 10.0.0.71:80;
    #......
    #check interval=3000 rise=2 fall=5 timeout=1000 type=ssl_hello;
    #上为开启了SSL时的配置
    #下为普通HTTP的方式,会在该站点产生大量的访问日志,这些日志都来自nginx负载均衡主机
    #TCP模式较卡,但不会产生HTTP访问日志,若既想不产生日志有速度快,可在后端应用服务器上添加一个空站点,并关闭log
    check interval=3000 rise=2 fall=5 timeout=1000 type=http;
    check_http_send "HEAD / HTTP/1.0\r\n\r\n";
    check_http_expect_alive http_2xx http_3xx;
}
#server的配置,不固定
server {
    listen 80;
    server_name cluster.status.com;
    
    location / {
        check_status;
    }
}

其他

默认情况下,nginx的故障转移只能侦测到资源池内nginx服务的正常与否,并不能侦测到比如:php-fpm后端出问题时的故障(502),为了解决这个问题,可以在指定的server内添加如下字段:

server {
    ...
    proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
    #发生以上情况一率进行故障转移
}
#也可以将此字段加入我们的proxy_params文件内,以实现快速的在所有server内调用

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×