Nginx配置upstream并且实现负载均衡

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        //查看是否已经启动成功

123
123

3. 查看是否可以telnet 对方 80端口

1
2
3
yum install telnet -y
telnet 172.17.0.3 80    //因为都已经有放行80端口.所以没问题
telnet 172.17.0.4 80    //因为都已经有放行80端口.所以没问题

如下图就说明没有问题.

123

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;
        }

123

5-2. 重启nginx

1
systemctl restart nginx.service

5-3. 测试,打开网页 8.217.41.220:8072 ,发现 原本 172.17.0.3 已经 转发到 172.17.0.4

123

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;
        }

123

6-2. 重启nginx

1
systemctl restart nginx.service

6-3. 测试,打开网页 8.217.41.220:8072 ,原本 172.17.0.3 还是 全部 转发到 172.17.0.4

123

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;        
        }

123

7-2. 重启nginx

1
systemctl restart nginx.service

7-3. 测试,打开网页 47.243.143.16:8092 ,发现直接变成 500错误

123

7. 搭建Keepalived:(Keepalived需要依赖openssl)
这里如果我们的机器172.17.0.3 出现故障了呢?
那么怎么使用172.17.0.4上的Nginx进行转发呢?
怎么设置主机和备机呢?
如果主机死了怎么进行故障移除呢? 
如果主机从不可用到可用状态又怎么进行恢复添加呢?
这些功能都是可以通过Keepalived来进行设置的

Keepalived原理:

123

首先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

123

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        //查看是否已经启动成功

123
123

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

123

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
    }
}

123

7-6. 配置完成之后, 启动keepalived:

1
systemctl restart keepalived.service

123

7-7. 检测Keepalived是否启动成功:

1
ip add show eth0

123

这里查看 我们的机器多了两个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
    }
}

123

1
systemctl restart keepalived.service
1
ip add show eth0

9. 当主机停止服务时, 备机即可接管继续服务:

123

Leave a Reply

Your email address will not be published. Required fields are marked *