tomcat
tomcatA
bash
[root@tomcatA ~]# dnf install java-1.8.0-openjdk.x86_64 -y
#从网上下载tomcat包,然后解包即可
[root@tomcatA ~]# ls
anaconda-ks.cfg apache-tomcat-9.0.107.tar.gz
[root@tomcatA ~]# tar zxf apache-tomcat-9.0.107.tar.gz -C /usr/local/
[root@tomcatA ~]# cd /usr/local/
#重命名目录名(不是必须)
[root@tomcatA local]# mv apache-tomcat-9.0.107/ tomcat
[root@tomcatA local]# cd tomcat/
[root@tomcatA tomcat]# ls
bin BUILDING.txt conf CONTRIBUTING.md lib LICENSE logs NOTICE README.md RELEASE-NOTES RUNNING.txt temp webapps work
[root@tomcatA tomcat]# cd bin/
[root@tomcatA bin]# ls
bootstrap.jar ciphers.sh daemon.sh setclasspath.bat startup.sh version.bat
catalina.bat commons-daemon.jar digest.bat setclasspath.sh tomcat-juli.jar version.sh
catalina.sh commons-daemon-native.tar.gz digest.sh shutdown.bat tomcat-native.tar.gz
catalina-tasks.xml configtest.bat makebase.bat shutdown.sh tool-wrapper.bat
ciphers.bat configtest.sh makebase.sh startup.bat tool-wrapper.sh
[root@tomcatA bin]# ./startup.sh
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin /tomcat-juli.jar
Using CATALINA_OPTS:
Tomcat started.
[root@tomcatA bin]# netstat -antlupe | grep 80
tcp6 0 0 127.0.0.1:8005 :::* LISTEN 0 58326 30388/java
tcp6 0 0 :::8080 :::* LISTEN 0 58314 30388/java
测试访问

tomcatB
[root@tomcatB ~]# ls
anaconda-ks.cfg apache-tomcat-9.0.107.tar.gz
[root@tomcatB ~]# tar zxf apache-tomcat-9.0.107.tar.gz -C /usr/local/
[root@tomcatB ~]# cd /usr/local/
[root@tomcatB local]# ls
apache-tomcat-9.0.107 etc include lib64 sbin src
bin games lib libexec share
[root@tomcatB local]# mv apache-tomcat-9.0.107/ tomcat
[root@tomcatB local]# ls
bin etc games include lib lib64 libexec sbin share src tomcat
[root@tomcatB local]# cd tomcat/
[root@tomcatB tomcat]# cd bin/
[root@tomcatB bin]# ./startup.sh
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Using CATALINA_OPTS:
Tomcat started.
[root@tomcatB bin]# ss -tunlp | grep 80
tcp LISTEN 0 1 [::ffff:127.0.0.1]:8005 *:* users:(("java",pid=30153,fd=67))
tcp LISTEN 0 100 *:8080 *:* users:(("java",pid=30153,fd=57))

制作启动文件
bash
[root@tomcatA/B ~]# vim /usr/local/tomcat/conf/tomcat.conf
JAVA_HOME=/etc/alternatives/jre
bash
[root@tomcatA/B ~]# vim /lib/systemd/system/tomcat.service
[Unit]
Description=Tomcat
#After=syslog.target network.target remote-fs.target nss-lookup.target
After=syslog.target network.target
[Service]
Type=forking
EnvironmentFile=/usr/local/tomcat/conf/tomcat.conf
ExecStart=/usr/local/tomcat/bin/startup.sh
ExecStop=/usr/local/tomcat/bin/shutdown.sh
PrivateTmp=true
User=tomcat
Group=tomcat
[Install]
WantedBy=multi-user.target
[root@tomcatA ~]# useradd -s /bin/false -M tomcat
[root@tomcatB ~]# useradd -s /sbin/nologin -M tomcat
[root@tomcatA ~]# chown tomcat.tomcat -R /usr/local/tomcat/
[root@tomcatA/B ~]# cd /usr/local/tomcat/bin/
[root@tomcatA/B bin]# ./shutdown.sh
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Using CATALINA_OPTS:
[root@tomcatA/B bin]# netstat -antlupe | grep java
bash
[root@tomcatA ~]# systemctl enable --now tomcat
Created symlink /etc/systemd/system/multi-user.target.wants/tomcat.service → /usr/lib/systemd/system/tomcat.service.
[root@tomcatA ~]# systemctl status tomcat.service
● tomcat.service - Tomcat
Loaded: loaded (/usr/lib/systemd/system/tomcat.service; enabled; preset: disabled)
Active: active (running) since Wed 2025-07-30 11:27:04 CST; 9s ago
Process: 30951 ExecStart=/usr/local/tomcat/bin/startup.sh (code=exited, status=0/SUCCESS)
Main PID: 30960 (java)
Tasks: 32 (limit: 22964)
Memory: 110.2M
CPU: 1.751s
CGroup: /system.slice/tomcat.service
└─30960 /etc/alternatives/jre/bin/java -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties -Djava.uti>
Jul 30 11:27:04 tomcatA systemd[1]: Starting Tomcat...
Jul 30 11:27:04 tomcatA startup.sh[30951]: Tomcat started.
Jul 30 11:27:04 tomcatA systemd[1]: Started Tomcat.
[root@tomcatB bin]# systemctl enable tomcat.service --now
Created symlink /etc/systemd/system/multi-user.target.wants/tomcat.service → /usr/lib/systemd/system/tomcat.service.
[root@tomcatB bin]# systemctl status tomcat.service
● tomcat.service - Tomcat
Loaded: loaded (/usr/lib/systemd/system/tomcat.service; enabled; preset: disabled)
Active: active (running) since Wed 2025-07-30 11:28:26 CST; 6s ago
Process: 30615 ExecStart=/usr/local/tomcat/bin/startup.sh (code=exited, status=0/SUCCESS)
Main PID: 30623 (java)
Tasks: 32 (limit: 22964)
Memory: 109.2M
CPU: 1.842s
CGroup: /system.slice/tomcat.service
└─30623 /etc/alternatives/jre/bin/java -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties -Djava.util.logging.manager>
Jul 30 11:28:26 tomcatB systemd[1]: Starting Tomcat...
Jul 30 11:28:26 tomcatB startup.sh[30615]: Tomcat started.
Jul 30 11:28:26 tomcatB systemd[1]: Started Tomcat.
单机
bash
[root@nginx ~]# systemctl status firewalld.service
[root@tomcatB ~]# systemctl disable firewalld --now
[root@tomcatA ~]# systemctl disable firewalld --now
[root@nginx ~]# vim /etc/nginx/conf.d/vhost.conf
server {
listen 80;
server_name www.vb.org;
location ~ \.jsp$ {
proxy_pass http://172.25.254.10:8080;
}
}




