基于Nginx的负载均衡概述与实现

前面我们提到了LVS和Keepalived结合起来的高可用负载均衡,LVS根据原目ip地址及端口将其调度转发至后端 的某个主机,是一种四层的实现,因为LVS是四层的,所以不会受限于套接字或打开的文件数量。不过,如果我们想实现一些更高阶的功能,LVS就显得力不从心了,比如基于uri,cookie,header头部信息的负载均衡,此时我们就可以选择一些7层的负载均衡实现,比如Nginx或haproxy等。本次我们就先来讲讲Nginx的负载均衡。

正文:

其实,如果对LVS的各种类型和调度有清晰的认识,那么理解Nginx的负载均衡并没有什么难度,无非就是监听前端server的ip和端口,并指定后端可调用的服务器地址就好~虽然Nginx也有健康检测机制,但是只有在Nginx plus中才能能使用。不过如果后端服务的端口不存在Nginx倒也不会向其调用请求啦~那我们来具体说说。

uostream

ngin的负载均衡得用到upstream模块,它用来定义一个后端服务器组,即把所有后端的服务器整合在一起,然后通过proxy代理到这个服务器组。就能实现简单的http负载均衡了,upstream默认的调度方式是wrr(具体内容可参考LVS中的介绍),所以我们只用指定服务器的ip,如果端口不是默认80端口也可以单独指定,还有一些调度用到的参数,比如权重。如果只是干巴巴的介绍也很抽象,我们就根据配置来介绍吧。

http{
    ...
    upstream backserver {                  #backserver是一个自定义的名字,后面会调用
            server 172.16.53.101;          #第一个后端server
            server 172.16.53.102 ;          #第二个后端server
        }
    ...
    server {                               
        listen 80;
        server_name xiaofengfeng.cn;
        location / {
                proxy_pass      #代理到服务器组,此处只支持http/https
                index index.html;
        }
}

上面就是一个最简单的基于nginx的服务均衡配置了。upstream 的server后面还可以加许多参数,比如设置不同的权值weight=number,权值越大调用的次数越多。backup参数可以设置backup server,比如我们可以设置本机为backup server,当后端服务器都不能访问的时候,我们本机可以提供一个sorry 页面。

http{
    ...
    upstream backserver {
            server 172.16.53.101;
            server 172.16.53.102 ;
            server 127.0.0.1 backup;
              #指定本机回环地址为备用server,此处我们提供一个sorry server
        }
    server {
            listen 192.168.157.128:80;  #代理服务只监听前端服务的ip和端口
            server_name xiaofengfeng.cn;
            location / {
                    proxy_pass  ;
                    index index.html;
            }
    }
    server {
            listen 127.0.0.1:80;          #回环地址用来做sorry server
            server_name xiaofengfeng2.cn;
            location / {
                    root /var/nginx;
                    index index.html;
            }
    }
}

注:因为我们改变了监听的ip所以得重启nginx服务,而不是用nginx -s reload。

除了server配置选项还有其他一些常用的,比如我们可以改变其调用算法为wlc,即least_conn,就会根据后端服务器的连接数来调用。如果我们的一些用户信息,比如说session,cookie等保存在后端服务器本地,为了放置用户信息丢失,我们可以让一个用户的请求都发送到同一个后端服务器。ip_hash就可以实现这样的功能。来自同一个源IP地址的请求始终发往同一个upstream server。除了根据源地址hash,我们还可以指定特定的参数来作为hash的条件,比如,如果我们用uri作为hash条件,那么同一个uri的请求会发往同一台后端服务器。此时我们就要用到hash选项,比如:

hash $request_uri consistent

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/168de32d9c575928fed8d77e525cfb48.html