⭐萬字長篇超詳細的圖解 Tomcat 中介軟體方方面面儲備知識⭐

語言: CN / TW / HK

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/jdkexport PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATHexport CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jarEOF
[[email protected] ~]# mkdir /application[[email protected] application]# rz -Erz 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/tomcatUsing CATALINA_HOME:   /application/tomcatUsing CATALINA_TMPDIR: /application/tomcat/tempUsing JRE_HOME:        /application/jdkUsing CLASSPATH:       /application/tomcat/bin/bootstrap.jar:/application/tomcat/bin/tomcat-juli.jarServer version: Apache Tomcat/8.5.53Server built:   Mar 11 2020 10:01:39 UTCServer number:  8.5.53.0OS Name:        LinuxOS Version:     3.10.0-957.el7.x86_64Architecture:   amd64JVM Version:    1.8.0_60-b27JVM Vendor:     Oracle Corporation
#到此為止Tomcat部署完成

複製程式碼

3.3.啟動與管理

  • startup.sh 啟動

  • shutdown.sh 關閉

  • catalina.sh 核心指令碼

#startup.sh最主要的部分PRG="$0"    #指令碼名:/application/bin/startup.shPRGDIR=`dirname "$PRG"`    #dirname用於取出檔案所在的路徑,basename用於取出檔名EXECUTABLE=catalina.shexec "$PRGDIR"/"$EXECUTABLE" start "[email protected]"#相當於 exec /application/tomcat/bin/catalina.sh start    exec可以省略

複製程式碼

啟動分析

[[email protected] tomcat]# ./bin/startup.sh Using CATALINA_BASE:   /application/tomcatUsing CATALINA_HOME:   /application/tomcatUsing CATALINA_TMPDIR: /application/tomcat/tempUsing JRE_HOME:        /application/jdkUsing CLASSPATH:       /application/tomcat/bin/bootstrap.jar:/application/tomcat/bin/tomcat-juli.jarTomcat started.
[[email protected] tomcat]# ss -lnptu | grep javatcp 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 javaroot 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.Bootstrapstart

複製程式碼

4.Tomcat 目錄結構

[[email protected] tomcat]# ll總用量 124drwxr-x---. 2 root root  4096 3月  31 14:30 bin-rw-r-----. 1 root root 19318 3月  11 18:06 BUILDING.txtdrwx------. 3 root root   254 3月  31 14:31 conf-rw-r-----. 1 root root  5408 3月  11 18:06 CONTRIBUTING.mddrwxr-x---. 2 root root  4096 3月  31 14:05 lib-rw-r-----. 1 root root 57011 3月  11 18:06 LICENSEdrwxr-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.txtdrwxr-x---. 2 root root    30 3月  31 14:05 tempdrwxr-x---. 7 root root    81 3月  11 18:04 webappsdrwxr-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 程式碼

  • https://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 javatcp 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 8005Trying 127.0.0.1...Connected to 127.0.0.1.Escape character is '^]'.SHUTDOWNConnection 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]# lsapache-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 目錄 配置

  • 多例項

  • 監控