使用nginx+keepalived实现https负载均衡以及高可用

时间:2022-12-19 10:24:15

简要介绍

         为了实现https的改造,这里我们提出了两种解决方案,软负载(nginx+keepalived)和硬负载(F5),这里主要介绍一下软负载的实现思路和配置步骤:

         http的常规的常规方式是生成一个颁发给某个域名或者服务器IP的证书(我们没有域名,只能颁发给服务器IP),然后在中间件中引入证书,并将连接协议修改为通过ssl安全套接字传输的https协议。然后客户端通过信任或导入证书后,访问咱们的程序,此时由客户端到服务端的数据传输全部经过加密,保证了系统的安全性。

但是这种方式并不适合我们,因为我们采用了冗余部署的方式,在多个portal节点的外层,我们应用了负载均衡器,起到了分流的作用。刚才提到我们的证书是颁发给服务器IP的,所以我们负载均衡器虚拟出的IP也需要一个证书,这样就形成一种什么情况呢?比如说我们有两个portal服务器,这样我们需要生成三个证书,负载均衡器在收到请求后使用F5证书进行解密,再通过portal所在服务器的证书再加密,将请求转发到portal服务器,portal服务器最后再使用自己的证书再解密,且不说负载均衡器是否支持这种多个证书的转发,单从效率来讲,就很不合理。如下图:

使用nginx+keepalived实现https负载均衡以及高可用使用nginx+keepalived实现https负载均衡以及高可用使用nginx+keepalived实现https负载均衡以及高可用

  所以我们现在推荐的方案中,我们为负载均衡器虚拟出的IP生成一个证书,仅将负载均衡器发布成https,tomcat还是http的,这样我们保证了客户端到服务端的数据传输过程中的安全,也节省了一定效率。如下图:

使用nginx+keepalived实现https负载均衡以及高可用

为了实现这种方式部署方式,我们采用了nginx+keepalived的方式实现负载均衡以及反向代理,nginx是目前比较主流的用于实现负载均衡以及反向代理的组件,同时为了避免nginx的单点故障,我们使用了keepalived,keepalived可以将两台nginx服务器虚拟出一个IP,实现对两台nginx服务器的监控,同时每个nginx都可实现对两套portal、admincenter服务的负载。部署架构图如下:

使用nginx+keepalived实现https负载均衡以及高可用

准备工作

软件环境:

Python-2.7.10.tgz  //nginx依赖

pcre-8.30.tar.gz  //nginx依赖

nginx-1.9.1.tar.gz//nginx安装包

keepalived-1.2.24.tar.gz//keepalived安装包

cer.sh  //证书生成脚本

chk_nginx.sh  //nginx状态服务监控脚本

 

网络环境:

Master_ip:10.166.6.173  //应用A1

backup_ip:10.166.6.173  //应用A2

VIP:10.166.6.184  //应用A1、A2虚拟出的ip

1、安装python

1、  //nginx的运行环境依赖于python2.7及以上版本

2、  //将Python-2.7.10.tgz上传到服务器中;

3、  //解压Python-2.7.10.tgz安装包;

# tar -zxvf ./Python-2.7.10.tgz  

4、  # cd Python-2.7.10

5、  //编译安装

# ./configure --prefix=/usr/local/python   

#make && make install

//此时python默认安装在/usr/local/python下,使用# /usr/local/python/bin/python -V应该可以看到2.7.10的版本号

使用nginx+keepalived实现https负载均衡以及高可用

6、   //更改操作系统默认版本,查看之前的版本使用 /usr/bin/python –V,现在要把系统默认的Python指向刚才安装的Python-2.7.10

# mv /usr/bin/python2.4 /usr/bin/python2.4.bak

# mv /usr/bin/python2 /usr/bin/python2.bak

# mv /usr/bin/python /usr/bin/python.bak

# ln -s /usr/local/python/bin/python2.7 /usr/bin/python

7、  //敲入python -V

使用nginx+keepalived实现https负载均衡以及高可用

安装成功

2、安装pcre

1、  将pcre-8.30.tar.gz上传到服务器中;

2、  //解压pcre安装包

# tar -xvf pcre-8.30.tar.gz

3、  # cd pcre-8.30

4、  //执行编译命令

#./configure

# make &&make install

3、安装nginx

1、  将nginx-1.9.1.tar.gz上传到服务器中;

2、  //解压nginx安装包

# tar -xvf nginx-1.9.1.tar.gz

3、  # cd nginx-1.9.1

4、  //执行编译命令

#./configure  --with-http_ssl_module  // --with-http_ssl_module 代表可以以ssl的方式发布

#make

#make install

5、  //启动nginx

# /usr/local/nginx/sbin/nginx

6、  //查看nginx进程是否启动成功

#ps -ef|grep nginx

7、  //nginx默认端口为80,在浏览器输入http://IP:80测试是否安装成功

8、  //关闭nginx服务(一会要修改配置文件);

# ps -ef|grep nginx

4、  安装keepalived

我们需要将keepalived分别装在10.166.6.173和10.166.6.174上,其中10.166.6.173设为主(MASTER),10.166.6.174设为备(BACKUP);

1、  //将keepalived-1.2.7.tar.gz上传到服务器中;

2、  //解压

# tar -zxvf keepalived-1.2.7.tar.gz

3、  # cd keepalived-1.2.7

4、  //执行编译命令

# ./configure

#make

#make install

5、  # cp /usr/local/etc/rc.d/init.d/keepalived  /etc/rc.d/init.d/

# cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/

# mkdir /etc/keepalived

