nginx实现请求的负载均衡 + Keep Alive实现nginx的高可用
nginx实现请求的负载均衡 + Keep Alive实现nginx的高可用
实践中客户端无法直接跟服务端发起请求的时候,我们就需要代理服务。代理可以实现客户端与服务端之间的通信,我们的Nginx也可以实现相应的代理服务。代理分为正向代理和反向代理,此文就来演示一下Nginx配置正向代理和反向代理的场景。
什么是正向代理/反向代理?
- 正向代理:是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理。
- 反向代理:客户端发送请求给反向代理服务器,但是代理服务器上没有客户端需要的资源,代理服务器会判断转发到原始服务器获得资源,并把资源返回给客户端;在整个过程,客户端不知道自己访问的是一个代理服务器,而是一个原始服务器
常规部署方案
Nginx反向代理
web01和web02安装nginx可以参考我之前的博客:Django + Uwsgi + Nginx 的生产环境部署之实战篇
-
web01配置
[root@linux-node4 ~]# yum -y install nginx [root@linux-node4 ~]# echo web01 > /usr/share/nginx/html/index.html
-
web02配置
[root@linux-node4 ~]# yum -y install nginx [root@linux-node4 ~]# echo web01 > /usr/share/nginx/html/index.html
-
然后对着两个web服务器进行测试nginx服务
start nginx
nginx反向代理配置
安装nginx服务器
[root@linux-node4 ~]# yum -y install nginx
配置反向代理
stream {
log_format main '$remote_addr $upstream_addr - [$time_local] $status $upstream_bytes_sent';
access_log /var/log/nginx/django-access.log main;
upstream django-apiserver {
server 192.168.56.62:80; //web服务器ip
server 192.168.56.63:80;
}
server {
listen 88; //Nginx代理端口
proxy_pass django-apiserver;
}
}
-
测试反向代理可用性
http://192.168.56.62/ # web01 http://192.168.56.63/ # web02 # 可以停止一个nginx服务,测试可用性
Nginx+KeepAlive方案
为什么使用Nginx+KeepAlive方案部署?
因为我们是使用nginx实现的反向代理,实现负载均衡,如果这个nginx挂了,我们整个服务都会挂掉,所以这个Nginx+KeepAlive方案就被广泛使用,原理就是帮我们的nginx的服务器找一个备胎,如果我们的主服务器没有事的话,就正常运行,备胎就什么活都不干,假如主服务器挂掉,我们的备胎(nginx从服务器)就被扶正了。
部署nginx负载均衡
-
安装nginx服务
[root@linux-node4 ~]# yum -y install nginx
-
配置反向代理
[root@lb-master ~]# vim /etc/nginx/nginx.conf //这个跟之前的配置一样 stream { log_format main '$remote_addr $upstream_addr - [$time_local] $status $upstream_bytes_sent'; access_log /var/log/nginx/django-access.log main; upstream django-apiserver { server 192.168.56.62:80; server 192.168.56.63:80; } server { listen 88; proxy_pass django-apiserver; } }
测试反向代理可用性
-
测试集群可用性
http://192.168.56.62/ # web01 http://192.168.56.63/ # web02 # 可以停止一个nginx服务,测试可用性
-
服务管理
//启动nginx [root@lb-slave ~]# systemctl start nginx //重启nginx [root@lb-slave ~]# systemctl enable nginx
KeepAlive安装与配置
安装keepAlive
[root@lb-master ~]# yum -y install keepalived
keepalive-master配置修改
-
主服务器。。。
-
注:默认的keepalived.conf配置太多,直接删除,用下面配置替换即可
-
192.168.56.61
[root@lb-master ~]# vim /etc/keepalived/keepalived.conf
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id NGINX_MASTER
}
# 健康监测nginx
vrrp_script check_nginx {
script "/etc/keepalived/check_nginx.sh" # 设置检查nginx是否存活的脚本位置
}
# keepalive热备组配置
vrrp_instance VI_1 {
state MASTER # 配置当前keepalive为master角色
interface eth0 # 网卡名字,必须和实际网卡名称一致,默认是ens33
virtual_router_id 51 # VRRP 路由 ID实例,每个实例是唯一的
priority 100 # 优先级,备服务器设置 90
advert_int 1 # 指定VRRP 心跳包通告间隔时间,默认1秒
authentication {
auth_type PASS
auth_pass 1111 # 设置keepalive的master和slave之间简单的秘钥认证
}
virtual_ipaddress {
192.168.56.60/24 # 设置keepalive虚拟IP地址
}
track_script {
check_nginx
}
}
keepalive-slave配置修改
-
注:默认的keepalived.conf配置太多,直接删除,用下面配置替换即可
-
192.168.56.64
[root@lb-master ~]# vim /etc/keepalived/keepalived.conf
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id NGINX_BACKUP
}
vrrp_script check_nginx {
script "/etc/keepalived/check_nginx.sh"
}
vrrp_instance VI_1 {
state BACKUP # 设置keepalive角色为backend
interface eth0 # 设置虚拟网卡名称
virtual_router_id 51 # VRRP 路由 ID实例,每个实例是唯一的,master和slave保持一致即可
priority 90 # 优先级,备服务器设置 90
advert_int 1 # 指定VRRP 心跳包通告间隔时间,默认1秒
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.56.60/24 # 设置虚拟网卡地址
}
track_script {
check_nginx
}
}
添加nginx健康监测脚本
[root@lb-master keepalived]# vim /etc/keepalived/check_nginx.sh
#!/bin/bash
count=$(ps -ef |grep nginx |egrep -cv "grep|$$")
if [ "$count" -eq 0 ];then
exit 1
else
exit 0
fi
[root@lb-master keepalived]# chmod +x /etc/keepalived/check_nginx.sh # 给脚本添加一个可执行
权限
启动keepalive命令
[root@lb-master ~]# systemctl start keepalived
[root@lb-master ~]# systemctl enable keepalived
测试keepalive高可用
- 测试使用 http://192.168.56.60:88/ 虚拟IP访问
- 在浏览器中访问: http://192.168.56.60 http://192.168.56.61 http://192.168.56.64 都可以访问web1和web2服务
- 关闭lb-master(192.168.56.61)的nginx测试VIP是否漂移到备节点
- 在192.168.56.61中停止nginx服务(lb-master),lb-slave中可以接替master的服务
- 依然可以使用 http://192.168.56.60:88/ 访问web01和web02服务
使用ip addr 可以查看ip地址
项目部署并发分析
并发常用名词
-
PV(访问量): 页面访问量,页面刷新一次算一次。
-
UV(独立访客): 即Unique Visitor,一个客户端(电脑,手机)为一个访客;
-
DAU(日活跃用户数):登录或使用了某个产品的用户数,这与流量统计工具里的访客(UV)概念相似。
-
峰值QPS:
原理:每天80%的访问集中在20%的时间里,这20%时间叫做峰值时间
公式:( 总PV数 * 80% ) / ( 每天秒数 * 20% ) = 峰值时间每秒请求数(QPS)
- QPS/TPS(每秒查询率):每秒能够查询次数(QPS/TPS= 并发数 / 平均响应时间)
并发数:并发数是指系统同时能处理的请求数量,这个也是反应了系统的负载能力。
吐吞量:吞吐量是指系统在单位时间内处理请求的数量
响应时间(RT):响应时间是指系统对请求作出响应的时间,一般取平均响应时间