多机负载均衡
ip_hash
虽然对于ip进行哈希也能做到负载均衡,但是要考虑到对ip进行哈希时,可能存在由一个路由上携带同一ip集中统一多用户需求
hash $cookie_JSESSIONID --- 基于cookie值的会话保持
所以对于ip哈希进行改进,我们可以观察到cookie值是会统一发放的,而且是唯一的,并且我们还可以结合JSESSIONID进行会话绑定。
bash
[root@nginx ~]# vim /etc/nginx/conf.d/vhost.conf
upstream tomcat{
hash $cookie_JSESSIONID;
server 172.25.254.10:8080;
server 172.25.254.20:8080;
}
server {
listen 80;
server_name www.vb.org;
location ~ \.jsp$ {
#proxy_pass http://172.25.254.10:8080;
proxy_pass http://tomcat;
}
}


[root@tomcatA/B ~]# unzip jar.zip
Archive: jar.zip
creating: jar/
inflating: jar/asm-5.2.jar
inflating: jar/kryo-3.0.3.jar
inflating: jar/kryo-serializers-0.45.jar
inflating: jar/memcached-session-manager-2.3.2.jar
inflating: jar/memcached-session-manager-tc9-2.3.2.jar
inflating: jar/minlog-1.3.1.jar
inflating: jar/msm-kryo-serializer-2.3.2.jar
inflating: jar/objenesis-2.6.jar
inflating: jar/reflectasm-1.11.9.jar
inflating: jar/spymemcached-2.12.3.jar
[root@tomcatA/B ~]# mv jar/* /usr/local/tomcat/lib/
bash
[root@tomcatA/B ~]# systemctl status tomcat.service

[root@tomcatA/B ~]# systemctl restart tomcat.service
[root@tomcatA/B ~]# systemctl status tomcat.service


交叉存储memcache
解决当用户正在访问时,用户的session绑定的服务器下线时,避免在nginx调配去另一服务器时,用户提交的表格信息等丢失或清空。
在tomcatA/B主机上
都要下载memcached
并且配置memcached的配置文件
bash
[root@tomcatA/B ~]# dnf install memcached -y
[root@tomcatA/B ~]# vim /etc/sysconfig/memcached
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS="-l 0.0.0.0,::1"
[root@tomcatA/B ~]# systemctl restart memcached.service
在tomcatA服务器1中配置
[root@tomcatA ~]# vim /usr/local/tomcat/conf/context.xml
<Context>
<!-- Default set of monitored resources. If one of these changes, the -->
<!-- web application will be reloaded. -->
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<WatchedResource>WEB-INF/tomcat-web.xml</WatchedResource>
<WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>
<!-- Uncomment this to disable session persistence across Tomcat restarts -->
<!--
<Manager pathname="" />
-->
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:172.25.254.10:11211,n2:172.25.254.20:11211"
failoverNodes="n1"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
</Context>

[root@tomcatA ~]# vim /usr/local/tomcat/conf/context.xml

我们关闭10上的tomcat来模拟10主机下线
然后当我们在浏览器继续提交表格信息时,会自动切换到20主机上并且还会读取到之前用户填写的信息。

"
requestUriIgnorePattern=".*.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
[外链图片转存中...(img-i4iDomgh-1754927283647)]
root@tomcatA \~\]# vim /usr/local/tomcat/conf/context.xml [外链图片转存中...(img-zBcHB7y2-1754927283647)] 我们关闭10上的tomcat来模拟10主机下线 然后当我们在浏览器继续提交表格信息时,会自动切换到20主机上并且还会读取到之前用户填写的信息。 [外链图片转存中...(img-KJjgsubf-1754927283647)]