tomcat總結

java與tomcat搭配,tomcat用來運行java程序
目前Tomcat最新版本爲9.0
Tomcat處理靜態HTML的能力不如Nginx/Apache服務器。
Java容器還有resin、weblogic等
Tomcat服務器是一個免費的開放源代碼的Web應用服務器,在中小型系統和併發訪問用戶不是不少的場合下被廣泛使用,是開發和調試JSP網頁的首選
Tomcat官網:http://tomcat.apache.org/

常規JAVA應用架構模型:
首先,咱們以前搭建的網站,php的,前面有個nginx反向代理,就是lb01,後面有咱們的web服務器,web服務器上是nginx加php,數據庫被咱們丟到後面了,這就是一個經典的套路,可是到了tomcat java程序中,稍微有那麼點變化,也就是tomecat他本身就是一個服務器,他又能夠處理java這種動態的請求,他的應該是這樣的,前面一個nginx反向代理,這確定要加的,後面加上tomcat,而後讓他鏈接數據庫,可是注意,tomcat這個只要是處理java程序的或者jsp這些頁面的,因此對於一些靜態的請求,還不是太擅長處理,效率不高,因此對於tomcat這種java程序的網站,必定要作好動靜分離,動態的給tomcat處理,靜態的就交給nginx本身搞定就好了,最好必定要作上動靜分離,靜態頁面放一塊兒,動態交給tomcat,若是這裏你發現了,頂替以前php地位的叫JVM,實際上是tomcat裏面,這個核心
一塊兒來看看什麼是JVM(java虛擬機),他完成了什麼事情?這個虛擬機能夠在任何系統裏運行,只要有java虛擬機的環境準備好了,就能夠運行這個這個java的程序php

jdk:java develpement kit,是java所運行的環境工具,也是JVM tomcat運行所必要的環境
Oracle JDK:商業軟件 官方的
openjdk:開源軟件 在linux下yum安裝就是openjdkhtml

===================================
環境準備及軟件選擇
從CentOS7模板機全新克隆2臺新主機
第1臺:IP規劃爲10.0.0.17/172.16.1.9,主機名爲web03
第2臺:IP規劃爲10.0.0.18/172.16.1.10,主機名爲web04
準備好lb01(CentOS6),須要其上的nginx反向代理功能
下載相關軟件包:http://pan.baidu.com/s/1IpioA
注:jdk和Tomcat的版本對運維來講沒什麼區別,安裝方法高度一致。java

===================================
######部署jdk
打開web03服務器
mkdir -p /server/tools/
cd /server/tools/
#tomcat包和jdk包上傳到linux 上傳jdk-8u60-linux-x64.tar.gz apache-tomcat-8.0.27.tar.gz
#tomcat是apache這個基金會中的一個項目,一個軟件,web服務叫httpd,apache是一個總體的項目,好多軟件的
rz
ll -h
mkdir -p /application/
#-C解壓到指定目錄
tar xf jdk-8u60-linux-x64.tar.gz -C /application/
ls -l /application/
#必定要建立軟連接,不然下面的步驟就錯了
ln -s /application/jdk1.8.0_60/ /application/jdk
#配置java相關的一些環境變量,java中,環境變量就多一點了,把他們配置到/etc/profile中,注意EOF兩邊要加單引號,不加的話會$環境變量直接解析,咱們這裏是不須要解析的
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
EOFmysql

或者
sed -i.ori '$a export JAVA_HOME=/application/jdk\nexport PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH\nexport CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar' /etc/profilelinux

#讓它生效
source /etc/profile
#驗證jdk是否配置成功
java -version
有顯示信息以下就表明配置成功:
java version "1.8.0_60"
Java(TM) SE Runtime Environment (build 1.8.0_60-b27)
Java HotSpot(TM) 64-Bit Server VM (build 25.60-b23, mixed mode)nginx

========================================================
########部署tomcat jdk 與tomcat會有版本兼容問題這個注意一下,tomcat不像php,也不像nginx須要編譯,tomcat解壓你就能夠用,準備好jdk環境,解壓你就能用
tar xf apache-tomcat-8.0.27.tar.gz -C /application/
ln -s /application/apache-tomcat-8.0.27/ /application/tomcat
#配置tomcat的老家 TOMCAT_HOME
echo 'export TOMCAT_HOME=/application/tomcat'>>/etc/profile
source /etc/profile
#還有個問題,咱們解壓出來的這些軟件,有一些是從網上下載的壓縮包,解壓出來,正常應該是屬於咱們root用戶,可是有的時候會變成這樣,變成數字,例如這裏變成10,這說明這個文件對應的用戶,好比說這是uid 10,對應的用戶不存在,這樣會致使有的時候會有權限問題,因此最終仍是改一下全部者
ll /application/jdk/ /application/tomcat/
chown -R root.root /application/jdk/ /application/tomcat/
ll /application/jdk/ /application/tomcat/
#查看tomcat 版本信息及其餘信息,顯示出了tomcat的版本8.0.27,還有系統的配置,JVM的版本,也就是JDK的版本,這表示你的JDK和tomcat部署成功
/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.0.27
Server built: Sep 28 2015 08:17:25 UTC
Server number: 8.0.27.0
OS Name: Linux
OS Version: 2.6.32-696.el6.x86_64
Architecture: amd64
JVM Version: 1.8.0_60-b27
JVM Vendor: Oracle Corporationgit

#有時候tomcat啓動關閉慢,能夠安裝rngd服務(熵服務,增大熵池),提高速度
yum install rng-tools -ygithub

#啓動服務
systemctl start rngd
systemctl enable rngdweb

#啓動關閉tomcatbr/>@@@@@@@@@@@@@@@@@@@@@@@@@@@@
xshell開啓另一個窗口觀察tomcat的日誌面試

