nginx+keepalived 双主热备负载均衡
前端
负载均衡技术对于一个网站尤为是大型网站的web服务器集群来讲是相当重要的!作好负载均衡架构,能够实现故障转移和高可用环境,避免单点故障,保证网站健康持续运行。不少企业的网络架构都须要用到nginx+keepalived的负载均衡技术,此时能够用到两种模式,分别是主从模式和双主模式,这两种模式的主要区别是:主从模式其中的一台备用机是长时间处于空闲状态的,而双主模式的两台调度器都是一块儿工做,这样能合理利用资源以及分担在一台前端nginx服务器上的压力。nginx
实现的过程主要仍是分为两个过程:web
1、前端两台nginx作反向代理到后面两台web服务器vim
2、对前端两台nginx作keepalived(心跳检测) 后端
基本配置缓存
前端nginx fjw133:192.168.10.133 vip1:192.168.10.200(主) 192.168.10.200(备)bash
前端nginx fjw134:192.168.10.134 vip1:192.168.10.200(主) 192.168.10.220(备)服务器
后端web服务器 fjw132:192.168.10.132 网络
后端web服务器 fjw135:192.168.10.135架构
1、先配置前端nginx反向代理
在fjw133上安装nginx
一、wget nginx安装包
cd /usr/local/nginx
wget http://nginx.org/download/nginx-1.13.6.tar.gz
二、建立nginx用户
useradd nginx -s /sbin/nologin -M
三、解压
tar -zxvf nginx-1.13.6.tar.gz
cd nginx-1.13.6
四、编译
./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-pcre
make && make install
五、检测配置文件
/usr/local/nginx/sbin/nginx -t
/usr/local/nginx/sbin/nginx -s start
/usr/local/nginx/sbin/nginx -s reload
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
/usr/local/nginx/sbin/nginx -s reload
六、修改配置文件
vim /usr/local/nginx/conf/nginx.conf
#运行用户 #user nobody; #启动进程,一般设置成和cpu的数量相等 worker_processes 1; #全局错误日志及PID文件 #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; error_log /usr/local/nginx/logs/error.log notice; pid /usr/local/nginx/logs/nginx.pid; events { #单个后台worker process进程的最大并发连接数 worker_connections 1024; } http { ##设定mime类型,类型由mime.type文件定义 include 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 logs/access.log main; #开启高效文件传输模式 sendfile on; #如下两个选项用于防止网络阻塞 tcp_nopush on; #长连接超时时间 keepalive_timeout 65; #打开gzip压缩 gzip on; upstream backend { server 192.168.10.132:80 max_fails=3 fail_timeout=30s;#代理的web服务 server 192.168.10.135:80 max_fails=3 fail_timeout=30s;#最大失败3次直接踢掉,超过30秒踢掉 } server { listen 80; #监听端口 server_name localhost #charset koi8-r; ##access_log logs/host.access.log main; location / { proxy_pass http://backend; ##对应上面upstream定义的backend proxy_store off; ##启用本地缓存功能 proxy_redirect off; ##指定修改被代理服务器返回的响应头中的location头域跟refresh头域数值 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; ##定义或添加字段传递给代理服务器的请求头。 proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $host; } } }
七、检测配置文件并从新加载服务
/usr/local/nginx/sbin/nginx -t
/usr/local/nginx/sbin/nginx -s reload
一样的步骤去配置fjw134,配置文件也相同,就再也不演示
八、而后配置后端两台web服务器
我用的也是nginx作web服务器,安装过程和上面同样,只须要发布网站就能够,也不详细演示
九、接着能够作keepalived的部分,安装keepalived
yum install -y keepalived
十、修改配置文件
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived global_defs { notification_email { #故障发生时给谁发邮件 root@localhost } notification_email_from root@fjw133 #通知邮件从哪一个地址发出 smtp_server localhost smtp_connect_timeout 30 #链接smtp服务器的超时时间 router_id hostname #上面都是发邮件的部分,这里就不演示 } vrrp_script chk_http_port { script "/test/check_nginx.sh" interval 2 weight -5 fall 2 rise 1 } vrrp_instance VI_1 { state MASTER #另外一台的状态是BACKUP interface ens33 virtual_router_id 51 #另外一台的id要保持同样 priority 100 ##权重必须比BACKUP高 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.10.200 } track_script { chk_nginx } } vrrp_instance VI_2 { state BACKUP #另外一台的状态是MASTER interface ens33 virtual_router_id 52 #与另外一台的id要保持同样 priority 99 #权重必须比master低 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.10.220 } track_script { chk_http_port } }
十一、fjw134也一样要装keepalived,其配置文件是
! Configuration File for keepalived global_defs { notification_email { root@localhost } notification_email_from root@localhost smtp_server localhost smtp_connect_timeout 30 router_id NodeA } vrrp_script chk_nginx { ##这个部分定义nginx反向代理服务的检测脚本 script "/test/nginx_check.sh" ##脚本路径 interval 2 ##检测周期 weight -2 ##若是脚本被执行,那么优先级将会下降2 fall 2 ##指监控几回判断为失败 rise 1 ##指监控几回判断为成功 } vrrp_instance VI_1 { state BACKUP interface ens33 virtual_router_id 51 priority 99 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.10.200 } track_script { chk_nginx } } vrrp_instance VI_2 { state MASTER interface ens33 virtual_router_id 52 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.10.220 } track_script { chk_nginx } }
十二、/test/check_nginx.sh是检测nginx的脚本,若是nginx服务忽然down,脚本会自动重启nginx,若是起不了就关掉keepalived,这样服务就转到另外一台前端nginx
vim /test/check_nginx.sh
#!/bin/sh A=`ps -C nginx --no-header | wc -l` if [ $A -eq 0 ] ; then /usr/local/nginx/sbin/nginx sleep 2 A=`ps -C nginx --no-header | wc -l` if [ $A -eq 0 ] ; then systemctl stop keepalived fi fi
1三、此时能够查看两个vip,已经分别分配到两台前端nginx上
[root@fjw133 ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:0a:17:8a brd ff:ff:ff:ff:ff:ff
inet 192.168.10.133/24 brd 192.168.10.255 scope global ens33
valid_lft forever preferred_lft forever
inet 192.168.10.200/32 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::9c2e:cd7b:fea:3bf9/64 scope link
[root@fjw134 ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:95:72:dc brd ff:ff:ff:ff:ff:ff
inet 192.168.10.134/24 brd 192.168.10.255 scope global ens33
valid_lft forever preferred_lft forever
inet 192.168.10.220/32 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::46e:7225:ebf3:f9ca/64 scope link
valid_lft forever preferred_lft forever
inet6 fe80::538f:f55f:2ea8:6dd9/64 scope link tentative dadfailed
valid_lft forever preferred_lft forever
inet6 fe80::9c2e:cd7b:fea:3bf9/64 scope link tentative dadfailed
valid_lft forever preferred_lft forever
1四、测试关闭fjw133的nginx服务,但服务仍是会自动起来 ,fjw134也是同样
[root@fjw133 ~]# /usr/local/nginx/sbin/nginx -s stop
[root@fjw133 ~]# netstat -ntpl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 13847/nginx: master
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 878/sshd
1五、关闭fjw133的keepalived,VIP1会跳到fjw134上
[root@fjw133 ~]# systemctl stop keepalived
[root@fjw134 ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:95:72:dc brd ff:ff:ff:ff:ff:ff
inet 192.168.10.134/24 brd 192.168.10.255 scope global ens33
valid_lft forever preferred_lft forever
inet 192.168.10.220/32 scope global ens33
valid_lft forever preferred_lft forever
inet 192.168.10.200/32 scope global ens33
valid_lft forever preferred_lft forever
1六、即便一台前端nginx关掉了,访问两个VIP仍是能够轮询访问两个web服务器发布的网页