# cp /usr/local/etc/keepalived/keepalived.conf/etc/keepalived/

# cp /usr/local/sbin/keepalived /usr/sbin/

6、  在另一台服务器上执行1至6的安装步骤;

7、  //分别修改主备keepalived的配置文件

# vi /etc/keepalived/keepalived.conf

MASTER:

BACKUP

8、  //验证:

a)        先后在主从服务器上启动keepalived

# /etc/init.d/keepalived start

b)        在主服务器上查看是否已经绑定虚拟IP:

# ip addr

c)        在备服务器上查看是否没有绑定虚拟IP:

# ip addr

d)        停止主服务器上的keepalived:

# /etc/init.d/keepalived stop

e)        查看虚拟IP是否由主keepalived飘移到备keepalived:

主:

备:

f)         重新启动主keepalived,检查主keepalived是否能重新接管虚拟IP:

备:

g)        此时10.166.6.184已经映射到了10.166.6.173上,在crt登录10.166.6.184应该直接登入10.166.6.173上:

9、  //经过前面的设置,我们已经设置好如果主服务器的keepalived停止服务,备服务器会自动接管VIP对外服务,一旦主服务的keepalived恢复,会重新接管VIP,但这并不是我们需要的,我们需要的是nginx停止服务时能够自动切换指向。

//keepalived支持配置监控脚本,我们写了一个脚本(chk_nginx.sh),通过监测nginx的端口状态来判断nginx是否正常,如果发现nginx不正常,重启一下:

//脚本内容:

a)        //将chk_nginx.sh上传到/opt目录下(路径可以随意,但要注意下一步中指定脚本时路径要写对);

b)        # chmod 775 chk_nginx.sh;

c)        # dos2unix chk_nginx.sh

d)        //修改主备两台keepalived的keepalived.conf配置文件

#  vi/etc/keepalived/keepalived.conf

//增加以下内容:

vrrp_scriptchk_https_port {

    script "/opt/dupeng/nginx/chk_nginx.sh"

    interval 2

    weight 2

}

 

track_script{

    chk_https_port

}

e)        //更进一步,为了避免启动keepalived之前没有启动nginx,我们在主备两台keepalived启动脚本/etc/init.d/keepalived的start中首先启动nginx

# vi /etc/init.d/keepalived

10、             //关闭两台服务器上的keepalived;

#  /etc/init.d/keepalivedstop

11、             //设置keepalived的日志文件,keepalived的日志文件默认写在/var/log/message下,由于message日志太多,所以需要单独设置日志输出;

 

5、配置nginx为https

以https方式访问需要为域名生成一个ssl证书,由于我们在各现场部署的时候没有域名,所以只需keepalived虚拟出的IP就可以了

1、  //cer.ssh上传到服务器中;

# chmod 775 cer.ssh   //为cer.ssh赋予可执行权限

#./cer.sh   //这里我把生成证书的命令写成了一个脚本,需要通过openssl工具来实现证书的生成(证书有效期10年可通过修改脚本修改)

//将上图中最后的红框中的内容记录下来,以便一会使用;

//证书脚本执行后,我们可以在当前目录下看到生成了四个证书:

2、  //在两台服务器上的nginx安装目录中创建ssl文件夹:

#cd /usr/local/nginx

#mkdir ssl

3、  //将.crt和.key证书,复制到/usr/local/nginx/ssl中,执行红框中TODO下面的两个命令

#cp 10.166.6.173.crt /usr/local/nginx/ssl/10.166.6.173.crt

#cp 10.166.6.173.key /usr/local/nginx/ssl/10.166.6.173.key

4、  //将.crt和.key证书上传到另一台服务器的/usr/local/nginx/ssl/路径下;

5、  //修改两台服务器上的nginx配置文件:

a)            将红框中TODO下面的 server{ …}中的内容复制过去,将默认的listen 80 行注释

6、  //重启两台服务器上的keepalived服务(因为之前已经将nginx启动命令加入到keepalived启动脚本中,所以启动keepalived时会自动将nginx启动):

# /etc/init.d/keepalived start

7、  //使用浏览器访问nginx服务:https://10.166.6.184/

//点击继续浏览此网站(不推荐);

//提示证书错误;

8、  //由于我们的证书不是权威部门颁发的,所以提示证书有问题,如果想去除这个错误,需要在每台终端中导入刚刚生成好的10.166.6.173.crt证书,导入过程为:

a)            工具——>Internet选项——>内容——>证书

b)            选择受信任的根证书颁发机构,点击导入

c)             下一步——>选择证书——>下一步

 

d)            如图选择,下一步

e)            选择是,完成

9、  //再次使用浏览器访问nginx服务:https://10.166.6.184/

//nginx首页能够正常访问,并且也不弹出证书错误的提示了

5、       设置负载均衡以及反向代理

1、  //停止nginx服务;

#ps –ef|grepnginx

#kill -9  3268332684    //将master和worker进行一共杀掉

2、  //分别修改两台服务器的nginx配置文件

#vi /usr/local/nginx/conf/nginx.conf

a)        //设置负载均衡,这里我们只需要做前后台的负载均衡指向,按图一样改:

//注意最后要加ip_hash,表示每个请求按访问ip的hash结果分配,可保证每个客户端每次访问的是同一个应用节点,继而避免了负载均衡条件下前后台切换不正常的问题

b)        //设置反向代理,将nginx地址代理到真实的http服务,按图一样改:

3、  //重新启动keepalived

# /etc/init.d/keepalived start

4、  //访问https://10.166.6.184/portal