一.多实例部署
生产环境中,通过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
这样会有一个问题,当服务器重启后,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
添加测试文件到新的站点
echo "tomcat 8081" >/app/tools/tomcat_8081/webapps/ROOT/test.jsp
echo "tomcat 8082" >/app/tools/tomcat_8082/webapps/ROOT/test.jsp
浏览器访问测试
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
参数解释
-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:端口,自定义的用户名和口令后
3.zabbix监控tomcat
拓扑图
配置---主机---添加主机
模版选自带的Apache Tomcat JMX
不太明白为啥提示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"
其实,在一开始部署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
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的数量
其他报错
报错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