/application/tomcat/logs/catalina.out
tail -f /application/tomcat/logs/catalina.outbr/>@@@@@@@@@@@@@@@@@@@@@@@@@@@@
/application/tomcat/bin/startup.sh
#注意ss -lntup查看的是端口,不是查grep tomcat ,ss -lntup|grep tomcat語句是廢的,查不出結果的
#ps -ef|grep tomcat 能查到tomcat進程,通常咱們不查,只查java就能夠
#它默認用的接口是8080端口,有好幾個端口,8080,8009,8005
ss -lntup|grep java
#關閉tomcat,注意tomcat關閉通常是比較慢的
/application/tomcat/bin/shutdown.sh
#關完以後必定要檢查一下端口,還要檢查下進程,注意必定要檢查進程和端口都沒了,才確保tomcat是關閉的,不然有的時候端口沒了,進程還在,你再啓動的話,就起了好幾個tomcat,會有故障
ss -lntup|grep java
ps -ef|grep java
#咱們再啓動下
/application/tomcat/bin/startup.sh

#看啓動日誌的話主要看下面
org.apache.catalina.startup.Catalina.start Server startup in 1244 ms 表示你的服務啓動了,看日誌的話主要看startup字樣
org.apache.coyote.AbstractProtocol.destroy Destroying ProtocolHandler ["http-nio-8080"] 看到這個表示關閉服務了

#tomcat和java開機自啓動
chmod +x /etc/rc.d/rc.local
echo "/application/tomcat/bin/startup.sh" >>/etc/rc.d/rc.local

####在瀏覽器打開看下,能看到tomcat小獅子表明配置成功
http://10.0.0.9:8080

PS:
#若是防火牆開啓的話,可能要防火牆添加8080端口
firewall-cmd --zone=public --add-port=8080/tcp --permanent
sudo firewall-cmd --reload

============================================================
Tomcat目錄結構說明
├── bin # startup.sh shutdown.sh catalina.sh(核心)
├── conf # server.xml(主配置文件) tomcat-users.xml
├── lib
├── LICENSE
├── logs # 日誌目錄 catalina.out tomcat實時日誌
├── NOTICE
├── RELEASE-NOTES
├── RUNNING.txt
├── temp
├── webapps # 站點目錄
└── work

cd /application/tomcat/
ll
tree -L 1
.
├── bin
├── conf
├── lib
├── LICENSE
├── logs
├── NOTICE
├── RELEASE-NOTES
├── RUNNING.txt
├── temp
├── webapps
└── work
或者
find -maxdepth 1
.
./RELEASE-NOTES
./NOTICE
./RUNNING.txt
./temp
./bin
./lib
./conf
./LICENSE
./webapps
./work
./logs


#bin目錄放着tomcat裏面的管理命令,主要用就這麼幾個,開啓startup.sh 關閉shutdown,sh 有一些是bat是windows下使用的,sh是linux下使用的,因此tomcat兼容了linux 和win
#startup.sh仍是shutdown.sh 最終都調用了一個叫catalina.sh,這是tomcat主腳本
ls bin/
bootstrap.jar configtest.bat setclasspath.sh tomcat-native.tar.gz
catalina.bat configtest.sh shutdown.bat tool-wrapper.bat
catalina.sh daemon.sh shutdown.sh tool-wrapper.sh
catalina-tasks.xml digest.bat startup.bat version.bat
commons-daemon.jar digest.sh startup.sh version.sh
commons-daemon-native.tar.gz setclasspath.bat tomcat-juli.jar

#tomcat的配置文件目錄,核心的主配置文件叫server.xml,有點相似於咱們的nginx.conf,其餘都是爲了他作鋪墊
#tomcat-users.xml這是配置web頁面管理tomcat用的,用來管理和控制tomcat,等下還會配置他
#這些配置文件很重要,他們的權限看好了,都是600
ll conf/
total 212
-rw------- 1 root root 12374 Sep 28 2015 catalina.policy
-rw------- 1 root root 7106 Sep 28 2015 catalina.properties
-rw------- 1 root root 1577 Sep 28 2015 context.xml
-rw------- 1 root root 3387 Sep 28 2015 logging.properties
-rw------- 1 root root 6458 Sep 28 2015 server.xml
-rw------- 1 root root 1744 Sep 28 2015 tomcat-users.xml
-rw------- 1 root root 1846 Sep 28 2015 tomcat-users.xsd
-rw------- 1 root root 167302 Sep 28 2015 web.xml

lib/通常是一些庫文件,你若是要給tomcat增長一些插件和功能,能夠把這些插件和功能放到lib
LICENSE是不用管了,什麼許可證啥的,RUNNING.txt這些文本文件都不用管了

logs\就是日誌的,日誌目錄,默認裏面是空的沒有文件,catalina.out文件是tomcat實時日誌,主要的訪問日誌

ll /application/tomcat/logs/
-rw-r--r-- 1 root root 35545 Nov 6 20:52 catalina.2019-11-06.log
-rw-r--r-- 1 root root 29444 Nov 6 20:52 catalina.out
-rw-r--r-- 1 root root 0 Nov 6 20:31 host-manager.2019-11-06.log
-rw-r--r-- 1 root root 1948 Nov 6 20:52 localhost.2019-11-06.log
-rw-r--r-- 1 root root 705 Nov 6 20:52 localhost_access_log.2019-11-06.txt
-rw-r--r-- 1 root root 0 Nov 6 20:31 manager.2019-11-06.log

主要看的日誌叫catalina.out,咱們運維人員以及開發人員會常常看的
catalina.2019-11-06.log和catalina.out這兩個文件中的日誌實際上是如出一轍的
cd /application/tomcat/logs/

