目录
1、反向代理服务器Nginx01节点(192.168.110.161)验证
2、反向代理服务器Nginx02节点(192.168.110.162)验证
(四)、Nginx02节点(192.168.110.162)反向代理负载均衡配置
更多精彩原创博文详见:《Linux系统应用运维》专栏总目录(持续更新)
一、概述
Keepalived是一款基于虚拟冗余路由协议(Virtual Reduntant Routing Protocol,VRRP)实现的轻量级高可用性解决方案。VRRP将多台物理设备抽象成一台虚拟路由器,并为该虚拟路由器分配一个虚拟IP(VIP)对外提供服务。
多台物理设备成员中只有一台是处于MASTER状态,其余成员处于BACKUP状态。MASTER状态的物理设备是虚拟IP(VIP)的拥有者,负责转发外界的请求;BACKUP状态的物理设备是备份状态,当MASTER状态的物理设备故障时,BACKUP状态会转换为MASTER状态进行故障转移接替请求转发的工作,从而实现高可用性。
Keepalived还设计了多种主动健康检测机制,常用的检测机制有TCP检测、HTTP检测、SSL检测、自定义脚本检测等。本文使用自定义脚本检测机制,实时监测Nginx服务的状态,当发现Nginx服务出现故障时,自动进行故障转移。
在本文中,Keepalived负责实现Nginx反向代理服务的高可用性,Nginx服务负责实现后端Tomcat应用服务的负载均衡,使得整个集群具备高可用负载均衡的能力。
Keepalived+Nginx+Tomcat高可用负载均衡集群架构图如下:
二、环境规划
- 服务器规划
主机名称 IP地址 角色 应用程序 端口 虚拟IP 192.168.110.160 VIP 无 8081、8082 Nginx01 192.168.110.161 反向代理服务器+高可用软件 Nginx+Keepalived 8081、8082 Nginx02 192.168.110.162 反向代理服务器+高可用软件 Nginx+Keepalived 8081、8082 Tomcat01 192.168.110.166 后端应用服务器 Tomcat 8081、8082 Tomcat02 192.168.110.167 后端应用服务器 Tomcat 8081、8082
- 系统版本
CentOS Linux release 7.7.1908 (Core)
- Nginx版本
此处使用1.27.5版本,可以根据实际情况选择合适的版本。
Nginx源码包官方下载地址:http://nginx.org/download/
- Tomcat版本
此处使用 v11.0.6 版本,可以根据实际情况选择合适的版本。
二进制安装包官方下载地址:https://dlcdn.apache.org/tomcat/tomcat-11/v11.0.6/bin/apache-tomcat-11.0.6.tar.gz
- Keepalived版本
此处使用2.3.0版本,可以根据实际情况选择合适的版本。
二进制安装包官方下载地址:https://www.keepalived.org/software/keepalived-2.3.0.tar.gz
- 关闭防火墙
此处为方便演示,直接关闭防火墙。生产环境可以根据实际需求开通服务器防火墙策略。
systemctl stop firewalld
systemctl stop iptables
三、Nginx服务、Tomcat服务安装部署
(一)、Nginx服务安装部署
根据文章《一文读懂Nginx应用之 CentOS安装部署Nginx服务》,在反向代理服务器Nginx01节点(192.168.110.161)、反向代理服务器Nginx02节点(192.168.110.162)上安装Nginx服务,安装过程此处不再赘述。
(二)、Tomcat服务安装部署
根据文章《一文读懂Tomcat应用之 CentOS安装部署Tomcat服务》,分别在后端应用服务器Tomcat01(192.168.110.166)、Tomcat02(192.168.110.167)上安装Tomcat服务。此处每个后端应用服务器节点需要安装两个Tomcat服务,安装路径分别为/usr/local/apache-tomcat-8081,并配置服务端口为8081;/usr/local/apache-tomcat-8082,并配置服务端口为8082。安装过程此处不再赘述。
1、Tomcat01应用服务器部署应用程序
新建index.jsp文件,用于模拟应用程序。
(1)、tomcat_8081服务
- 新建index.jsp文件
[root@Tomcat01 ~]# mkdir -pv /usr/local/apache-tomcat-8081/webapps/ROOT/tomcat_8081/
[root@Tomcat01 ~]# cat > /usr/local/apache-tomcat-8081/webapps/ROOT/tomcat_8081/index.jsp << EOF
This is Tomcat01 Web Server !(192.168.110.166)
I am API_8081 !
EOF[root@Tomcat01 ~]# cat /usr/local/apache-tomcat-8081/webapps/ROOT/tomcat_8081/index.jsp
- 重启Tomcat服务
[root@Tomcat01 ~]# /usr/local/apache-tomcat-8081/bin/shutdown.sh
[root@Tomcat01 ~]# /usr/local/apache-tomcat-8081/bin/startup.sh
- 访问index.jsp页面
使用浏览器访问地址:http://192.168.110.166:8081/tomcat_8081/
由上可见,访问成功。
(2)、tomcat_8082服务
- 新建index.jsp文件
[root@Tomcat01 ~]# mkdir -pv /usr/local/apache-tomcat-8082/webapps/ROOT/tomcat_8082/
[root@Tomcat01 ~]# cat > /usr/local/apache-tomcat-8082/webapps/ROOT/tomcat_8082/index.jsp << EOF
This is Tomcat01 Web Server !(192.168.110.166)
I am API_8082 !
EOF[root@Tomcat01 ~]# cat /usr/local/apache-tomcat-8082/webapps/ROOT/tomcat_8082/index.jsp
- 重启Tomcat服务
[root@Tomcat01 ~]# /usr/local/apache-tomcat-8082/bin/shutdown.sh
[root@Tomcat01 ~]# /usr/local/apache-tomcat-8082/bin/startup.sh
- 访问index.jsp页面
使用浏览器访问地址:http://192.168.110.166:8082/tomcat_8082/
由上可见,访问成功。
2、Tomcat02应用服务器部署应用程序
新建index.jsp文件,用于模拟应用程序。
(1)、tomcat_8081服务
- 新建index.jsp文件
[root@Tomcat02 ~]# mkdir -pv /usr/local/apache-tomcat-8081/webapps/ROOT/tomcat_8081/
[root@Tomcat02 ~]# cat > /usr/local/apache-tomcat-8081/webapps/ROOT/tomcat_8081/index.jsp << EOF
This is Tomcat02 Web Server !(192.168.110.167)
I am API_8081 !
EOF[root@Tomcat02 ~]# cat /usr/local/apache-tomcat-8081/webapps/ROOT/tomcat_8081/index.jsp
- 重启Tomcat服务
[root@Tomcat02 ~]# /usr/local/apache-tomcat-8081/bin/shutdown.sh
[root@Tomcat02 ~]# /usr/local/apache-tomcat-8081/bin/startup.sh
- 访问index.jsp页面
使用浏览器访问地址:http://192.168.110.167:8081/tomcat_8081/
由上可见,访问成功。
(2)、tomcat_8082服务
- 新建index.jsp文件
[root@Tomcat02 ~]# mkdir -pv /usr/local/apache-tomcat-8082/webapps/ROOT/tomcat_8082/
[root@Tomcat02 ~]# cat > /usr/local/apache-tomcat-8082/webapps/ROOT/tomcat_8082/index.jsp << EOF
This is Tomcat02 Web Server !(192.168.110.167)
I am API_8082 !
EOF[root@Tomcat02 ~]# cat /usr/local/apache-tomcat-8082/webapps/ROOT/tomcat_8082/index.jsp
- 重启Tomcat服务
[root@Tomcat02 ~]# /usr/local/apache-tomcat-8082/bin/shutdown.sh
[root@Tomcat02 ~]# /usr/local/apache-tomcat-8082/bin/startup.sh
- 访问index.jsp页面
使用浏览器访问地址:http://192.168.110.167:8082/tomcat_8082/
由上可见,访问成功。
(三)、Tomcat服务验证
验证从反向代理服务器Nginx01节点(192.168.110.161)、反向代理服务器Nginx02节点(192.168.110.162)上,是否能够直接访问Tomcat01(192.168.110.166)、Tomcat02(192.168.110.167)的Tomcat应用服务。
1、反向代理服务器Nginx01节点(192.168.110.161)验证
- 访问Tomcat01(192.168.110.166)
[root@Nginx01 ~]# curl http://192.168.110.166:8081/tomcat_8081/
[root@Nginx01 ~]# curl http://192.168.110.166:8082/tomcat_8082/
- 访问Tomcat02(192.168.110.167)
[root@Nginx01 ~]# curl http://192.168.110.167:8081/tomcat_8081/
[root@Nginx01 ~]# curl http://192.168.110.167:8082/tomcat_8082/
以上说明从反向代理服务器Nginx01节点(192.168.110.161)可以正常访问Tomcat01(192.168.110.166)与Tomcat02(192.168.110.167)的Tomcat应用服务,代理服务器与后端应用服务器之间网络、服务等均状态正常。
2、反向代理服务器Nginx02节点(192.168.110.162)验证
- 访问Tomcat01(192.168.110.166)
[root@Nginx02 ~]# curl http://192.168.110.166:8081/tomcat_8081/
[root@Nginx02 ~]# curl http://192.168.110.166:8082/tomcat_8082/
- 访问Tomcat02(192.168.110.167)
[root@Nginx02 ~]# curl http://192.168.110.167:8081/tomcat_8081/
[root@Nginx02 ~]# curl http://192.168.110.167:8082/tomcat_8082/
以上说明从反向代理服务器Nginx02节点(192.168.110.162)可以正常访问Tomcat01(192.168.110.166)与Tomcat02(192.168.110.167)的Tomcat应用服务,代理服务器与后端应用服务器之间网络、服务等均状态正常。
四、Nginx双虚拟主机反向代理负载均衡配置
在本例中,客户端通过访问Nginx反向代理服务的不同端口或者不同域名,来实现请求转发至不同的后端应用服务器组。其中8081端口表示访问后端应用服务器组Tomcat01(192.168.110.166)的8081端口服务和Tomcat02(192.168.110.167)的8081端口服务;8082端口表示访问后端应用服务器组Tomcat01(192.168.110.166)的8082端口服务和Tomcat02(192.168.110.167)的8082端口服务;
在nginx.conf配置文件中,http模块下配置了两个server模块和两个upstream模块,来实现双虚拟主机反向代理负载均衡配置。其中tomcat8081服务器组的负载均衡策略使用默认的轮询策略,在upstream中不需要显式配置;tomcat8082服务器组的负载均衡策略使用最少连接(least_conn)策略,在upstream中需要显式配置。
(一)、反向代理负载均衡配置
在反向代理服务器Nginx01(192.168.110.161)中修改Nginx服务配置文件/usr/local/nginx/conf/nginx.conf,加入反向代理和负载均衡配置。本例中最核心的配置是location模块、upstream模块、server模块。
[root@Nginx01 ~]# vim /usr/local/nginx/conf/nginx.conf
配置内容如下:
#
# Nginx configuration
#
worker_processes 1;pid /usr/local/nginx/nginx.pid;
events {
worker_connections 1024;
}http {
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" "$request_time" '
'"$host:$server_port" "$upstream_addr" '