一.多实例部署

生产环境中,通过ps -ef | grep tomcat查看,会发现有多个tomcat实例在运行,除了主站点之外,后期有定制的项目,需要二次开发的内容,那就可以再起一些实例。除了原有的tomcat项目,再增加2个,分别为tomcat_8081和tomcat_8082,只需要改动端口,还用原来的JDK。

1.tomcat准备

#将/root/目录下的apache-tomcat-9.0.52.tar.gz解压,cp两份出来
tar xf apache-tomcat-9.0.52.tar.gz
cp -r apache-tomcat-9.0.52 tomcat_8081
cp -r apache-tomcat-9.0.52 tomcat_8082
#移动到/app/tools
mv tomcat_808* /app/tools
#tomcat_8081更改端口
cd /app/tools
sed -i 's#8080#8081#g' tomcat_8081/conf/server.xml
sed -i 's#8005#8006#g' tomcat_8081/conf/server.xml
#tomcat_8082更改端口
sed -i 's#8080#8082#g' tomcat_8082/conf/server.xml
sed -i 's#8005#8007#g' tomcat_8082/conf/server.xml
#启动实例
/app/tools/tomcat_8081/bin/startup.sh
/app/tools/tomcat_8082/bin/startup.sh
#查看实例
ps -ef | grep tomcat
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.

tomcat相关概念与部署(续2)tomcat多实例-zabbix监控(docker部署)_docker

这样会有一个问题,当服务器重启后,tomcat这个项目通过systemd管理,并且加入了开机自启,但是tomcat_8081和tomcat_8082并不会开机自启,也需要配置systemd,加入开机自启动。


#tomcat_8081的systemd文件
cat >/usr/lib/systemd/system/tomcat_8081.service <<'EOF'
#/usr/lib/systemd/system/tomcat.service

[Unit]
Description=Tomcat Server Manage
After=network.target remote-fs.target

[Service]
Type=forking
EnvironmentFile=/etc/sysconfig/tomcat
ExecStart=/app/tools/tomcat_8081/bin/startup.sh
ExecReload="/app/tools/tomcat_8081/bin/shutdown.sh && sleep 2 && /app/tools/tomcat_8081/bin/startup.sh"
ExecStop=/app/tools/tomcat_8081/bin/shutdown.sh

[Install]
WantedBy=multi-user.target
EOF

#tomcat_8082的systemd文件
cat >/usr/lib/systemd/system/tomcat_8082.service <<'EOF'
#/usr/lib/systemd/system/tomcat.service

[Unit]
Description=Tomcat Server Manage
After=network.target remote-fs.target

[Service]
Type=forking
EnvironmentFile=/etc/sysconfig/tomcat
ExecStart=/app/tools/tomcat_8082/bin/startup.sh
ExecReload="/app/tools/tomcat_8082/bin/shutdown.sh && sleep 2 && /app/tools/tomcat_8082/bin/startup.sh"
ExecStop=/app/tools/tomcat_8082/bin/shutdown.sh

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
#启动并加入开机自启
systemctl start tomcat_8081.service
systemctl enable tomcat_8081.service
systemctl start tomcat_8082.service
systemctl enable tomcat_8082.service
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.

添加测试文件到新的站点

echo "tomcat 8081" >/app/tools/tomcat_8081/webapps/ROOT/test.jsp
echo "tomcat 8082" >/app/tools/tomcat_8082/webapps/ROOT/test.jsp
  • 1.
  • 2.

浏览器访问测试

http://192.168.77.142:8081/test.jsp

http://192.168.77.142:8082/test.jsp

二.tomcat监控

开启tomcat监控功能,就可以通过zabbix监控或jconsole监控,生产要使用,要严格限制,如防火墙限制访问、使用更复杂的密码和用户名、或者在JMX连接上使用SSL/TLS来增强安全性。

1.修改catalina.sh配置文件

cd /app/tools/tomcat/bin
vim catalina.sh
#从125行开始加入
CATALINA_OPTS="$CATALINA_OPTS \
-Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=12345 \
-Dcom.sun.management.jmxremote.authenticate=true \
-Dcom.sun.management.jmxremote.password.file=/app/tools/tomcat/conf/jmxremote.password \
-Dcom.sun.management.jmxremote.access.file=/app/tools/tomcat/conf/jmxremote.access \
-Dcom.sun.management.jmxremote.ssl=false \
-Djava.rmi.server.hostname=192.168.77.142"
#修改后保存
#配置远程监控用户口令和权限,文件名和用户口令都可自定义
cd /app/tools/tomcat/conf
echo "admin 123456" >jmxremote.password
echo "admin readonly" >jmxremote.access
#修改文件权限
chmod 600 jmxremote.password
chmod 600 jmxremote.access

#重启tomcat
systemctl restart tomcat
#查看加入的参数和12345+2个随机端口端口
ps -ef | grep tomcat
netstat -tlunp | grep java
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.

参数解释  

-Dcom.sun.management.jmxremote #jmx remote 开启tomcat远程监控功能

-Dcom.sun.management.jmxremote.port=12345 #指定端口一般为 12345 还有2个随机端口

-Dcom.sun.management.jmxremote.authenticate=true #auth 认证 是否开启远程监控认证(用户名 密码)

-Dcom.sun.management.jmxremote.password.file=/app/tools/tomcat/conf/jmxremote.password #(用户名 密码)