catalina.2019-11-06.log
catalina.out
/application/tomcat/bin/shutdown.sh
md5sum catalina.2019-11-06.log catalina.out
8317309f486c811f97229725c5d37a72 catalina.2019-11-06.log
8317309f486c811f97229725c5d37a72 catalina.out
或者
diff catalina.out catalina.2019-11-06.log

catalina.2019-11-06.log和catalina.out這兩個文件有啥區別?
catalina.out這個文件的日誌會不斷的往這裏寫入,一直到磁盤滿了,這個文件就會一直增大
那catalina.2019-11-06.log這個文件就是叫切割日誌
catalina.out這個文件就是記錄tomcat實時的信息
catalina.out # 實時記錄tomcat運行信息,文件會愈來愈大,定時清空,catalina.out被切割以後,應該是會被清空,可是並無,他會隨着時間,這個文件會愈來愈大,因此最好對這個文件進行定時的清空,由於他有個切割日誌就OK了
catalina.時間.log # catalina.out文件天天的日誌切割文件,加上這個時間,天天切一次

每一個站點訪問日誌

#這是管理咱們這些主機的,管理主機操做日誌,你在tomcat web頁面上點點點就會有一些操做記錄下來
host-manager.時間.log
#localhost這些都是訪問日誌
localhost_access_log.時間.txt
localhost.時間.log
#manager也是操做日誌
manager.時間.log
可是如今這幾個日誌是空的,一個是host-manager,一個是manager
host-manager和manager都空的
localhost_acess_log訪問日誌
localhost這裏沒什麼的

#localhost.2019-11-06.log簡單的記錄,關啊開啊等等,啓動狀態等等
cat localhost.2019-11-06.log


temp\是臨時的
webapps\有點相似於咱們的nginx的那個html目錄,站點目錄
work\瞭解下的,一個工做的目錄

====================================================================
tomcat 管理功能

tomcat_users.xml用來管理和控制tomcat的管理功能的

什麼是tomcat的管理功能?
http://10.0.0.9:8080/頁面上右邊有三個按鈕
Server Status 狀態的
Manager App 管理的
Host Manager host的
一開始點這三個按鈕是點不進去的,點擊都彈出要輸入用戶名和密碼的對話框
這三個按鈕叫tomcat的管理功能的

可是這種功能不要對外開放,通常也就是本身測試的時候用一用,實際生產環境中,不要開這個,太危險

怎麼開啓這個管理功能呢?
cd /application/tomcat/
#vim conf/tomcat-users.xml
#tomcat的全部配置文件,都是這種xml的格式,第一行就是配置了一些字符集,版本的等等,有點相似於shell腳本的第一行#!/bin/sh
#<?xml version='1.0' encoding='utf-8'?>
#在</tomcat-users>上面粘貼,注意必定要保證這部分結束是</tomcat-users>,上面開始就是<tomcat-users>,結束就是</tomcat-users>
sed -i.ori '38a <role rolename="manager-gui"/>\n<role rolename="admin-gui"/>\n<role rolename="host-gui"/>\n<user username="tomcat" password="tomcat" roles="manager-gui,admin-gui,host-gui"/>' /application/tomcat/conf/tomcat-users.xml

#相似如下
<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="manager-gui"/>
<role rolename="admin-gui"/>
<role rolename="host-gui"/>
<user username="tomcat" password="tomcat" roles="manager-gui,admin-gui,host-gui"/>
</tomcat-users>

#這裏規定了幾個rolename角色名字,例如manager-gui,至關因而功能,username就是用戶名,密碼,而後這個用戶屬於哪個功能
#對應的是這個tomcat頁面的三個按鈕Server Status,Manager App,Host Manager點開來的頁面

tail -5 /application/tomcat/conf/tomcat-users.xml
#改完配置文件,必定要記得重啓tomcat
/application/tomcat/bin/shutdown.sh
#檢查端口和進程還有沒在運行
ss -lntup|grep java
ps -ef|grep java
/application/tomcat/bin/startup.sh
ss -lntup|grep java
ps -ef|grep java

##打開http://10.0.0.9:8080/
#點擊Server Status按鈕
帳號密碼輸入tomcat
這裏主要關注服務Server Information這一欄的信息就行
tomcat版本,JDK版本,系統,系統版本,主機名,ip地址等這些
而後下面的JVM內部的信息你瞭解一下,看一看就OK了,這個JVM更深刻的能夠不用太熟悉

#點擊Manager App按鈕
帳號密碼輸入tomcat
Applications這個主要用來幹什麼?說你的這些目錄,目錄下都有什麼,就是這種/docs
Deploy
WAR file to deploy還有能夠在這來部署,咱們不是部署過wordpress,那是PHP的,咱們部署java的,其實就是各類的WAR包,網站程序的壓縮包,能夠在這上傳
可是這種都是web頁面的了,咱們也能夠不用這種

#點擊Host Manager按鈕
帳號密碼輸入tomcat
Add Virtual Host這是虛擬主機的管理,他通常不在這管的

注意以上這三個功能仍是比較危險的,實際工做生產環境不開就OK了

=======================================================================================

部署jpress站點(jpress相似wordpress是博客系統)
環境:開啓web03和db01,Linux Tomcat JDK MySQL(Mariadb)

db01:
yum -y install mariadb-server
systemctl start mariadb.service
systemctl enable mariadb.service
mysql -uroot -poldboy123;
create database jpress DEFAULT CHARACTER SET utf8;
show databases;
grant all on jpress.* to jpress@'localhost' identified by '123456';
select user,host from mysql.user;
flush privileges;
按ctrl+d退出mysql模式

