⭐萬字長篇超詳細的圖解 Tomcat 中介軟體方方面面儲備知識⭐
LNMT
1.JAVA 簡介
常見的大型平臺有 LNMP、LNMP、LNMT
JAVA:LNMT(T 表示 Tomcat 容器,放 java 程式碼的)
Tomcat
resin
weblogic(配合 oracle 資料庫進行使用)
非同步類似於有一張表,根據對應的資訊找對應的頁面
同步類似於在一個目錄中,在每一個檔案中找想要的資訊
2.Tomcat 必備知識
-
[x] tomcat 部署
-
[x] 目錄結構
-
[x] 配置 tomcat 管理功能
-
[x] 部署 jpress
-
[ ] tomcat 多例項
-
[ ] tomcat 監控
-
[ ] tomcat 安全優化
-
Tomcat:apache-tomcat
-
與 Tomcat 有關的
-
jvm:java virtual machine java 虛擬機器
-
解決了程式碼的可移植性,1 份程式碼處處使用
-
佔用記憶體
-
jdk java development kit java 開發環境
-
java 命令
-
jvm 環境
-
jdk 版本
-
oracle jdk 官網下載
-
openjdk Linux 自帶,開源
3.Tomcat 環境搭建
伺服器 192.168.81.210 ens33
3.1.jdk
#這裡的eof使用單引號引起來是為了讓特殊符號也寫入檔案
#PATH 存放命令的路徑,如果不小心改錯了/etc/profile檔案那麼命令就不能使用了,可以使用命令的絕對路徑來修改/bin/vim /etc/profile改完後exit重新連一下就行
#安裝jdk之前先把之前rpm裝的刪掉
cat >>/etc/profile <<'EOF'
export JAVA_HOME=/application/jdk
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar
EOF
[[email protected] ~]# mkdir /application
[[email protected] application]# rz -E
rz waiting to receive.
[[email protected] application]# ln -s jdk1.8.0_60/ jdk
複製程式碼
3.2.Tomcat
[[email protected] application]# tar xf apache-tomcat-8.5.53.tar.gz
[[email protected] application]# ln -s apache-tomcat-8.5.53 tomcat
[[email protected] application]# mkdir soft
[[email protected] application]# mv *.gz soft/
[[email protected] application]# /application/tomcat/bin/version.sh
Using CATALINA_BASE: /application/tomcat
Using CATALINA_HOME: /application/tomcat
Using CATALINA_TMPDIR: /application/tomcat/temp
Using JRE_HOME: /application/jdk
Using CLASSPATH: /application/tomcat/bin/bootstrap.jar:/application/tomcat/bin/tomcat-juli.jar
Server version: Apache Tomcat/8.5.53
Server built: Mar 11 2020 10:01:39 UTC
Server number: 8.5.53.0
OS Name: Linux
OS Version: 3.10.0-957.el7.x86_64
Architecture: amd64
JVM Version: 1.8.0_60-b27
JVM Vendor: Oracle Corporation
#到此為止Tomcat部署完成
複製程式碼
3.3.啟動與管理
-
startup.sh 啟動
-
shutdown.sh 關閉
-
catalina.sh 核心指令碼
#startup.sh最主要的部分
PRG="$0" #指令碼名:/application/bin/startup.sh
PRGDIR=`dirname "$PRG"` #dirname用於取出檔案所在的路徑,basename用於取出檔名
EXECUTABLE=catalina.sh
exec "$PRGDIR"/"$EXECUTABLE" start "[email protected]"
#相當於 exec /application/tomcat/bin/catalina.sh start exec可以省略
複製程式碼
啟動分析
[[email protected] tomcat]# ./bin/startup.sh
Using CATALINA_BASE: /application/tomcat
Using CATALINA_HOME: /application/tomcat
Using CATALINA_TMPDIR: /application/tomcat/temp
Using JRE_HOME: /application/jdk
Using CLASSPATH: /application/tomcat/bin/bootstrap.jar:/application/tomcat/bin/tomcat-juli.jar
Tomcat started.
[[email protected] tomcat]# ss -lnptu | grep java
tcp LISTEN 0 100 :::8080 :::* users:(("java",pid=67926,fd=52))
tcp LISTEN 0 1 ::ffff:127.0.0.1:8005 :::* users:(("java",pid=67926,fd=64))
[[email protected] tomcat]# ps -ef | grep java
root 67926 1 21 14:31 pts/0 00:00:04 /application/jdk/bin/java -Djava.util.logging.config.file=/application/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /application/tomcat/bin/bootstrap.jar:/application/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/application/tomcat -Dcatalina.home=/application/tomcat -Djava.io.tmpdir=/application/tomcat/temp org.apache.catalina.startup.Bootstrap start
/application/jdk/bin/java #java啟動程式的目錄
#日誌的配置檔案
-Djava.util.logging.config.file=/application/tomcat/conf/logging.properties
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
-Djdk.tls.ephemeralDHKeySize=2048
-Djava.protocol.handler.pkgs=org.apache.catalina.webresources
-Dorg.apache.catalina.security.SecurityListener.UMASK=0027
-Dignore.endorsed.dirs=
-classpath /application/tomcat/bin/bootstrap.jar:/application/tomcat/bin/tomcat-juli.jar
#Tomcat的部署目錄,多例項在區分時主要看這裡
-Dcatalina.base=/application/tomcat
-Dcatalina.home=/application/tomcat
-Djava.io.tmpdir=/application/tomcat/temp org.apache.catalina.startup.Bootstrap
start
複製程式碼
4.Tomcat 目錄結構
[[email protected] tomcat]# ll
總用量 124
drwxr-x---. 2 root root 4096 3月 31 14:30 bin
-rw-r-----. 1 root root 19318 3月 11 18:06 BUILDING.txt
drwx------. 3 root root 254 3月 31 14:31 conf
-rw-r-----. 1 root root 5408 3月 11 18:06 CONTRIBUTING.md
drwxr-x---. 2 root root 4096 3月 31 14:05 lib
-rw-r-----. 1 root root 57011 3月 11 18:06 LICENSE
drwxr-x---. 2 root root 197 3月 31 14:31 logs
-rw-r-----. 1 root root 1726 3月 11 18:06 NOTICE
-rw-r-----. 1 root root 3255 3月 11 18:06 README.md
-rw-r-----. 1 root root 7136 3月 11 18:06 RELEASE-NOTES
-rw-r-----. 1 root root 16262 3月 11 18:06 RUNNING.txt
drwxr-x---. 2 root root 30 3月 31 14:05 temp
drwxr-x---. 7 root root 81 3月 11 18:04 webapps
drwxr-x---. 3 root root 22 3月 31 14:31 work
複製程式碼
-
bin tomcat 管理命令 startup.sh shutdown.sh catalina.sh
-
catalina.sh 是 startup.sh 和 shutdown.sh 都會呼叫的
-
以後對於 Tomcat 優化(jvm 優化 設定最大記憶體 最小記憶體)和配置監控功能
-
conf 配置檔案存放目錄
-
server.xml(相當於 nginx.conf)都是主配置檔案
-
web.xm 如果要增加插架或者優化都需要修改此檔案
-
tomcat-users.xml tomcat 管理端配置檔案
-
webapps tomcat 的站點目錄類似於 nginx 的 html
-
log 日誌檔案存放目錄
-
catalina.out tomcat 的核心日誌檔案,存放著從啟動到關閉做的所有操作,這個檔案會持續變大持續增加,即使做了日誌切割這個檔案也不會縮小
-
catalina.2019-09-20.log catalina.out 切割出來的日誌,Linux 系統有一個切割工具 logrotate,yum 裝的程式預設會採用這個進行切割
-
localhost.2020-03-31.log tomcat 的訪問日誌和 nginx 的 access.log 基本一致
[[email protected] tomcat]# cat /etc/log
login.defs logrotate.conf logrotate.d/
[[email protected] tomcat]# cat /etc/logrotate.d/
bootlog cups httpd libvirtd libvirtd.qemu numad psacct sssd wpa_supplicant
chrony glusterfs iscsiuiolog libvirtd.lxc mariadb ppp samba syslog yum
[[email protected] tomcat]# cat /etc/logrotate.d/syslog
/var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler
{
missingok
sharedscripts
postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
endscript
}
[[email protected] tomcat]#
複製程式碼
5.配置 Tomcat 管理功能
啟動完 tomcat 點下圖框中預設會報錯,因為沒有賬號密碼,嘗試多次後會報 401
我們需要修改 conf/tomcat-users.xml 檔案即可,下載在登入時輸入 username 當時配置的即可正常登入
[[email protected] tomcat]# cat conf/tomcat-users.xml
<?xml version="1.0" encoding="UTF-8"?>
<tomcat-users xmlns="http://tomcat.apache.org/xml"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-users.xsd"
version="1.0">
<role rolename="admin-gui"/>
<role rolename="host-gui"/>
<role rolename="manager-gui"/>
<user username="admin" password="admin" roles="admin-gui,host-gui,manager-gui"/>
</tomcat-users>
#配置完成後需要重啟
在執行./shutdown後一定要檢視程序和埠在不在
複製程式碼
tomcat8.5 以後的版本預設只允許機訪問,換需要修改 webapps/manager/META-INF/context.xml
#將value class的行註釋掉即可
[[email protected] tomcat]# cat webapps/manager/META-INF/context.xml
<?xml version="1.0" encoding="UTF-8"?>
<Context antiResourceLocking="false" privileged="true" >
<!--<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
-->
<Manager sessionAttributeValueClassNameFilter="java\.lang\.(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.CsrfPreventionFilter\$LruCache(?:\$1)?|java\.util\.(?:Linked)?HashMap"/>
</Context>
複製程式碼
6.部署 jpress
6.1.資料庫準備
MariaDB [(none)]> create database jpress charset utf8mb4;
Query OK, 1 row affected (0.02 sec)
MariaDB [(none)]> show create database jpress;
+----------+--------------------------------------------------------------------+
| Database | Create Database |
+----------+--------------------------------------------------------------------+
| jpress | CREATE DATABASE `jpress` /*!40100 DEFAULT CHARACTER SET utf8mb4 */ |
+----------+--------------------------------------------------------------------+
1 row in set (0.00 sec)
MariaDB [(none)]> grant all on jpress.* to 'jpress'@'localhost' identified by '123456';
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]>
MariaDB [(none)]> select user,host from mysql.user;
+--------+-----------------------+
| user | host |
+--------+-----------------------+
| root | 127.0.0.1 |
| root | ::1 |
| | localhost |
| jpress | localhost |
| root | localhost |
| | localhost.localdomain |
| root | localhost.localdomain |
+--------+-----------------------+
7 rows in set (0.00 sec)
MariaDB [(none)]> grant all on jpress.* to 'jpress'@'192.168.81.%' identified by '123456';
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> drop user ''@'localhost';
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]>
MariaDB [(none)]> select user,host from mysql.user;
+--------+-----------------------+
| user | host |
+--------+-----------------------+
| root | 127.0.0.1 |
| jpress | 192.168.81.% |
| root | ::1 |
| jpress | localhost |
| root | localhost |
| | localhost.localdomain |
| root | localhost.localdomain |
+--------+-----------------------+
7 rows in set (0.00 sec)
MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.00 sec)
複製程式碼
6.2.獲取 jpress 程式碼
-
http://gitee.com/GalaIO/jpress/blob/master/wars/jpress-web-newest.war
[[email protected] webapps]# cp jpress/jpress/wars/jpress-web-newest.war .
[[email protected] webapps]# rm -rf jpress
[[email protected] webapps]# rm -rf jpress.war
[[email protected] webapps]# mv jpress-web-newest jpress
[[email protected] webapps]# mv jpress-web-newest.war jpress.war
[[email protected] webapps]# ls
docs examples host-manager jpress jpress.war jpress-web-newest manager ROOT
複製程式碼
-
下面訪問 http://192.168.81.210:8080/jpress
-
我們去重啟一下 tomcat
-
jpress 的配置檔案位於 webapps/jpress/WEB-INF/classes, db.properties
-
安裝完成預設是進入整體的首頁,我們可以使用單獨賬號進行登入
-
然後去訪問 http://192.168.81.210:8080/jpress/admin
-
可以寫一篇文章並上傳圖片
-
-
在 jpress/attachment/20200331/目錄可以看到使用者上傳的附件
-
可以看到 jpress 中的表
MariaDB [(none)]> show tables from jpress;
+-------------------+
| Tables_in_jpress |
+-------------------+
| jpress_attachment |
| jpress_comment |
| jpress_content |
| jpress_mapping |
| jpress_metadata |
| jpress_option |
| jpress_taxonomy |
| jpress_user |
+-------------------+
8 rows in set (0.01 sec)
文章內容應該是在content表中
MariaDB [(none)]> select * from jpress.jpress_content \G;
*************************** 1. row ***************************
id: 1
title: 第一篇測試文件
text: <p>江曉龍很牛!!!!<img src="/jpress/attachment/20200331/da5a9dd62da44c3fb1cab6fe9f7b293d.jpg" alt="啊啊啊" width="554" height="221"></p>
thumbnail: NULL
module: article
style: NULL
user_id: 1
parent_id: NULL
object_id: NULL
order_number: 0
status: normal
vote_up: 0
vote_down: 0
price: 0.00
comment_status: NULL
comment_count: 0
view_count: 0
created: 2020-03-31 18:16:56
modified: 2020-03-31 18:16:56
slug: 第一篇測試文件
flag: NULL
lng: NULL
lat: NULL
meta_keywords: NULL
meta_description: NULL
remarks: NULL
複製程式碼
-
刪除這條記錄,頁面的文章跟著消失
-
在插回去,內容還會存在
7.顯示 jvm 記憶體資訊
#需要在webapps/ROOT目錄下寫一個mem.jsp的檔案
[[email protected] tomcat]# cat webapps/ROOT/mem.jsp
<%
Runtime rtm = Runtime.getRuntime();
long mm = rtm.maxMemory()/1024/1024;
long tm = rtm.totalMemory()/1024/1024;
long fm = rtm.freeMemory()/1024/1024;
out.println("JVM memory detail info :<br>");
out.println("Max memory:"+mm+"MB"+"<br>");
out.println("Total memory:"+tm+"MB"+"<br>");
out.println("Free memory:"+fm+"MB"+"<br>");
out.println("Available memory can be used is :"+(mm+fm-tm)+"MB"+"<br>");
%>
複製程式碼
-
訪問 http://192.168.81.210:8080/mem.jsp
-
8.Tomcat 主配置檔案
#shutdown埠 連線到這個埠並輸入後面的暗號 SHUTDOWN 把tomcat關閉,需要把暗號給改掉
<Server port="8005" shutdown="SHUTDOWN">
[[email protected] tomcat]# ss -lnptu | grep java
tcp LISTEN 0 100 :::8080 :::* users:(("java",pid=77014,fd=52))
tcp LISTEN 0 1 ::ffff:127.0.0.1:8005 :::* users:(("java",pid=77014,fd=62))
[[email protected] tomcat]# telnet 127.0.0.1 8005
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
SHUTDOWN
Connection closed by foreign host.
[[email protected] tomcat]# ss -lnptu | grep java
#tomcat管理端,一般不開放,以免使用者看到配置
<GlobalNamingResources>
<!-- Editable user database that can also be used by
UserDatabaseRealm to authenticate users
-->
<Resource name="UserDatabase" auth="Container"
type="org.apache.catalina.UserDatabase"
description="User database that can be updated and saved"
factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
pathname="conf/tomcat-users.xml" />
</GlobalNamingResources>
#設定tomcat的埠,web功能,redirectPort是表示啟用了https後的埠也就是443
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
#tomcat執行緒數,maxThreads表示在tomcat忙的時候最多處理多少個執行緒,minSpareThreads表示正常情況下tomcat處理執行緒的數量
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
maxThreads="150" minSpareThreads="4"/>
#8009 ajp 工作方式:與Apache配合
<Connector protocol="AJP/1.3"
address="::1"
port="8009"
redirectPort="8443" />
#host 虛擬主機部分
#host name:配置域名
#appBase:站點目錄
#uppackWARS:是否自動解壓war包,true就是解壓,false就是不解壓
#autoDeploy:是否自動部署把磁碟中的扔到jvm中
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<!--<Context docBase="/application/tomcat/webapps/" path="" reloadable="false">
</Context>-->
<!-- SingleSignOn valve, share authentication between web applications
Documentation at: /docs/config/valve.html -->
<!--
<Valve className="org.apache.catalina.authenticator.SingleSignOn" />
-->
<!-- Access log processes all example.
Documentation at: /docs/config/valve.html
Note: The pattern used is equivalent to using pattern="common" -->
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
#tomcat訪問日誌的格式
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
複製程式碼
9.Tomcat 多例項配置
一臺主機可能會跑多個 tomcat
[[email protected] soft]# tar -xf apache-tomcat-8.5.53.tar.gz
[[email protected] soft]# ls
apache-tomcat-8.5.53 apache-tomcat-8.5.53.tar.gz jdk-8u60-linux-x64.tar.gz
[[email protected] soft]# mv apache-tomcat-8.5.53 ../tomcat_8081
[[email protected] soft]# tar -xf apache-tomcat-8.5.53.tar.gz
[[email protected] soft]# mv apache-tomcat-8.5.53 ../tomcat_8082
[[email protected] application]# sed -ri 's/8080/8081/g' tomcat_8081/conf/server.xml
[[email protected] application]# sed -ri 's/8005/8006/g' tomcat_8081/conf/server.xml
[[email protected] application]# sed -ri 's/8009/8010/g' tomcat_8081/conf/server.xml
[[email protected] application]# sed -ri 's/8080/8082/g' tomcat_8082/conf/server.xml
[[email protected] application]# sed -ri 's/8005/8007/g' tomcat_8082/conf/server.xml
[[email protected] application]# sed -ri 's/8009/8011/g' tomcat_8082/conf/server.xml
[[email protected] application]# tomcat_8081/bin/startup.sh
[[email protected] application]# tomcat_8082/bin/startup.sh
複製程式碼
#書寫tomcat相關指令碼時(啟動 重啟 監控)都有精確過濾
ps aux | grep java | grep tomcat_8081
複製程式碼
10.Tomcat 監控
監控方式
-
簡單命令
-
現成指令碼
-
通過 zabbix 自定義監控
-
自定義監控 只要是用命令能得到的東西都能去監控
-
通過 jmx 對 java 進行監控
-
其他監控
-
通過 ipmi 監控硬體的
-
通過 snmp 監控網路裝置的,只要支援 snmp 都能監控
java 自帶的監控命令
-
jps 匯出 java 相關的程序
-
格式:jps -lvm
-
引數選項:-lvm 最詳細
[[email protected] ~]# jps -lvm
7457 org.apache.catalina.startup.Bootstrap start start -Djava.util.logging.config.file=/application/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -Dcatalina.base=/application/tomcat -Dcatalina.home=/application/tomcat -Djava.io.tmpdir=/application/tomcat/temp
7525 org.apache.catalina.startup.Bootstrap start start -Djava.util.logging.config.file=/application/tomcat_8082/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -Dcatalina.base=/application/tomcat_8082 -Dcatalina.home=/application/tomcat_8082 -Djava.io.tmpdir=/application/tomcat_8082/temp
9144 sun.tools.jps.Jps -lvm -Denv.class.path=.:/application/jdk/lib:/application/jdk/jre/lib:/application/jdk/lib/tools.jar -Dapplication.home=/application/jdk1.8.0_60 -Xms8m
7482 org.apache.catalina.startup.Bootstrap start start -Djava.util.logging.config.file=/application/tomcat_8081/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -Dcatalina.base=/application/tomcat_8081 -Dcatalina.home=/application/tomcat_8081 -Djava.io.tmpdir=/application/tomcat_8081/temp
複製程式碼
-
jmap 匯出 jvm 資訊,常用於自定義監控
-
格式:jmap pid
-
引數:-heap
[[email protected] ~]# jmap -heap 7457
Attaching to process ID 7457, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.60-b23
using thread-local object allocation.
Mark Sweep Compact GC
Heap Configuration:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize = 255852544 (244.0MB)
NewSize = 5570560 (5.3125MB)
MaxNewSize = 85262336 (81.3125MB)
OldSize = 11206656 (10.6875MB)
NewRatio = 2
SurvivorRatio = 8
MetaspaceSize = 21807104 (20.796875MB)
CompressedClassSpaceSize = 1073741824 (1024.0MB)
MaxMetaspaceSize = 17592186044415 MB
G1HeapRegionSize = 0 (0.0MB)
Heap Usage: #監控的話關注這一列
New Generation (Eden + 1 Survivor Space):
capacity = 12779520 (12.1875MB)
used = 11689352 (11.147834777832031MB)
free = 1090168 (1.0396652221679688MB)
91.46941356169872% used
Eden Space: #監控的話關注這一列
capacity = 11403264 (10.875MB)
used = 11059616 (10.547271728515625MB)
free = 343648 (0.327728271484375MB)
96.98640669899426% used
From Space: #監控的話關注這一列
capacity = 1376256 (1.3125MB)
used = 629736 (0.6005630493164062MB)
free = 746520 (0.7119369506835938MB)
45.75718470982143% used
To Space: #監控的話關注這一列
capacity = 1376256 (1.3125MB)
used = 0 (0.0MB)
free = 1376256 (1.3125MB)
0.0% used
tenured generation: #監控的話關注這一列
capacity = 28164096 (26.859375MB)
used = 18313224 (17.46485137939453MB)
free = 9850872 (9.394523620605469MB)
65.02329774760035% used
21146 interned Strings occupying 1882520 bytes.
複製程式碼
-
jstatck 匯出 java 的程序資訊,常用於 java 程式故障,需要匯出執行緒資訊與開發一起研究
-
格式:jstack -l pid
[[email protected] ~]# jstack -l 7457
複製程式碼
-
tomcat 故障案例:系統負載高,tomcat 佔用 CPU 較高
-
1.jps/top/htop 精確確定哪個 java 程序導致
-
2.jstack 匯出 java 執行緒
-
3.catalina.out 日誌分析
-
4.jmap 匯出 jvm 資訊,可以通過 mat 工具進行分析
-
tomcat 監控
-
自定義監控:直接在 tomcat 伺服器上寫好指令碼,在 zabbix 配置檔案寫好就行
-
首先需要在 zabiix 服務端安裝 zabbix-java-gateway 然後在 tomcat 伺服器開啟監控功能
-
tomcat 開啟 jmx 監控功能
#修改bin/catalina.sh
[[email protected] tomcat]# vim bin/catalina.sh
#注意不能分行寫會報錯找不到命令,要寫在一行上
CATALINA_OPTS="$CATALINA_OPTS"
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=12345
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jxmremote.ssl=false
-Djava.rmi.server.hostname="192.168.81.210"
#正確寫法
CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=12345 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jxmremote.ssl=false -Djava.rmi.server.hostname=192.168.81.210"
#說明
CATALINA_OPTS="$CATALINA_OPTS" #修改tomcat啟動引數
-Dcom.sun.management.jmxremote #開啟tomcat遠端管理功能
-Dcom.sun.management.jmxremote.port=12345 #遠端管理功能,除了12345埠,還會生成2個隨機埠,我們可以開放所有埠
Dcom.sun.management.jmxremote.authenticat=false #是否在監控時需要認證
-Dcom.sun.management.jmxremote.ssl=false #是否開啟ssl連線
-Djava.rmi.server.hostname="192.168.81.210" #設定tomcat所在伺服器的ip
配置完成後重啟tomcat即可
使用ps命令可以看到輸出的資訊多了我們寫入的幾行
[[email protected] tomcat]# ps aux | grep java
root 17786 5.7 10.6 2306592 105860 pts/1 Sl 15:52 0:08 /application/jdk/bin/java
-Djava.util.logging.config.file=/application/tomcat/conf/logging.properties
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
-Djdk.tls.ephemeralDHKeySize=2048
-Djava.protocol.handler.pkgs=org.apache.catalina.webresources
-Dorg.apache.catalina.security.SecurityListener.UMASK=0027
-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=12345
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jxmremote.ssl=false
-Djava.rmi.server.hostname=192.168.81.210
-Dignore.endorsed.dirs=
-classpath /application/tomcat/bin/bootstrap.jar:/application/tomcat/bin/tomcat-juli.jar
-Dcatalina.base=/application/tomcat
-Dcatalina.home=/application/tomcat
-Djava.io.tmpdir=/application/tomcat/temp org.apache.catalina.startup.Bootstrap start
使用ss/netstat 命令可以看到多出啦的三個埠
[[email protected] tomcat]# ss -lnptu | grep java
tcp LISTEN 0 100 :::8080 :::* users:(("java",pid=17786,fd=56))
#我們制定的
tcp LISTEN 0 50 :::12345 :::* users:(("java",pid=17786,fd=22))
#隨機的1
tcp LISTEN 0 50 :::46272 :::* users:(("java",pid=17786,fd=21))
#隨機的2
tcp LISTEN 0 50 :::46081 :::* users:(("java",pid=17786,fd=24))
tcp LISTEN 0 1 ::ffff:127.0.0.1:8005 :::* users:(("java",pid=17786,fd=65))
複製程式碼
-
可以使用 jsconsole 進行測試
11.Tomcat 安全優化
tomcat 安全管理規範
-
修改 8005 埠的暗號
-
修改 8009 埠
-
禁用管理端
-
降權啟動,tomcat 一般以普通使用者進行管理
-
關閉檔案列表功能
-
版本資訊隱藏,tomcat 報錯後會有版本提示,定義一個 error-code
-
server header 重寫,修改 http 響應頭中的服務端名稱
-
設定訪問限制
-
指令碼許可權設定
-
日誌設定
12.Tomcat 總結
-
tomcat 故障案例
-
tomcat 安全優化
-
tomcat 目錄 配置
-
多例項
-
監控
- “打臉”谷歌雲,說好的超低延遲和可靠性呢?
- 過去的十五年,我們怎樣做 IM?
- 轉轉 K8s 實踐:如何解決容器化帶來的四大問題
- 企業級證券業務中臺探索與實踐
- 雲原生(十八) | Kubernetes 篇之 Kubernetes(k8s)工作負載
- 【原始碼解析】MyBatis 整體架構與原始碼解析
- 見微知著,帶你認認資料分析的大門,站在門口感受一下預測的魅力
- 未來是國產作業系統的鑽石時代,微核心將成為新的發展方向|對話中興新支點作業系統崔黎明
- 【React 原始碼系列】React Hydrate 原理及原始碼剖析
- 花 31 萬元重新設計網站後,我後悔了
- 一文帶你打通 Node 流的"任督二脈"
- RT-Thread 記錄(七、IPC 機制之郵箱、訊息佇列)
- 開發人員應該知道的零信任模型
- 大佬,還記得設計模式的六大設計原則嗎?
- Java 引數傳遞到底是按 值傳遞 還是 引用傳遞 ?
- 資料技術大融合,HSTAP 資料庫有多少想象空間?
- 說了半天跨平臺,今兒咱就來跨跨!(完結篇)——Kubernetes 上手實踐
- 我認為前端的職責可能需要重新劃分
- 使用 External Secrets Operator 管理 Kubernetes 的 Secret
- Android 應用安全機制實現方案探究