案例二: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 
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