#試一下web03可否連到db01,可是web03沒有mysql命令,從db01上覆制一個過來
[root@web03 tomcat]# mysql
-bash: mysql: command not found
[root@web03 tomcat]#

到db01上輸入命令
scp /application/mysql/bin/mysql 172.16.1.9:/bin/ 要輸入yes 而後輸入對邊root的密碼
mysql -uroot -poldboy123;
#數據庫開啓客戶端用戶遠程訪問
grant all on jpress.* to 'jpress'@'172.16.1.0/255.255.255.0' identified by '123456'
select user,host from mysql.user;

回到web03:
which mysql
mysql --version
ping 10.0.0.51
mysql -ujpress -p123456 -h 172.16.1.51;
ctrl+d 退出mysql

準備程序代碼:
#程序代碼上傳到webapps目錄
cd /application/tomcat/webapps/
ll
#上傳jpress-web-newest.war文件(這個叫war包,本質就是個壓縮包)到webapps,上傳的這個war包,系統等會會自動幫你解壓
rz
ll

切換到新的web03窗口,看下是否有解壓日誌:
tail -f /application/tomcat/logs/catalina.out
有如下日誌
12-Nov-2019 22:02:20.441 INFO [localhost-startStop-3] org.apache.catalina.startup.HostConfig.deployWAR Deployment of web application archive /application/apache-tomcat-8.0.27/webapps/jpress-web-newest.war has finished in 5,501 ms

回到舊的web03窗口,ll能夠看到已經解壓了,多了個文件夾jpress-web-newest
ll

以上就是上傳WAR 而後自動解壓部署,這就是自動部署的功能

##在web頁面部署咱們的網站
瀏覽器輸入如下網址:
http://10.0.0.9:8080/jpress-web-newest

回到db01,填寫數據庫信息以前,必定要確保數據庫原來是沒有表的,否則有表的話,會提示鏈接數據庫不上
mysql -uroot -poldboy123;
show tables from jpress;
提示如下沒有表
Empty set (0.00 sec)

回到瀏覽器:
點下一步-數據庫名jpress,用戶名jpress,密碼123456,數據庫主機172.16.1.51,點下一步-網站名稱:老男孩教育-jpress,管理員oldboy,登陸密碼oldboy,點完成-頁面雖然提示正在重啓,實際不會自動重啓,須要咱們手動重啓下-
/application/tomcat/bin/shutdown.sh
ss -lntup|grep java
ps -ef|grep java
#發現端口沒了,可是進程還在
pkill java
pkill java
#OK了 進程已經沒了
ps -ef|grep java
/application/tomcat/bin/startup.sh
#發現端口,進程都有了
ss -lntup|grep java
ps -ef|grep java

http://10.0.0.9:8080/jpress-web-newest/
http://10.0.0.9:8080/jpress-web-newest/admin/login
用戶名密碼都爲oldboy,點登陸按鍵
寫篇文章

回到db01:
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.00 sec)

=====================================================================
###########Tomcat主配置文件介紹server.xml

cat /application/tomcat/conf/server.xml
#8005叫shutdown端口,意思是向8005這個端口中發送一些數據,你就能把tomcat關閉,你能夠用telnet或nc向這個8005發送一個shutdown,注意大寫的,你的tomcat就被關了,這個仍是比較危險的,實際工做的時候會把這個端口,還有這個關閉的暗號給改掉
<Server port="8005" shutdown="SHUTDOWN">

#這部分配置的是咱們tomcat的這個管理功能和管理功能對應的文件tomcat-users.xml,可是注意,這個管理功能在實際的時候不要用,不要用它
<GlobalNamingResources>
<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默認的訪問端口8080,而後他用的協議,鏈接超時時間,這個單位不是秒,是毫秒,還有一個是跟HTTPS配置有關的8443就OK了
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />

#這個8009的這個叫AJP,這是一個接口,主要用來和Apache通訊的,apache的,因此咱們以後用nginx,能夠無論
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

#這裏面寫的就是至關因而虛擬主機了,而後虛擬主機的名字name="localhost",appBase="webapps"這個站點目錄,unpackWARs="true"是否自動解壓這些WAR包,autoDeploy="true"是否自動部署,這兩個都是true,因此會自動的去部署這個WAR包,解壓和部署
#下面就是日誌的格式,日誌在這個目錄directory="logs",日誌前面是什麼樣的prefix="localhost_access_log",後面是什麼樣的suffix=".txt",日期的格式等等pattern="%h %l %u %t "%r" %s %b"
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">

<!-- 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 &quot;%r&quot; %s %b" />

</Host>

例子:簡化咱們訪問的路徑
http://10.0.0.9:8080/jpress-web-newest/改成http://10.0.0.9:8080/jpress
目前http://10.0.0.9:8080/jpress打開提示404錯誤,找不着

在server.xml配置文件里加這麼條命令,在<Host虛擬主機這裏加上就能夠了
sed -i.ori '125a <Context path="/jpress" docBase="/application/tomcat/webapps/jpress-web-newest" debug="0" reloadable="false" crossContext="true"/>' /application/tomcat/conf/server.xml
cat /application/tomcat/conf/server.xml
調整下代碼格式對齊便可
/application/tomcat/bin/shutdown.sh
#發現java進程還在沒關掉,pkill殺掉
ps -ef|grep java
pkill java
ps -ef|grep java
/application/tomcat/bin/startup.sh

訪問看看http://10.0.0.9:8080/jpress/,能訪問了

#首先context這個path,這個就至關於咱們nginx裏面的location若是這個url是/jpress,我讓你去這個站點目錄/application/tomcat/webapps/jpress-web-newest,至關因而root,root是指定哪一個站點目錄,debug就是調試模式0,關閉,reloadable="false" crossContext="true"這兩個先無論,這至關因而配置了咱們這個tomcat的location規則似的
<Context path="/jpress" docBase="/application/tomcat/webapps/jpress-web-newest"
debug="0" reloadable="false" crossContext="true"/>

