简要介绍
为了实现https的改造,这里我们提出了两种解决方案,软负载(nginx+keepalived)和硬负载(F5),这里主要介绍一下软负载的实现思路和配置步骤:
http的常规的常规方式是生成一个颁发给某个域名或者服务器IP的证书(我们没有域名,只能颁发给服务器IP),然后在中间件中引入证书,并将连接协议修改为通过ssl安全套接字传输的https协议。然后客户端通过信任或导入证书后,访问咱们的程序,此时由客户端到服务端的数据传输全部经过加密,保证了系统的安全性。
但是这种方式并不适合我们,因为我们采用了冗余部署的方式,在多个portal节点的外层,我们应用了负载均衡器,起到了分流的作用。刚才提到我们的证书是颁发给服务器IP的,所以我们负载均衡器虚拟出的IP也需要一个证书,这样就形成一种什么情况呢?比如说我们有两个portal服务器,这样我们需要生成三个证书,负载均衡器在收到请求后使用F5证书进行解密,再通过portal所在服务器的证书再加密,将请求转发到portal服务器,portal服务器最后再使用自己的证书再解密,且不说负载均衡器是否支持这种多个证书的转发,单从效率来讲,就很不合理。如下图:
所以我们现在推荐的方案中,我们为负载均衡器虚拟出的IP生成一个证书,仅将负载均衡器发布成https,tomcat还是http的,这样我们保证了客户端到服务端的数据传输过程中的安全,也节省了一定效率。如下图:
为了实现这种方式部署方式,我们采用了nginx+keepalived的方式实现负载均衡以及反向代理,nginx是目前比较主流的用于实现负载均衡以及反向代理的组件,同时为了避免nginx的单点故障,我们使用了keepalived,keepalived可以将两台nginx服务器虚拟出一个IP,实现对两台nginx服务器的监控,同时每个nginx都可实现对两套portal、admincenter服务的负载。部署架构图如下:
准备工作
软件环境:
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的版本号
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
安装成功
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