您好,登錄后才能下訂單哦!
常規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的程序
jdk:java develpement kit,是java所運行的環境工具,也是JVM tomcat運行所必要的環境
Oracle JDK:商業軟件 官方的
openjdk:開源軟件 在linux下yum安裝就是openjdk
===================================
環境準備及軟件選擇
從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的版本對運維來說沒什么區別,安裝方法高度一致。
===================================
######部署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
EOF
或者
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/profile
#讓它生效
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)
========================================================
########部署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 Corporation
#有時候tomcat啟動關閉慢,可以安裝rngd服務(熵服務,增大熵池),提升速度
yum install rng-tools -y
#啟動服務
systemctl start rngd
systemctl enable rngd
#啟動關閉tomcat@@@@@@@@@@@@@@@@@@@@@@@@@@@@
br/>@@@@@@@@@@@@@@@@@@@@@@@@@@@@
/application/tomcat/logs/catalina.out
tail -f /application/tomcat/logs/catalina.out@@@@@@@@@@@@@@@@@@@@@@@@@@@@
br/>@@@@@@@@@@@@@@@@@@@@@@@@@@@@
#注意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
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
====================================================================
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 "%r" %s %b" />
例子:簡化我們訪問的路徑
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就可以了,這個你可以自己配置一下
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
<%
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
#還有一些方法,叫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)
假設我們找出了這個進程,這個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)
/*
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的端口,默認就可以了
改成
#就是開始的時候運行多少個進程,用于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 # 啟動服務
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。