============================================
擴展:

cat /application/tomcat/conf/server.xml
#<Server>元素表明整個容器,是Tomcat實例的頂層元素.由org.apache.catalina.Server接口來定義.它包含一個<Service>元素.而且它不能作爲任何元素的子元素.
#port指定Tomcat監聽shutdown命令端口.終止服務器運行時,必須在Tomcat服務器所在的機器上發出shutdown命令.該屬性是必須的.
#shutdown指定終止Tomcat服務器運行時,發給Tomcat服務器的shutdown監聽端口的字符串.該屬性必須設置
<Server port="8005" shutdown="SHUTDOWN">
#<!--
connector:接收用戶請求,相似於httpd的listen配置監聽端口.
port指定服務器端要建立的端口號,並在這個端口監聽來自客戶端的請求。
address:指定鏈接器監聽的地址,默認爲全部地址(即0.0.0.0)
protocol鏈接器使用的協議,支持HTTP和AJP。AJP(Apache Jserv Protocol)專用於tomcat與apache創建通訊的, 在httpd反向代理用戶請求至tomcat時使用(可見Nginx反向代理時不可用AJP協議)。
minProcessors服務器啓動時建立的處理請求的線程數
maxProcessors最大能夠建立的處理請求的線程數
enableLookups若是爲true,則能夠經過調用request.getRemoteHost()進行DNS查詢來獲得遠程客戶端的實際主機名,若爲false則不進行DNS查詢,而是返回其ip地址
redirectPort指定服務器正在處理http請求時收到了一個SSL傳輸請求後重定向的端口號
acceptCount指定當全部可使用的處理請求的線程數都被使用時,能夠放處處理隊列中的請求數,超過這個數的請求將不予處理
connectionTimeout指定超時的時間數(以毫秒爲單位)
-->
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />

<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
詳細說明:http://blog.oldboyedu.com/java-tomcat/

server.xml組件類別
頂級組件:位於整個配置的頂層,如server。
容器類組件:能夠包含其它組件的組件,如service、engine、host、context。
鏈接器組件:鏈接用戶請求至tomcat,如connector。
被嵌套類組件:位於一個容器當中,不能包含其餘組件,如Valve、logger。
<server>
<service>
<connector />
<engine>
<host>
<context></context>
</host>
<host>
<context></context>
</host>
</engine>
</service>
</server>

組件詳解
engine:核心容器組件,catalina引擎,負責經過connector接收用戶請求,並處理請求,將請求轉至對應的虛擬主機host。
host:相似於httpd中的虛擬主機,通常而言支持基於FQDN的虛擬主機。
context:定義一個應用程序,是一個最內層的容器類組件(不能再嵌套)。配置context的主要目的指定對應對的webapp的根目錄,相似於httpd的alias,其還能爲webapp指定額外的屬性,如部署方式等。
connector:接收用戶請求,相似於httpd的listen配置監聽端口的。
service(服務):將connector關聯至engine,所以一個service內部能夠有多個connector,但只能有一個引擎engine。service內部有兩個connector,一個engine。所以,通常狀況下一個server內部只有一個service,一個service內部只有一個engine,但一個service內部能夠有多個connector。
server:表示一個運行於JVM中的tomcat實例。
Valve:閥門,攔截請求並在將其轉至對應的webapp前進行某種處理操做,能夠用於任何容器中,好比記錄日誌(access log valve)、基於IP作訪問控制(remote address filter valve)。
logger:日誌記錄器,用於記錄組件內部的狀態信息,能夠用於除context外的任何容器中。
realm:能夠用於任意容器類的組件中,關聯一個用戶認證庫,實現認證和受權。能夠關聯的認證庫有兩種:UserDatabaseRealm、MemoryRealm和JDBCRealm。
UserDatabaseRealm:使用JNDI自定義的用戶認證庫。
MemoryRealm:認證信息定義在tomcat-users.xml中。

=====================================================================

##########tomcat多實例
多虛擬主機:相似於nginx 多個Server標籤(域名,ip,端口),進程數量固定 master+worker

多實例(多進程):同一個程序啓動屢次,分爲兩種狀況:
第一種:一臺機器跑多個站點;
第二種:一個機器跑一個站點多個實例,配合負載均衡

若是有一臺配置很高的服務器,上面就跑一個nginx,和一個tomcat有點浪費資源了
內存要大,由於tomcat吃,消耗資源比較大
在一臺機子上跑多個tomcat,叫tomcat的多實例

那多實例這個咱們怎麼來使用呢?首先你須要多個tomcat的軟件,而後分別把他們啓動下倆就能夠了,可是有個前提,你得讓這些軟件啓動以後,端口不能同樣,就是這個

cd /server/tools/
ll
tar xf apache-tomcat-8.0.27.tar.gz
ll
#複製兩份
cp -a apache-tomcat-8.0.27 tomcat_1
cp -a apache-tomcat-8.0.27 tomcat_2
ll
#把兩個tomcat的端口改一下
sed -i 's#8005#8006#g' tomcat_1/conf/server.xml
sed -i 's#8080#8081#g' tomcat_1/conf/server.xml
sed -i 's#8009#8010#g' tomcat_1/conf/server.xml
sed -i 's#8005#8007#g' tomcat_2/conf/server.xml
sed -i 's#8080#8082#g' tomcat_2/conf/server.xml
sed -i 's#8009#8011#g' tomcat_2/conf/server.xml

diff /application/tomcat_1/conf/server.xml /application/tomcat_2/conf/server.xml

