Nginx配置upstream并且实现负载均衡
1 2 | https://www.cnblogs.com/muhy/p/10521896.html https://www.coder4.com/archives/6914 |
1. docker 下分别建了两台容器
1 2 | centos73 ---> docker exec -it centos73 /bin/bash ---> 172.17.0.3 ---> 8.217.41.220:8072 [bb3d40707ed7] centos74 ---> docker exec -it centos74 /bin/bash ---> 172.17.0.4 ---> 8.217.41.220:8082 [d847cb82dd19] |
2. 两台机器分别安装了Nginx和Tomcat ,[两台都已经安装了lnmp.所以这次两台都只需安装tomcat]
1 2 3 4 | yum install -y tomcat //安装tomcat服务 systemctl start tomcat.service //启动tomcat服务 systemctl enable tomcat.service //开机自启动tomcat服务 systemctl status tomcat.service //查看是否已经启动成功 |
3. 查看是否可以telnet 对方 80端口
1 2 3 | yum install telnet -y telnet 172.17.0.3 80 //因为都已经有放行80端口.所以没问题 telnet 172.17.0.4 80 //因为都已经有放行80端口.所以没问题 |
如下图就说明没有问题.
4. 查找nginx配置文件位置 nginx.conf
1 | find / -name 'nginx.conf' //显示 /usr/local/nginx/conf/nginx.conf |
5. 修改配置文件,设置转发
1 | vi /usr/local/nginx/conf/nginx.conf |
5-1. 第一台转发到第二台tomcat去处理
1 2 3 | upstream tomcat_server{ server 172.17.0.4:80; } |
1 2 3 | location / { proxy_pass http://tomcat_server; } |
5-2. 重启nginx
1 | systemctl restart nginx.service |
5-3. 测试,打开网页 8.217.41.220:8072 ,发现 原本 172.17.0.3 已经 转发到 172.17.0.4
6. 修改负载均衡的配置, 配置转发的权重:
1 | vi /usr/local/nginx/conf/nginx.conf |
6-1. 我们在这里配置了两台转发机器: 172.17.0.3和172.17.0.4,
它们的权重分别是2/3 和1/3, 也就是说访问三次172.17.0.3, 有两次是172.17.0.3上的Tomcat来处理,
有一次是172.17.0.4上的Tomcat来处理. 如果我们的Tomcat服务器更多 那么就需要在这里配置更多, 权重根据实际需求来划分.
1 2 3 4 | upstream tomcat_server{ server 172.17.0.4:80 weight=10; server 172.17.0.3:80 weight=20; } |
1 2 3 | location / { proxy_pass http://tomcat_server; } |
6-2. 重启nginx
1 | systemctl restart nginx.service |
6-3. 测试,打开网页 8.217.41.220:8072 ,原本 172.17.0.3 还是 全部 转发到 172.17.0.4
7. 同上, 搭建另一台机器172.17.0.4的负载均衡:
1 | vi /usr/local/nginx/conf/nginx.conf |
1 2 3 4 | upstream tomcat_server{ server 172.17.0.3:80 weight=20; server 172.17.0.4:80 weight=10; } |
1 2 3 | location / { proxy_pass http://tomcat_server; } |
7-2. 重启nginx
1 | systemctl restart nginx.service |
7-3. 测试,打开网页 47.243.143.16:8092 ,发现直接变成 500错误
7. 搭建Keepalived:(Keepalived需要依赖openssl)
这里如果我们的机器172.17.0.3 出现故障了呢?
那么怎么使用172.17.0.4上的Nginx进行转发呢?
怎么设置主机和备机呢?
如果主机死了怎么进行故障移除呢?
如果主机从不可用到可用状态又怎么进行恢复添加呢?
这些功能都是可以通过Keepalived来进行设置的
Keepalived原理:
首先Keepalived可以在主机上产生一个虚拟的ip, 这里叫做vip(v是virtual的意思):172.17.0.150, keepalived会将这个vip绑定到交换机上.
当用户访问主机:172.17.0.3时, 交换机会通过这个ip和vip的对应找到172.17.0.3上的Nginx进行处理.
如果当有一天172.17.0.3上的Nginx挂掉的时候, Keepalived会立即在备机上生成一个相同的vip: 172.17.0.150, 当用户继续访问172.17.0.3时, 交换机上已经绑定了vip, 这时发现这个vip是存在于172.17.0.4上面的, 所以直接将请求转发到了备机上.
如果主机被修复好能够继续对外提供服务时, 这时keepalived会将主机上继续生成这个vip, 同时回收在备机上生成的vip. 这个是通过心跳检查来判断主机已恢复使用.
7-1. 我这里已经提前安装好了oppenssl.
检查openssl 是否安装成功:
1 | rpm -qa | grep openssl |
7-2. Keepalived的安装命令: [两台都要安装]
1 2 3 4 5 | rpm -qa | grep keepalive //查看是否已经安装了keepalive,没安装的话就开始安装 yum install -y keepalived //安装tomcat服务 systemctl start keepalived.service //启动tomcat服务 systemctl enable keepalived.service //开机自启动tomcat服务 systemctl status keepalived.service //查看是否已经启动成功 |
7-3. 查看 Keepalived的配置文件 位置
1 | find / -name 'keepalived.conf' //查到位于: /etc/keepalived/keepalived.conf |
7-4. 编辑Keepalived的配置文件
1 | vi /etc/keepalived/keepalived.conf |
7-4-1. 查看我们的网卡,看到是 eth0
1 | ifconfig |
7-4-2. 把以前配置全部删掉,加入如下配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | ! Configuration File for keepalived #全局配置 global_defs { notification_email { #指定keepalived在发生切换时需要发送email到的对像,一行一个 root@localhost #这里配置通知的邮箱地址,为方便演示这里就配置为本机 } notification_email_from keepalived@localhost #指定发件人 smtp_server 127.0.0.1 #指定smtp服务器地址 smtp_connect_timeout 30 #指定smtp连接超时时间 router_id LVS_DEVEL #当前标识当前主机, [运行keepalived机器的一个标识] } vrrp_instance VI_1 { #当前节点所属的虚拟路由的名称 state MASTER #标示状态为MASTER 备份机为BACKUP interface eth0 #设置实列绑定的网卡 virtual_router_id 51 #同一实例下 virtual_router_id 必须相同 priority 100 #MASTER权重要高于BACKUP 比如BACKUP为99 advert_int 1 #MASTER与BACKUP负载均衡之间同步检查的时间间隔,单位是秒 authentication { #认证方式,在组播信息中添加的信息,防止滥竽充数 auth_type PASS #主从服务器验证方式 auth_pass 8888 } virtual_ipaddress { #设置vip 172.17.0.150 #可以多个虚拟IP,换行既可 172.17.0.151 } } |
7-5. 完整配置如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | ! Configuration File for keepalived global_defs { notification_email { root@localhost } notification_email_from keepalived@localhost smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id LVS_DEVEL } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 8888 } virtual_ipaddress { 172.17.0.150 172.17.0.151 } } |
7-6. 配置完成之后, 启动keepalived:
1 | systemctl restart keepalived.service |
7-7. 检测Keepalived是否启动成功:
1 | ip add show eth0 |
这里查看 我们的机器多了两个ip, 其实这两个ip都是虚拟ip
8-1. 备份机设置如下:
1 | vi /etc/keepalived/keepalived.conf |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | ! Configuration File for keepalived global_defs { notification_email { root@localhost } notification_email_from keepalived@localhost smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id LVS_DEVEL } vrrp_instance VI_1 { state BACKUP interface eth0 virtual_router_id 51 priority 99 advert_int 1 authentication { auth_type PASS auth_pass 8888 } virtual_ipaddress { 172.17.0.150 172.17.0.151 } } |
1 | systemctl restart keepalived.service |
1 | ip add show eth0 |
9. 当主机停止服务时, 备机即可接管继续服务: