一、 需求说明
1. 系统要求:
Centos8操作系统
2. 负载均衡
通过Nginx实现地址轮询
3. 测试环境
通过docker环境制作两个简单的nginx前端页面,分别是nginx1和nginx2
通过部署Nginx负载,实现两个地址的轮询
二、 负载均衡的方式
负载均衡有3种方式:
l 循环机制:循环分发对应用服务器的请求
l 最少连接机制:将请求发送给连接数最少的服务器
l ip-hash机制:哈西函数用于确定请求被配那个服务器(基于客户端IP地址)
1. 轮询机制
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
适合服务器配置相当,无状态且短平快的服务使用。也适用于图片服务器集群和纯静态页面服务器集群。
优点:方式简便、成本低廉。
缺点:可靠性低和负载分配不均衡。
代码示例:
upstream balance {
server ip地址1;
server ip地址2;
}
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况
权重越高,在被访问的概率越大,如下例,分别是30%,70%。
upstream balance {
server ip地址1 weight=3;
server ip地址2 weight=7;
}
2. 最少连接机制
当某些请求耗费较长时间完成时,最少连接机制能让实例的负载更加均衡
在最少连接机制下nginx不会让大量请求使应用服务器超载,而是将请求分发至相对“悠闲”的服务器。
轮询算法是把请求平均的转发给各个后端,使它们的负载大致相同;但是,有些请求占用的时间很长,会导致其所在的后端负载较高。这种情况下,least_conn这种方式就可以达到更好的负载均衡效果。
代码示例:
当least_conn指令用在服务器组配置中时,最少连接机制就生效了。
upstream blance {
least_conn; #把请求转发给连接数较少的后端服务器
server ip地址1;
server ip地址2;
server ip地址3;
}
此负载均衡策略适合请求处理时间长短不一造成服务器过载的情况。
3. ip-hash机制
请注意循环或者最少连接数负载均衡机制,可能将同一客户端的请求分发至不同的服务器,无法保证相同客户端的请求总是会被指向相同服务器。
比如用户在某台服务器上登录了,那么该用户第二次请求的时候,因为我们是负载均衡系统,每次请求都会重新定位到服务器集群中的某一个,那么已经登录某一个服务器的用户再重新定位到另一个服务器,其登录信息将会丢失,所以为了使客户端请求总是分发向特定的服务器,就需要ip-hash负载均衡机制,如果客户已经访问了某个服务器,当用户再次访问时,会将该请求通过哈希算法,自动定位到该服务器。
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器(除非服务器不可用),可以解决session不能跨服务器的问题。
代码示例:
不加权重
upstream myapp1 {
ip_hash;
server ip地址1;
server ip地址2;
server ip地址3;
}
服务器权重没有配置,意味着所有服务器等权重的应用于负载均衡。循环机制下大量请求以统一的方式处理,各服务器基本会被分发数量相等的请求。权重参数指定给服务器,权重就作为负载均衡的决定条件。
添加加权重
upstream myapp1 {
ip_hash;
server ip地址1 weight=3;
server ip地址2;
server ip地址3;
}
在上面的配置中每5个请求,3个会被指向ip地址1,1个指向ip地址2,1个指向ip地址3。
此策略适合有状态服务,比如session,当有服务器需要剔除,必须手动down掉。
4. 其他机制
还有一些机制需要通过安装第三方插件来实现,比如:fair、url_hash
1) fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
#实现响应时间短的优先分配
upstream dynamic_tsingxin {
server ip地址1;
server ip地址2;
fair;
}
2) url_hash(第三方)
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,要配合缓存命中来使用。同一个资源多次请求,可能会到达不同的服务器上,导致不必要的多次下载,缓存命中率不高,以及一些资源时间的浪费。而使用url_hash,可以使得同一个url(也就是同一个资源请求)会到达同一台服务器,一旦缓存住了资源,再此收到请求,就可以从缓存中读取。
#实现每个url定向到同一个后端服务器
upstream dynamic_tsingxin {
server ip地址1;
server ip地址2;
hash $request_uri;
hash_method crc32;
}
注意:在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法。
三、 负载状态设置:
1.down:表示单前的server暂时不参与负载
2.weight:默认为1。weight越大,负载的权重就越大
3.max_fails:允许请求失败的次数,默认为1。当超过最大次数时,返回proxy_next_upstream模块定义的错误
4.fail_timeout:max_fails次失败后,暂停的时间
5.backup:预留的备份服务器。 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻
6.max_conns:限制最大的接收连接数
四、 Nginx安装
注:如果你使用的是CentOS8,直接使用第三步命令即可安装。
第一步:安装yum-utils
yum install yum-utils
[root@LoadBalance yum.repos.d]# yum install yum-utils
Last metadata expiration check: 0:00:51 ago on Fri 30 Apr 2021 05:45:05 PM CST.
Dependencies resolved.
==================================================================================================
Package Architecture Version Repository Size
==================================================================================================
Installing:
yum-utils noarch 4.0.17-5.el8 baseos 68 k
Transaction Summary
==================================================================================================
Install 1 Package
Total download size: 68 k
Installed size: 20 k
Is this ok [y/N]: y
Downloading Packages:
yum-utils-4.0.17-5.el8.noarch.rpm 532 kB/s | 68 kB 00:00
-----------------------------------------------------------------------------------
Total 79 kB/s | 68 kB 00:00
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Installing : yum-utils-4.0.17-5.el8.noarch 1/1
Running scriptlet: yum-utils-4.0.17-5.el8.noarch 1/1
Verifying : yum-utils-4.0.17-5.el8.noarch 1/1
Installed:
yum-utils-4.0.17-5.el8.noarch
Complete!
第二步:创建nginx.repo文件
/etc/yum.repos.d/nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
第三步:安装Nginx
注:如果你使用的是CentOS8,直接使用第三步命令即可安装。
[root@LoadBalance yum.repos.d]# yum install nginx
Last metadata expiration check: 0:01:00 ago on Fri 30 Apr 2021 05:45:05 PM CST.
Dependencies resolved.
==============================================================
Package Architecture Version Repository Size
==============================================================
Installing:
nginx x86_64 1:1.20.0-1.el8.ngx nginx-stable 820 k
Transaction Summary
==============================================================
Install 1 Package
Total download size: 820 k
Installed size: 2.8 M
Is this ok [y/N]: y
Downloading Packages:
nginx-1.20.0-1.el8.ngx.x86_64.rpm 247 kB/s | 820 kB 00:03
-----------------------------------------------------------------------------------
Total 247 kB/s | 820 kB 00:03
warning: /var/cache/dnf/nginx-stable-614ef03fac352fea/packages/nginx-1.20.0-1.el8.ngx.x86_64.rpm: Header V4 RSA/SHA1 Signature, key ID 7bd9bf62: NOKEY
nginx stable repo 1.1 kB/s | 1.5 kB 00:01
Importing GPG key 0x7BD9BF62:
Userid : "nginx signing key
Fingerprint: 573B FD6B 3D8F BC64 1079 A6AB ABF5 BD82 7BD9 BF62
From : https://nginx.org/keys/nginx_signing.key
Is this ok [y/N]: y
Key imported successfully
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Running scriptlet: nginx-1:1.20.0-1.el8.ngx.x86_64 1/1
Installing : nginx-1:1.20.0-1.el8.ngx.x86_64 1/1
Running scriptlet: nginx-1:1.20.0-1.el8.ngx.x86_64 1/1
---------------------------------------------------------------------
Thanks for using nginx!
Please find the official documentation for nginx here:
* https://nginx.org/en/docs/
Please subscribe to nginx-announce mailing list to get
the most important news about nginx:
* https://nginx.org/en/support.html
Commercial subscriptions for nginx are available on:
* https://nginx.com/products/
----------------------------------------------------------------------
Verifying : nginx-1:1.20.0-1.el8.ngx.x86_64 1/1
Installed:
nginx-1:1.20.0-1.el8.ngx.x86_64
Complete!
第四步:启动Nginx
启动前,请关闭Selinux,防止访问报错
[root@LoadBalance yum.repos.d]# systemctl start nginx
五、 配置负载均衡
[root@LoadBalance ~]# vim /etc/nginx/nginx.conf
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
upstream balance { #负载的配置(upstream)必须在http模块内
#ip_hash; #注释掉了ip_hash,则默认是轮询
server 10.78.56.63:9991; #添加集群
server 10.78.56.63:9992;
}
server {
listen 8080; #服务监听的端口
server_name 10.78.56.101; #服务访问IP
location / {
#index http://10.78.56.101:8080
proxy_pass http://balance; #和前面upstream的命名一致
}
}
}
[root@LoadBalance ~]# systemctl restart nginx #重启服务