#移動到/application下
mv tomcat_* /application/
diff /application/tomcat_1/conf/server.xml /application/tomcat_2/conf/server.xml
ll
#分別啓動下
/application/tomcat_1/bin/startup.sh
/application/tomcat_2/bin/startup.sh
#應該有3個關於java進程,一個是正常的tomcat,一個是tomcat_1,一個是tomcat_2
ps -ef|grep java
#建立測試文件,若是隻是一個測試文件,要放到ROOT下面,tomcat真正的站點目錄,這個根是叫ROOT
echo default-8080 >/application/tomcat/webapps/ROOT/index.jsp
echo default-8081 >/application/tomcat_1/webapps/ROOT/index.jsp
echo default-8082 >/application/tomcat_2/webapps/ROOT/index.jsp
#而後試一試
http://10.0.0.9:8080/
http://10.0.0.9:8081/
http://10.0.0.9:8082/
#部署好,調試好以後,你就能夠直接把這些tomcat給他們打包,打完包以後,之後哪臺機器在部署,直接解包,解壓縮就能夠了

生產經驗:將已經配置的實例打包,之後方便批量配置多實例

cd /
tar zcf /server/tomcat_muti.tar.gz application/tomcat/ application/tomcat_1/ application/tomcat_2

=====================================================================
######tomcat與反向代理(Tomcat反向代理集羣)
tomcat部署了這麼多以後,那你到底用哪一臺啊,就反向代理的集羣,這裏須要你在前面部署好nginx,而後把請求發到對應的tomcat上,只不過省事一點,你不用發給nginx了,再發給PHP下了,在tomcat中,直接反向代理,直接日後扔,扔到tomcat上就能夠了
這裏你要學會配置了
首先在負載均衡服務器上,配置一個池塘,配置這個池塘以後,而後再配置個location就能夠了,往這個池塘裏扔,只不過這裏你不用寫,你不用寫80端口了,寫的8081 8082就OK了,這裏IP寫9就能夠了,這個你能夠本身配置一下

在CentOS6的lb01操做,這裏IP改爲10.0.0.9就能夠了,記得先lb01拍下快照

mv /application/nginx/conf/nginx.conf{,.ori}
egrep -v '#|^$' /application/nginx/conf/nginx.conf.default > /application/nginx/conf/nginx.conf
vim /application/nginx/conf/nginx.conf
cat /application/nginx/conf/nginx.conf
……
upstream web_pools {
server 10.0.0.9:8081;
server 10.0.0.9:8082;
}
……
location / {
root html;
index index.jsp index.html index.htm;
proxy_pass http://web_pools;
}

如下爲主:
cat /application/nginx/conf/nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream web_pools {
server 10.0.0.9:8081;
server 10.0.0.9:8082;
}
server {
listen 80;
server_name localhost;
location / {
root html;
index index.jsp index.html index.htm;
proxy_pass http://web_pools;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}

/application/nginx/sbin/nginx -t
/application/nginx/sbin/nginx -s reload

#關瀏覽器,再訪問10.0.0.5 會自動跳到10.0.0.9:8081或者10.0.0.9:8082
http://10.0.0.5/

######zabbix監控tomcat
咱們不用tomcat他自帶的一些函數了,自帶的函數你能夠參考這 Tomcat自帶函數檢測:meminfo.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>");
%>
把以上的追加到一個文件中,而後訪問就能夠了,這種不是太推薦的
cat > /application/tomcat/webapps/ROOT/meminfo.jsp <<EOF
<%
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>");
%>
EOF

訪問地址:http://10.0.0.9:8080/meminfo.jsp
JVM memory detail info :
Max memory:274MB
Total memory:105MB
Free memory:44MB
Available memory can be used is :213MB

#還有一些方法,叫jps -lvm
/
jps命令:jdk包帶的命令,jps主要用來輸出JVM中運行的進程狀態信息。
語法格式:jps [options] [hostid]
若是不指定hostid就默認爲當前主機或服務器。
參數說明:
-q 不輸出類名、Jar名和傳入main方法的參數
-m 輸出傳入main方法的參數
-l 輸出main類或Jar的全名
-v 輸出傳入JVM的參數
/

jps -lvm #→快速獲取Java進程的pid,不用ps和grep

jps -lvm
10417 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
4180 org.apache.catalina.startup.Bootstrap start -Djava.util.logging.config.file=/application/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/application/tomcat/endorsed -Dcatalina.base=/application/tomcat -Dcatalina.home=/application/tomcat -Djava.io.tmpdir=/application/tomcat/temp
8362 org.apache.catalina.startup.Bootstrap start -Djava.util.logging.config.file=/application/tomcat_1/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/application/tomcat_1/endorsed -Dcatalina.base=/application/tomcat_1 -Dcatalina.home=/application/tomcat_1 -Djava.io.tmpdir=/application/tomcat_1/temp
8394 org.apache.catalina.startup.Bootstrap start -Djava.util.logging.config.file=/application/tomcat_2/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/application/tomcat_2/endorsed -Dcatalina.base=/application/tomcat_2 -Dcatalina.home=/application/tomcat_2 -Djava.io.tmpdir=/application/tomcat_2/temp

#jps是java用的ps命令,-lvm就可以顯示這些詳細的信息
#這裏有幾個呢?第一列是pid,爲何有4個pid?由於有一個就是jps命令它自己,這個是咱們比較經常使用的一個命令,lvm就是顯示詳細信息,通常就是用jps這個命令獲取pid號等等,jps你要用的話,須要安裝jdk,這是一種方法


#還有一種,經過show-busy-java-threads,這是一個腳本,比較有名的腳本,那咱們來試一下
#下載show-busy-java-threads.sh
mkdir -p /server/tools/
cd /server/tools/
curl -o show-busy-java-threads.sh https://raw.githubusercontent.com/oldratlee/useful-scripts/master/show-busy-java-threads
ll
#執行一下,他就會顯示出繁忙的進程,比較繁忙的進程,這個通常是適用於排查一些故障的時候用的,這些通常都是咱們手動用來監控夠用的,手動來監控用的
sh show-busy-java-threads.sh
[1] Busy(0.0%) thread(10408/0x28a8) stack of java process(4180) under user(root):
"http-nio-8080-exec-6" #63 daemon prio=5 os_prio=0 tid=0x00007fa5103a4000 nid=0x28a8 waiting on condition [0x00007fa4df0f7000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)

  • parking to wait for <0x00000000f6bb69f0> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
    at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
    at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:103)
    at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:31)
    at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:745)

假設咱們找出了這個進程,這個pid號10408比較忙,你能夠怎麼的了?jstack加這個pid
jstack -h
jstack 10408
10408: Unable to open socket file: target process not responding or HotSpot VM not loaded
The -F option can be used when the target process is not responding
通常加上jstack這個以後,就會有一些信息的,沒有的話,咱們就隨便找一個
jps -lvm
用8394這個,他就有一些信息了
jstack 8394
2019-11-18 21:44:47
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.60-b23 mixed mode):

"Attach Listener" #28 daemon prio=9 os_prio=0 tid=0x00007f7c28005800 nid=0x2954 runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE

"http-nio-8082-exec-6" #27 daemon prio=5 os_prio=0 tid=0x00007f7c50401800 nid=0x251c waiting on condition [0x00007f7c1f3fa000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)

  • parking to wait for <0x00000000f4f34eb8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
    at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
    at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:103)
    at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:31)
    at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:745)
    這些信息就是java內部的信息,通常java忙了,好比說sh show-busy-java-threads.sh這塊就百分之好多啊,百分之九十多了,你找出來以後,就交給jstack,而後把下面信息就給開發人員進行處理就OK了

/*
jstack:主要用來查看某個Java進程內的線程堆棧信息。
jstack能夠定位到線程堆棧,根據堆棧信息咱們能夠定位到具體代碼,因此它在JVM性能調優中使用得很是多。

排除tomcat故障步驟
a. 查看catalina.out123456
b. sh show-busy-java-threads.sh

jconsole和jvisualvm
這是windows安裝完jdk後的圖形監控工具。
C:\Program Files\Java\jdk1.8.0_31\bin

*/

以上這些通常咱們經過命令來排查


###Zabbix監控Tomcat
Zabbix經過JMX(Java Management Extensions)能夠對Java Application進行監控,Zabbix利用原生的Zabbix Java gateway,一個Java守護進程監控JMX應用。當Zabbix想要知道某個JMX counter當前的數據時,它只去詢問ZabbixJava gateway,而gateway會去查詢須要的數據,全部這些查詢都是經過JMX管理API完成的。

使用時,一個Java應用不須要額外安裝任何其餘的軟件,也不須要實現或擴展新的代碼來處理Zabbix的查詢,僅僅須要在Java 應用的配置文件中設置一些參數,支持遠程JMX的監控。

#Tomcat開啓遠程監控功能
#在catalina.sh的第97行,咱們去改默認的tomcat就能夠了
web03:
vim /application/tomcat/bin/catalina.sh +97
添加如下幾行
#這幾行的做用是什麼?就是額外的一些參數CATALINA_OPT。有什麼呢?jmxremote開啓了遠程監控的功能,jmxremote.port遠程監控的端口12345,jmxremote.authenticate=false 是否是有驗證?沒有,jmxremote.ssl=false 有沒有ssl?沒有,hostname=172.16.1.9而後遠程監控功能用的IP或者監聽的地址是172.16.1.9,最好寫內網的,由於這個遠程功能仍是比較危險的,別人能透過這個功能監控你服務器,查看你服務器裏tomcat裏的內部數據,因此監控的是內部的IP就OK了
CATALINA_OPTS="$CATALINA_OPTS
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=12345
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Djava.rmi.server.hostname=172.16.1.9"

#作一下主機名解析
echo "10.0.0.9 web03" >>/etc/hosts
#配置完要記得重啓,固然你不用這關也行,你用pkill
pkill java
pkill java
#把全部的java進程都幹掉了
ps -ef|grep java
或者
/application/tomcat/bin/shutdown.sh

/application/tomcat/bin/startup.sh

#看下是否開啓了遠程監控功能,有了,有了遠程監控的端口12345
ss -lntup|grep 12345

#而後還須要在web03上部署好zabbix客戶端,那接下來你須要作的是在web03上部署好zabbix客戶端,也不用,稍微說一下,爲何不用呢?由於zabbix監控tomcat,他用客戶端是沒有辦法獲取到這catalina.sh裏面的遠程的數據的,除非你用命令行自定義,自定義監控項,不然他沒有辦法獲取到,那zabbix怎麼來監控tomcat呢?用的一個叫JavaGateway,你須要去安裝這個
到監控服務器m01上去:
#安裝zabbix_java_gateway(java程序),也須要jdk(openjdk) (作1次)
rpm -ivh http://repo.zabbix.com/zabbix/3.0/rhel/7/x86_64/zabbix-release-3.0-1.el7.noarch.rpm
yum install zabbix-java-gateway -y

#配置服務端
vim /etc/zabbix/zabbix_server.conf
搜一下Java,搜索到# JavaGateway=
改爲
JavaGateway=127.0.0.1
下面還有一個# JavaGatewayPort=10052,這是javagateway的端口,默認就能夠了

StartJavaPollers=0

改爲
#就是開始的時候運行多少個進程,用於java監控,javagateway能直接獲取到咱們這臺tomcat服務器web03的,這臺客戶端的12345的信息配置
StartJavaPollers=5
#配置完以後重啓一下zabbix服務端
systemctl restart zabbix-server.service

systemctl start zabbix-java-gateway.service
systemctl enable zabbix-java-gateway.service
#會看到10052端口,JavaGateway的端口,這個準備好以後,你只須要在web頁面操做
ss -lntup|grep java
ping 172.16.1.9

#zabbix管理頁面上操做,在這裏咱們克隆一個backup
配置-主機-點backup-點克隆-主機名稱web03,羣組取消Discovered hosts組,agent代理程序的接口點移除按鈕,JMX接口點添加按鈕,第一個格輸入172.16.1.9,最後一個格輸入12345
點模板-連接的模板模板都點取消連接按鈕-連接指示器-輸入JMX,選擇Template App Apache Tomcat JMX點小添加-點大添加按鈕-而後等着,web03的可用性的JMX變綠便可
這樣就完成了對tomcat,經過javagateway的一個監控

=====================================================================
###tomcat安全優化及總結
面試必備
安全方面的優化
讓你的tomcat以普通用戶運行,不必定是root
監擾模式
第一個以普通用戶運行,而後就是一些安全憂患
這個shutdwon端口,必定要給他改了,這個關閉的,關閉的暗號也要給他更改,更改成其餘的
還有一個AJP的,AJP咱們雖然不是太經常使用,可是也要把這個端口改掉
還有一個就是咱們說的管理,就web頁面管理,這些他能實現,是由於,他能實現是由於你這個/application/tomcat/webapps下,默認有不少的一些目錄,你能夠把這些默認的目錄,把他們給刪掉,有host-manager,有manager刪掉,就留一個站點jpress-web-newest就OK了,就是禁用這種管理

降權啓動:就以普通用戶運行,這個降權啓動也有一個別的名字叫監牢模式,也必定要作,tomcat比較容易作,nginx作起來就麻煩了,你的監牢模式要以普通用戶運行的話,這個端口他必須大於1000,1000之內的端口必須root用,因此tomcat作起來比較容易
而後這裏增長了一些訪問的控制,能夠配置一下,文件列表,文件列表就是不讓你看我網站的目錄,目錄結構
固然這些版本,能夠配置一下,這個版本的,還有剛纔那個訪問的,配置的是web.xml,由於他默認顯示都會把你默認的版本,默認顯示的都會把你的版本暴露,因此你能夠指定一些新的,這種jsp文件,這些jsp文件,是你得寫好的,要用默認的話,他又把你出賣了,這是顯示版本信息的,還有其餘的這些,這就熟悉了,一些訪問控制的,相似於咱們nginx的allow deny,對於一些比較危險的目錄能夠,能夠增長這個,就什麼什麼路徑,是這樣的
而後我讓你能訪問或者不能訪問等等
而後咱們這些啓動,關閉的腳本,把腳本的權限收回來,就不要給全部人都有執行權限,就變成744就好了,別是755的了
而後日誌這個就OK了

這就是tomcat安全上的優化,是你要能說出來的,一個做業就是你要完成,咱們tomcat的負載均衡,另一個完成咱們tomcat的監控,這是你要作的,而後就是這些能熟練的說出來

tomcat安全優化

擴展:
###Tomcat安全優化
關閉端口保護 8005 SHUTDOWN
ajp鏈接端口保護 8009 註釋
禁用管理端
降權啓動:下降用戶權限啓動
pkill java
useradd tomcat
cp -a /application/tools/tomcat8_1 /home/tomcat/
chown -R tomcat.tomcat /home/tomcat/tomcat8_1/
#-c command:變動帳號爲USER的使用者,並執行指令(command)後再變回原來使用者。
su -c '/home/tomcat/tomcat8_1/bin/startup.sh' tomcat

###Tomcat性能優化
tomcat性能取決於你的內存大小。

上策:優化代碼
中策:jvm優化機制--垃圾回收機制,把不須要的內存回收
優化jvm--優化垃圾回收策略
優化catalina.sh配置文件。在catalina.sh配置文件中添加如下代碼:
#tomcat分配1G內存模板
JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms1024m -Xmx1024m -XX:NewSize=512m -XX:MaxNewSize=512m -XX:PermSize=512m -XX:MaxPermSize=512m"

下策:加足夠大的內存
下下策:天天0點定時重啓tomcat

=====================================================================

#Tomcat在CentOS7啓動慢的緣由
查看實時日誌,發現緣由是生成隨機數的時候卡住了,致使tomcat啓動慢。

是否有足夠的熵來用於產生隨機數,能夠經過以下命令來查看
什麼是熵?Linux 內核採用熵來描述數據的隨機性,熵是描述系統混亂無序程度的物理量,一個系統的熵越大則說明該系統的有序性越差,即不肯定性越大。內核維護了一個熵池用來收集來自設備驅動程序和其它來源的環境噪音。理論上,熵池中的數據是徹底隨機的,能夠實現產生真隨機數序列。爲跟蹤熵池中數據的隨機性,內核在將數據加入池的時候將估算數據的隨機性,這個過程稱做熵估算。熵估算值描述池中包含的隨機數位數,其值越大表示池中數據的隨機性越好。
[root@oldboy tools]# cat /proc/sys/kernel/random/entropy_avail
7
爲了加速/dev/random提供隨機數的速度,你能夠經過操做設備的外設,讓其產生大量的中斷(如網絡傳輸數據,按鍵,移動鼠標,在命令行敲幾個不一樣的命令,俗稱聚氣。
cat /dev/random 會消耗能量

yum install rng-tools # 安裝rngd服務(熵服務,增大熵池)systemctl start rngd # 啓動服務

相關文章
相關標籤/搜索