-Dcom.sun.management.jmxremote.access.file=/app/tools/tomcat/conf/jmxremote.access#(用户名 权限)

-Dcom.sun.management.jmxremote.ssl=false #是否开启https

-Djava.rmi.server.hostname=192.168.77.142" #tomcat监听的ip地址 bind,生产环境 写内网ip

 在 tomcat 8.5.x 配置开启功能 修改 catalina.sh 要写成一行 或 加上 \ (续行)

2.电脑安装JDK,使用jconsole监控

这里安装到了C:\Program Files\Java\jdk1.8.0_31\bin\jconsole.exe,运行jconsole.exe

输入服务器IP:端口,自定义的用户名和口令后

tomcat相关概念与部署(续2)tomcat多实例-zabbix监控(docker部署)_java_02

tomcat相关概念与部署(续2)tomcat多实例-zabbix监控(docker部署)_docker_03

3.zabbix监控tomcat

拓扑图

tomcat相关概念与部署(续2)tomcat多实例-zabbix监控(docker部署)_docker_04

配置---主机---添加主机

模版选自带的Apache Tomcat JMX

tomcat相关概念与部署(续2)tomcat多实例-zabbix监控(docker部署)_java_05

tomcat相关概念与部署(续2)tomcat多实例-zabbix监控(docker部署)_java_06

tomcat相关概念与部署(续2)tomcat多实例-zabbix监控(docker部署)_zabbix_07

tomcat相关概念与部署(续2)tomcat多实例-zabbix监控(docker部署)_zabbix_08

tomcat相关概念与部署(续2)tomcat多实例-zabbix监控(docker部署)_java_09

不太明白为啥提示Runtime: JVM is not reachable?电脑使用jconsole测试可以连接。在宿主机上安装JDK,使用jconsole也可以连接。因为轮训默认StartJavaPollers=0,未启用JavaGateway。

解决:

#进入zabbix-server-mysql容器,2ce3为容器ID
docker exec -it -uroot -it 2ce3 bash
#修改配置文件
vi /etc/zabbix/zabbix_server.conf
JavaGateway=zabbix-java-gateway    #默认为空,需要修改,javageteway主机名或IP
StartJavaPollers=5                 #轮训进程数,默认为0,修改为5
JavaGatewayPort=10052              #默认10052,可以不修改
#重启docker restart 2ce3

#zabbix_java_gateway没有修改,因为在/usr/sbin/zabbix_java_gateway有这样的配置
ZABBIX_OPTIONS="$ZABBIX_OPTIONS -Dzabbix.startPollers=$ZBX_START_POLLERS"
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.

其实,在一开始部署docker时,可以直接设置环境变量即可,后期无需修改

docker run  -td \
--name zabbix-server-mysql \
-e DB_SERVER_HOST="mysql-server" \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="zabbix_pwd" \
-e MYSQL_ROOT_PASSWORD="root_pwd" \
-e ZBX_JAVAGATEWAY_ENABLE="true" \
-e ZBX_JAVAGATEWAY="zabbix-java-gateway" \
-e ZBX_START_POLLERS=5 \
--network=zabbix-net \
-p 10051:10051 \
--restart unless-stopped \
zabbix/zabbix-server-mysql:alpine-5.4-latest
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.

zabbix通过docker部署,zabbix_server.conf配置文件存在zabbix-server-mysql容器中,

默认参数
# JavaGateway=  
# StartJavaPollers=0
# JavaGatewayPort=10052

那么在启用zabbix-server-mysql容器时,就需要加入自定义环境变量开启JavaPollers

-e ZBX_JAVAGATEWAY_ENABLE="true" \          #开启JAVAGATEWAY 
-e ZBX_JAVAGATEWAY="zabbix-java-gateway" \  #设置JAVAGATEWAY的IP或容器名--name指定的名字
-e ZBX_JAVAGATEWAYPORT="10052" \            #设置JAVAGATEWAY的端口,默认10052,可以不添加
-e ZBX_START_POLLERS=5 \                    #设置START_POLLERS的数量
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.

其他报错

报错1active check configuration update from host [web01] started to fail

zabbix-server宿主机反而要开启防护墙,关闭报错

2024/07/14 12:47:13.131848 [101] cannot receive data from [192.168.77.130:10051]: Cannot read message: 'read tcp 192.168.77.142:45262->192.168.77.130:10051: i/o timeout'

2024/07/14 12:47:13.131915 [101] active check configuration update from host [web01] started to fail

解决:

zabbix-server宿主机开启防火墙后,连接正常;

2024/07/14 12:47:19.908686 [101] active check configuration update from [192.168.77.130:10051] is working again

报错2Runtime: JVM is not reachable

解决:

被监控tomcat没有开启,开启systemctl start tomcat

开启zabbix_java_gateway并设置轮训数量

报错3 docker-server的宿主机中zabbix-java-gateway容器日志报错bad protocol header

2024-07-14 04:49:41.331 [main] INFO  com.zabbix.gateway.JavaGateway - listening on 0.0.0.0/0.0.0.0:10052

2024-07-14 04:53:02.521 [pool-2-thread-1] WARN  com.zabbix.gateway.SocketProcessor - error processing request: bad protocol header: 53 53 48 2D 32

解决:

不用管,是因为我在客户端测试宿主机10052端口的报错,ssh -vp 10052 192.168.77.130