{{docContent.title}}

nginx负载均衡测试

首先,我们用Python来写一个最简单的提供4个端口的服务端口,代码如下

from flask import Flask
import threading

app = Flask(__name__)
app2 = Flask(__name__)
app3 = Flask(__name__)
app4 = Flask(__name__)

@app.route('/')
def server1():
    return '服务A'

@app2.route('/')
def server2():
    return '服务B'

@app3.route('/')
def server3():
    return '服务C'

@app4.route('/')
def server3():
    return '服务D'

def run_b():
    print('服务2启动')
    app2.run(port=82)

def run_c():
    print('服务3启动')
    app3.run(port=83)

def run_d():
    print('服务4启动')
    app4.run(port=84)

if __name__ == "__main__":
    # 先启动4个线程
    threading.Thread(target=run_b).start()
    threading.Thread(target=run_c).start()
    threading.Thread(target=run_d).start()
    print('服务1启动')
    app.run(port=81)

访问效果很简单,就是下面这个样子

最简单的轮询

http {
     # 待选服务器列表
    upstream loadBalancing{
        server 127.0.0.1:81;
        server 127.0.0.1:82;
        server 127.0.0.1:83;
        server 127.0.0.1:84;  
    }

    server {
        listen 8080;
        location / {
            # 使用负载均衡的代理
            proxy_pass http://loadBalancing;
        }
    }
}

效果就是按顺序进行访问。这里就不展示了

权重

    upstream loadBalancing{
        server 127.0.0.1:81 weight=1;
        server 127.0.0.1:82 weight=2;
        server 127.0.0.1:83 weight=3;
        server 127.0.0.1:84 weight=4;  
    }

这种就是那个weight高,那个访问的就越频繁

IP Hash

上述方式存在一个问题就是说,在负载均衡系统中,假如用户在某台服务器上登录了,那么该用户第二次请求的时候,因为我们是负载均衡系统,每次请求都会重新定位到服务器集群中的某一个,那么已经登录某一个服务器的用户再重新定位到另一个服务器,其登录信息将会丢失,这样显然是不妥的
我们可以采用ip_hash指令解决这个问题,如果客户已经访问了某个服务器,当用户再次访问时,会将该请求通过哈希算法,自动定位到该服务器
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题

     # 待选服务器列表
    upstream loadBalancing{
        ip_hash;
        server 127.0.0.1:81;
        server 127.0.0.1:82;
        server 127.0.0.1:83;
        server 127.0.0.1:84;  
    }

使用这个方法后,我们每次访问的都是同一个服务。因为我们的ip地址没有变

fair(第三方模块,需要自己安装)

fair采用的不是内建负载均衡使用的轮换的均衡算法,而是可以根据页面大小、加载时间长短智能的进行负载均衡。代码如下

upstream loadBalancing{
    server 127.0.0.1:81;
    server 127.0.0.1:82;
    server 127.0.0.1:83;
    server 127.0.0.1:84; 
    fair; 
}

url_hash(也是第三方模块)

按访问url的hash结果来分配请求,使每个url定向到同一个(对应的)后端服务器,后端服务器为缓存时比较有效。

upstream backserver {
    server squid1:3128;
    server squid2:3128;
    hash $request_uri;
    hash_method crc32;
}

其他标签

down和backup标签的简单展示

upstream loadBalancing{
    server 127.0.0.1:81;
    server 127.0.0.1:82;
    server 127.0.0.1:83 backup;
    server 127.0.0.1:84 down; 
}

down标识某一台server不可用,backup是备份机,所有服务器挂了之后才会生效

max_conns:限制分配给某台Server处理的最大连接数量,超过这个数量,将不会分配新的连接给它。默认为0,表示不限制。注意:1.5.9之后的版本才有这个配置

resolve:将server指令配置的域名,指定域名解析服务器。需要在http模块下配置resolver指令,指定域名解析服务

fail_timeout:默认为10秒。某台Server达到max_fails次失败请求后,在fail_timeout期间内,nginx会认为这台Server暂时不可用,不会将请求分配给它

max_fails:默认为1。某台Server允许请求失败的次数,超过最大次数后,在fail_timeout时间内,新的请求将不会分配给这台机器。如果设置为0,Nginx会将这台Server置为永久无效状态,然后将请求发给定义了proxy_next_upstream, fastcgi_next_upstream, uwsgi_next_upstream, scgi_next_upstream, and memcached_next_upstream指令来处理这次错误的请求。