keepalived+nginx+tomcat
·
案例二:keepalived+nginx+tomcat
| IP地址 | 主机名 | 软件 | 节点 |
|---|---|---|---|
| 192.168.11.30 | master | keepalived、nginx | 主节点 |
| 192.168.11.32 | backup | keepalived、nginx | 从节点 |
| 192.168.11.100 | VIP地址 | ||
| 192.168.11.41 | web1 | tomcat、jdk | |
| 192.168.11.42 | web2 | tomca、jdk |
环境准备
准备两台tomcat服务器,并设置主机名和IP地址
# 修改主机名
[root@localhost ~]# hostnamectl set-hostname tomcat2 && bash
[root@localhost ~]# hostnamectl set-hostname tomcat1 && bash
# 修改IP地址
[root@tomcat2 ~]# nmcli c modify ens160 ipv4.method manual ipv4.addresses 192.168.11.41/24 ipv4.gateway 192.168.11.2 ipv4.dns 223.5.5.5 connection.autoconnect yes
[root@tomcat2 ~]# nmcli c up ens160
[root@tomcat2 ~]# nmcli c m ens160 ipv4.method manual ipv4.addresses 192.168.11.42/24 ipv4.gateway 192.168.11.2 ipv4.dns 223.5.5.5 connection.autoconnect yes
[root@tomcat2 ~]# nmcli c up ens160
将两台tomcat服务的selinux和防火墙关闭。
# 关闭selinux
[root@tomcat1 ~]# setenforce 0
[root@tomcat1 ~]# sed -i "s/SELINUX=enforcing/SELINUX=permissive/" /etc/selinux/config
[root@tomcat1 ~]# grep SELINUX /etc/selinux/config
# SELINUX= can take one of these three values:
# NOTE: Up to RHEL 8 release included, SELINUX=disabled would also
SELINUX=permissive
# SELINUXTYPE= can take one of these three values:
SELINUXTYPE=targeted
# 关闭防火墙
[root@tomcat1 ~]# systemctl disable --now firewalld.service
[root@tomcat2 ~]# setenforce 0
[root@tomcat2 ~]# sed -i "s/SELINUX=enforcing/SELINUX=permissive/" /etc/selinux/config
[root@tomcat2 ~]# grep SELINUX /etc/selinux/config
# SELINUX= can take one of these three values:
# NOTE: Up to RHEL 8 release included, SELINUX=disabled would also
SELINUX=permissive
# SELINUXTYPE= can take one of these three values:
SELINUXTYPE=targeted
[root@tomcat2 ~]# systemctl disable --now firewalld.service
搭建tomcat
1、安装jdk
[root@tomcat2 ~]# wget https://download.oracle.com/java/21/latest/jdk-21_linux-x64_bin.tar.gz
--2026-03-01 13:43:30-- https://download.oracle.com/java/21/latest/jdk-21_linux-x64_bin.tar.gz
Resolving download.oracle.com (download.oracle.com)... 23.42.184.142
Connecting to download.oracle.com (download.oracle.com)|23.42.184.142|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 197498247 (188M) [application/x-gzip]
Saving to: ‘jdk-21_linux-x64_bin.tar.gz’
jdk-21_linux-x64_bin.tar.gz 100%[======================================================================>] 188.35M 1.21MB/s in 2m 19s
2026-03-01 13:45:50 (1.36 MB/s) - ‘jdk-21_linux-x64_bin.tar.gz’ saved [197498247/197498247]
[root@tomcat2 ~]# ls
jdk-21_linux-x64_bin.tar.gz
[root@tomcat2 ~]# cd /usr/local/
[root@tomcat2 local]# ls
bin etc games include jdk-21.0.10 lib lib64 libexec sbin share src
[root@tomcat2 local]# cd jdk-21.0.10/
[root@tomcat2 jdk-21.0.10]# pwd
/usr/local/jdk-21.0.10
2、配置jdk
[root@tomcat2 jdk-21.0.10]# vim /etc/profile
然后在这个文件的最后添加如下内容:
......
export JAVA_HOME=/usr/local/jdk-21.0.10
export PATH=$PATH:$JAVA_HOME/bin
3、在配置页生效
[root@tomcat2 jdk-21.0.10]# source /etc/profile
4、验证jdk的安装
[root@tomcat2 jdk-21.0.10]# java --version
java 21.0.10 2026-01-20 LTS
Java(TM) SE Runtime Environment (build 21.0.10+8-LTS-217)
Java HotSpot(TM) 64-Bit Server VM (build 21.0.10+8-LTS-217, mixed mode, sharing)
5、将jdk的安装目录和配置文件复制到tomcat1服务器中
# 推送文件
[root@tomcat2 jdk-21.0.10]# scp -r /usr/local/jdk-21.0.10/ root@192.168.11.41:/usr/local/
The authenticity of host '192.168.11.41 (192.168.11.41)' can't be established.
ED25519 key fingerprint is SHA256:nX7wVI5DOmXCc8IHCBXNZYIUnwja9OXjxGHmRMl+FS8.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.168.11.41' (ED25519) to the list of known hosts.
root@192.168.11.41's password:
LICENSE 100% 6186 3.3MB/s 00:00
......
serialver.1 100% 2019 1.1MB/s 00:00
release 100% 1251 679.4KB/s 00:00
# 拉取文件
[root@tomcat1 ~]# scp root@192.168.11.42:/etc/profile /etc/
The authenticity of host '192.168.11.42 (192.168.11.42)' can't be established.
ED25519 key fingerprint is SHA256:nX7wVI5DOmXCc8IHCBXNZYIUnwja9OXjxGHmRMl+FS8.
This key is not known by any other names
Please type 'yes', 'no' or the fingerprint: yes
Warning: Permanently added '192.168.11.42' (ED25519) to the list of known hosts.
root@192.168.11.42's password:
profile
[root@tomcat1 ~]# source /etc/profile
[root@tomcat1 ~]# java --version
java 21.0.10 2026-01-20 LTS
Java(TM) SE Runtime Environment (build 21.0.10+8-LTS-217)
Java HotSpot(TM) 64-Bit Server VM (build 21.0.10+8-LTS-217, mixed mode, sharing)
安装tomcat
下载tomcat
[root@tomcat2 ~]# wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.115/bin/apache-tomcat-9.0.115.tar.gz
--2026-03-01 14:22:35-- https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.115/bin/apache-tomcat-9.0.115.tar.gz
Resolving dlcdn.apache.org (dlcdn.apache.org)... 151.101.2.132, 2a04:4e42::644
Connecting to dlcdn.apache.org (dlcdn.apache.org)|151.101.2.132|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 13072656 (12M) [application/x-gzip]
Saving to: ‘apache-tomcat-9.0.115.tar.gz’
apache-tomcat-9.0.115.tar.gz 100%[======================================================================>] 12.47M 2.38MB/s in 6.1s
2026-03-01 14:22:42 (2.03 MB/s) - ‘apache-tomcat-9.0.115.tar.gz’ saved [13072656/13072656]
解压压缩包
root@tomcat2 ~]# tar -zxf apache-tomcat-9.0.115.tar.gz -C /usr/local/
[root@tomcat2 ~]# cd /usr/local/
[root@tomcat2 local]# ls
apache-tomcat-9.0.115 bin etc games include jdk-21.0.10 lib lib64 libexec sbin share src
配置tomcat
[root@tomcat2 tomcat-9.0.115]# vim /etc/profile
....
export CATALINA_HOME=/usr/local/tomcat-9.0.115
export PATH=$PATH:$CATALINA_HOME/bin
让配置生效
[root@tomcat2 tomcat-9.0.115]# source /etc/profile
将tomcat2的配置输送到tomcat1
[root@tomcat2 ~]# scp -r /usr/local/tomcat-9.0.115/ 192.168.11.41:/usr/local/
[root@tomcat2 ~]# scp -r /etc/profile 192.168.11.41:/etc/
root@192.168.11.41's password:
profile
让配置生效
[root@tomcat1 ~]# source /etc/profile
启动服务
[root@tomcat2 tomcat-9.0.115]# startup.sh
Using CATALINA_BASE: /usr/local/tomcat-9.0.115
Using CATALINA_HOME: /usr/local/tomcat-9.0.115
Using CATALINA_TMPDIR: /usr/local/tomcat-9.0.115/temp
Using JRE_HOME: /usr/local/jdk-21.0.10
Using CLASSPATH: /usr/local/tomcat-9.0.115/bin/bootstrap.jar:/usr/local/tomcat-9.0.115/bin/tomcat-juli.jar
Using CATALINA_OPTS:
Tomcat started.
[root@tomcat1 tomcat-9.0.115]# startup.sh
Using CATALINA_BASE: /usr/local/tomcat-9.0.115
Using CATALINA_HOME: /usr/local/tomcat-9.0.115
Using CATALINA_TMPDIR: /usr/local/tomcat-9.0.115/temp
Using JRE_HOME: /usr/local/jdk-21.0.10
Using CLASSPATH: /usr/local/tomcat-9.0.115/bin/bootstrap.jar:/usr/local/tomcat-9.0.115/bin/tomcat-juli.jar
Using CATALINA_OPTS:
Tomcat started
访问测试
http://192.168.11.42:8080
搭建nginx服务器
1、安装nginx
[root@backup ~]# dnf install nginx -y
[root@master ~]# dnf install nginx -y
最后访问的是tomcat,不是nginx。所以必须在nginx里面配置代理服务
配置nginx
配置master
[root@master ~]# cd /etc/nginx/conf.d/
[root@master conf.d]# ls
[root@master conf.d]# vim tomcat.conf
文件内容
[root@master conf.d]# cat tomcat.conf
upstream web {
server 192.168.11.41:8080;
server 192.168.11.42:8080;
}
server {
listen 80;
server_name 192.168.11.30;
location / {
proxy_pass http://web;
}
}
2.2 配置backup服务
[root@master conf.d]# scp -r /etc/nginx/conf.d/tomcat.conf 192.168.11.32:/etc/nginx/conf.d/
root@192.168.11.32's password:
tomcat.conf 100% 167 186.1KB/s 00:00
然后修改服务名称
[root@backup ~]# vim /etc/nginx/conf.d/tomcat.conf
[root@backup ~]# cat /etc/nginx/conf.d/tomcat.conf
upstream web {
server 192.168.11.41:8080;
server 192.168.11.42:8080;
}
server {
listen 80;
server_name 192.168.11.32;
location / {
proxy_pass http://web;
}
}
3、启动nginx服务
[root@master conf.d]# systemctl start nginx
[root@backup ~]# systemctl start nginx
测试运行
在浏览器中输入http://192.168.11.31:8080或http://192.168.11.32:8080
[root@master conf.d]# curl 192.168.11.30
tomcat2 192.168.11.42
[root@master conf.d]# curl 192.168.11.30
tomcat1 192.168.11.41
[root@backup ~]# curl 192.168.11.32
tomcat1 192.168.11.41
[root@backup ~]# curl 192.168.11.32
tomcat2 192.168.11.42
搭建keepalived
1、安装keepalived
[root@master conf.d]# dnf install keepalived -y
[root@backup ~]# dnf install keepalived -y
2、配置keepalived
2.1 配置master
[root@master conf.d]# vim /etc/keepalived/keepalived.conf
[root@master conf.d]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id nginx1
}
vrrp_script chk_nginx {
script "/etc/keepalived/check_nginx.sh"
interval 2
timeout 2
weight -20
fall 3
rise 2
}
vrrp_instance VI_1 {
state MASTER
interface ens160
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.11.100
}
track_script {
chk_nginx
}
}
3、编写健康检测脚本
[root@master conf.d]# vim /etc/keepalived/check_nginx.sh
[root@master conf.d]# cat /etc/keepalived/check_nginx.sh
#!/bin/bash
count=`ps -C nginx --no-header | wc -l`
if [$count -eq 0 ]; then
systemctl start nginx
sleep 1
if [ `ps -C nginx --no-header | wc -l` -eq 0 ];then
systemctl stop keepalived
fi
fi
# 编写可执行权限
[root@master conf.d]# chmod +x /etc/keepalived/check_nginx.sh
将keepalived和脚本文件复制到backup服务器上
[root@master conf.d]# scp -r /etc/keepalived/keepalived.conf 192.168.11.32:/etc/keepalived/keepalived.conf
root@192.168.11.32's password:
keepalived.conf 100% 476 336.3KB/s 00:00
[root@master conf.d]# scp -r /etc/keepalived/check_nginx.sh 192.168.11.32:/etc/keepalived/
root@192.168.11.32's password:
check_nginx.sh 100% 198 228.9KB/s 00:00
修改backup服务器上的配置文件
[root@backup ~]# vim /etc/keepalived/keepalived.conf
[root@backup ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id nginx2
}
vrrp_script chk_nginx {
script "/etc/keepalived/check_nginx.sh"
interval 2
timeout 2
weight -20
fall 3
rise 2
}
vrrp_instance VI_1 {
state BACKUP
interface ens160
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.11.100
}
track_script {
chk_nginx
}
}
启动服务
[root@master conf.d]# systemctl start keepalived.service
[root@backup ~]# systemctl start keepalived.service
[root@master conf.d]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:0c:29:59:d6:19 brd ff:ff:ff:ff:ff:ff
altname enp3s0
inet 192.168.11.30/24 brd 192.168.11.255 scope global noprefixroute ens160
valid_lft forever preferred_lft forever
inet 192.168.11.100/32 scope global ens160
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe59:d619/64 scope link noprefixroute
valid_lft forever preferred_lft forever
[root@backup ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:0c:29:07:72:4e brd ff:ff:ff:ff:ff:ff
altname enp3s0
inet 192.168.11.32/24 brd 192.168.11.255 scope global noprefixroute ens160
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe07:724e/64 scope link noprefixroute
valid_lft forever preferred_lft forever
修改nginx的配置文件(两台服务器都要改)
[root@master conf.d]# vim /etc/nginx/conf.d/tomcat.conf
[root@master conf.d]# cat /etc/nginx/conf.d/tomcat.conf
upstream web {
server 192.168.11.41:8080;
server 192.168.11.42:8080;
}
server {
listen 80;
server_name 192.168.11.100;
location / {
proxy_pass http://web;
}
}
[root@backup ~]# vim /etc/nginx/conf.d/tomcat.conf
[root@backup ~]# cat /etc/nginx/conf.d/tomcat.conf
upstream web {
server 192.168.11.41:8080;
server 192.168.11.42:8080;
}
server {
listen 80;
server_name 192.168.11.100;
location / {
proxy_pass http://web;
}
}
重启服务
[root@master conf.d]# systemctl restart nginx
[root@backup ~]# systemctl restart nginx
运行测试
[root@master conf.d]# curl 192.168.11.100
tomcat1 192.168.11.41
[root@master conf.d]# curl 192.168.11.100
tomcat2 192.168.11.42
[root@master conf.d]# curl 192.168.11.100
tomcat1 192.168.11.41
[root@master conf.d]# curl 192.168.11.100
tomcat2 192.168.11.42
[root@backup ~]# curl 192.168.11.100
tomcat1 192.168.11.41
[root@backup ~]# curl 192.168.11.100
tomcat2 192.168.11.42
[root@backup ~]# curl 192.168.11.100
tomcat1 192.168.11.41
[root@backup ~]# curl 192.168.11.100
tomcat2 192.168.11.42
[root@master 4]# systemctl stop nginx
[root@master keepalived]# curl 192.168.11.100
tomcat1 192.168.11.41
[root@master keepalived]# curl 192.168.11.100
tomcat2 192.168.11.42
[root@master keepalived]# curl 192.168.11.100
tomcat1 192.168.11.41
[root@master keepalived]# curl 192.168.11.100
tomcat2 192.168.11.42
更多推荐




所有评论(0)