TomCat 基礎(chǔ)學習

Tomcat

1.JVM介紹

JVM是Java Virtual Machine(Java虛擬機)的縮寫

Java虛擬機本質(zhì)是就是一個程序窥摄,當它在命令行上啟動的時候,就開始執(zhí)行保存在某字節(jié)碼文件中的指令。Java語言的可移植性正是建立在Java虛擬機的基礎(chǔ)上啊央。任何平臺只要裝有針對于該平臺的Java虛擬機,字節(jié)碼文件(.class)就可以在該平臺上運行。這就是“一次編譯层扶,多次運行”。

2.Tomcat介紹

a.什么是Tomcat

Tomcat和我們此前學習的 Nginx 類似烙荷,也是一個Web服務(wù)器镜会。

b.Tomcat與Nginx有什么區(qū)別?

tomcat是一個java版的web服務(wù)器

Nginx僅支持靜態(tài)資源终抽,而Tomcat則支持Java開發(fā)的 jsp 動態(tài)資源和靜態(tài)資源戳表。 Nginx適合做前端負載均衡,而Tomcat適合做后端應(yīng)用服務(wù)處理昼伴。 通常情況下匾旭,企業(yè)會使用 Nginx+tomcat 結(jié)合使用,由Nginx處理靜態(tài)資源圃郊,Tomcat處理動態(tài)資源价涝。

3.Tmcat快速安裝

機器名? ? ? ? ? ? ? ? ? ip地址? ? ? ? ? ? ? ? ? 軟件包

tomcat01? ? ? ? ? ?10.0.0.11? ? ? ? ? ? ? ? tomcat+nfs

tomcat02? ? ? ? ? ?10.0.0.12? ? ? ? ? ? ? ?tomcat+nfs

lb01? ? ? ? ? ? ? ? ? ?10.0.0.5? ? ? ? ? ? ? ? nginx+mariadb+redis+nfs

安裝方法1:

rpm -ivh jdk-8u102-linux-x64.rpm

mkdir /app -p

tar xf apache-tomcat-8.0.27.tar.gz -C /app

/app/apache-tomcat-8.0.27/bin/startup.sh

安裝方法2:

#適合debian和ubuntu等其他linux發(fā)行版

tar xf jdk-8u60-linux-x64.tar.gz -C /app/

ln -s /app/jdk1.8.0_60 /app/jdk

sed -i.ori '$a export JAVA_HOME=/app/jdk

export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH

export CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar' /etc/profile

source /etc/profile

mkdir /app/

tar xf apache-tomcat-8.0.27.tar.gz -C /app

/app/apache-tomcat-8.0.27/bin/startup.sh

4.Tomcat啟動慢解決方案

沒優(yōu)化之前啟動時間

[root@tomcat logs]# grep 'Server startup' catalina.out

03-Aug-2019 03:15:18.225 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 591050 ms

優(yōu)化之后啟動時間

[root@tomcat logs]# grep 'Server startup' catalina.out

03-Aug-2019 03:15:18.225 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 591050 ms

03-Aug-2019 03:22:14.112 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 1326 ms

優(yōu)化方法:

vi /usr/java/jdk1.8.0_102/jre/lib/security/java.security

securerandom.source=file:/dev/urandom

5.tomcat目錄結(jié)構(gòu)介紹

[root@tomcat apache-tomcat-8.0.27]# ll

drwxr-xr-x 2 root root? 4096 Aug? 3 03:05 bin? #主要包含啟動、關(guān)閉tomcat腳本和腳本依賴文件? 非常重要

drwxr-xr-x 3 root root? 198 Aug? 3 03:05 conf #tomcat配置文件目錄? ? ? ? ? 非常重要

drwxr-xr-x 2 root root? 4096 Aug? 3 03:05 lib? #tomcat運行需要加載的jar包? ? 非常重要

-rw-r--r-- 1 root root 57011 Sep 28? 2015 LICENSE #license文件描沟,不重要

drwxr-xr-x 2 root root? 197 Aug? 3 03:15 logs? #在運行過程中產(chǎn)生的日志文件? 非常重要

-rw-r--r-- 1 root root? 1444 Sep 28? 2015 NOTICE #不重要

-rw-r--r-- 1 root root? 6741 Sep 28? 2015 RELEASE-NOTES #版本特性飒泻,不重要

-rw-r--r-- 1 root root 16204 Sep 28? 2015 RUNNING.txt? #幫助文件,不重要

drwxr-xr-x 2 root root? ? 30 Aug? 3 03:05 temp? ? #存放臨時文件

drwxr-xr-x 7 root root? ? 81 Sep 28? 2015 webapps #站點目錄? 非常重要

drwxr-xr-x 3 root root? ? 22 Aug? 3 03:05 work? ? #tomcat運行時產(chǎn)生的緩存文件

6.tomcat配置文件

核心配置文件:?/app/apache-tomcat-8.0.27/conf/server.xml?

一個tomcat實例一個server

一個server中包含多個Connector吏廉,Connector的主要功能是接受泞遗、響應(yīng)用戶請求。

service的作用是:將connector關(guān)聯(lián)至engine(catalina引擎)

一個host就是一個站點席覆,類似于nginx的多站點

context類似于nginx中l(wèi)ocation的概念

Tomcat中的Connector配置講解

7.Tomcat部署zrlog

#編輯配置文件

vim? /app/apache-tomcat-8.0.27/conf/server.xml

<Host name="blog.oldqiang.com"? appBase="/html"

unpackWARs="true" autoDeploy="true">

? ? ? ? <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"

? ? ? ? ? ? ? prefix="blog.oldqiang.com_access_log" suffix=".txt"

? ? ? ? ? ? ? pattern="%h %l %u %t "%r" %s %b" />

? ? ? </Host>


#重啟生效

/app/apache-tomcat-8.0.27/bin/shutdown.sh

/app/apache-tomcat-8.0.27/bin/startup.sh

mv ROOT.war /html

8.配置tomcat basic認證

<web-app>?

<security-constraint>?<web-resource-collection>?<web-resource-name>test</web-resource-name>?<url-pattern>/admin/login/*</url-pattern>?</web-resource-collection>?<auth-constraint>?<role-name>test100</role-name>?</auth-constraint>?</security-constraint> ?<login-config>?<auth-method>BASIC</auth-method>?<realm-name>Default</realm-name>?</login-config>

</web-app>

# 添加系統(tǒng)角色

vim /app/apache-tomcat-8.0.27/conf/tomcat-users.xml

<role rolename="manager-gui"/>

<role rolename="test100"/>

<user username="tomcat" password="123456" roles="manager-gui,test100"/>

#重啟tomcat生效

9.Nginx+Tomcat集群架構(gòu)實戰(zhàn)

#nginx負載均衡配置

[root@lb01 ~]# cat /etc/nginx/nginx.conf

worker_processes? 1;

events {

? ? worker_connections? 1024;

}

http {

? ? include? ? ? mime.types;

? ? default_type? application/octet-stream;

? ? sendfile? ? ? ? on;

? ? keepalive_timeout? 65;

? ? upstream tomcat {

? ? ? server 10.0.0.11:8080;

? ? ? server 10.0.0.12:8080;

? ? }

? ? server {

? ? ? ? listen? ? ? 80;

? ? ? ? server_name? localhost;

? ? ? ? location / {

? ? ? ? ? proxy_pass http://tomcat;

? ? ? ? ? proxy_set_header Host $host;

? ? ? ? ? proxy_set_header X-Real-IP $remote_addr;

? ? ? ? }

? ? }

}

#解決訪問日志源ip丟失問題

vim /app/apache-tomcat-8.0.27/conf/server.xml

pattern="%{X-Real-IP}i %l %u %t "%r" %s %b" />

重啟生效

/app/apache-tomcat-8.0.27/bin/shutdown.sh

/app/apache-tomcat-8.0.27/bin/startup.sh

10.tomcat+nfs實現(xiàn)文件共享

#lb01安裝nfs

yum install nfs-utils.x86_64 -y

創(chuàng)建共享目錄并設(shè)置權(quán)限

mkdir /data

vim /etc/exports

/data 10.0.0.0/24(rw,sync,no_root_squash,no_all_squash)

重啟服務(wù)

systemctl restart rpcbind

systemctl restart nfs

systemctl enable nfs

#tomcat01和tomcat02

下載nfs軟件

yum install nfs-utils -y

查看權(quán)限并創(chuàng)建掛載目錄史辙,進行掛載

showmount -e 10.0.0.5

mkdir /html/ROOT/attached

mount -t nfs 10.0.0.5:/data /html/ROOT/attached

11.nginx緩存

#http模塊增加

proxy_cache_path /opt/nginx/cache levels=1:2 keys_zone=one:10m;

#location

location ~ ..(gif|jpg|png|css|js|woff|flv|ico|swf)(.) {

proxy_cache one;

? ? ? ? ? proxy_cache_key $uri;

? ? ? ? ? proxy_cache_valid 200 302 1h;

? ? ? ? ? proxy_cache_valid 301 1d;

? ? ? ? ? proxy_cache_valid any 1m;

? ? ? ? ? expires 30d;

? ? ? ? ? add_header? ? Nginx-Cache? "$upstream_cache_status";

? ? ? ? ? proxy_pass http://tomcat;

? ? ? ? ? proxy_set_header Host $host;

? ? ? ? ? proxy_set_header X-Real-IP $remote_addr;

? ? ? ? }

12.Nginx+Tomcat集群實現(xiàn)全棧Https

# 配置文件

[root@lb01 ~]# cat /etc/nginx/nginx.conf

worker_processes? 1;

events {

? ? worker_connections? 1024;

}

http {

? ? include? ? ? mime.types;

? ? default_type? application/octet-stream;

? ? sendfile? ? ? ? on;

? ? keepalive_timeout? 65;

? ? #proxy_cache_path /opt/nginx/cache levels=1:2 keys_zone=one:10m;

? ? proxy_cache_path /opt/nginx/cache? keys_zone=one:10m;

? ? upstream tomcat {

? ? ? server 10.0.0.11:8080;

? ? ? server 10.0.0.12:8080;

? ? }

server {

listen443ssl;

?? server_name blog.oldqiang.com;

?? ssl_certificate /opt/Nginx/1_blog.oldqiang.com_bundle.crt;

?? ssl_certificate_key /opt/Nginx/2_blog.oldqiang.com.key;

?? ssl_session_timeout 5m;

?? ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

?? ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;

?? ssl_prefer_server_ciphers on;

?? location / {

? ? ? ?? proxy_pass http://tomcat;

proxy_set_header Host$host;

proxy_set_header X-Real-IP$remote_addr;

?? }

? ? location? ~ ? ^.*\.(js|css|ico|gif|jpg|jpeg|png)$ {

? ? ? ?? proxy_cache one;

proxy_cache_key$uri;

add_header ? ? Nginx-Cache"$upstream_cache_status";

proxy_cache_valid2003041h;

proxy_cache_valid4041m;

? ? ? ?? proxy_pass http://tomcat;

proxy_set_header Host$host;

proxy_set_header X-Real-IP$remote_addr;

? ? ?? }

}

?? server {

listen80;

? ? ?? server_name? localhost;

? ? ?? location / {

return302https://blog.oldqiang.com$request_uri;

? ? ?? }

?? }

}

13.使用maven編譯java程序

#安裝配置maven

wget https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven- / . . /binaries/apache-maven- 3.6.3-bin.tar.gz

?tar xf apache-maven-?3.6.3-bin.tar.gz -C /usr/local/?ln -s /usr/local/apache-maven-?3.6.3/usr/local/maven?

#文件結(jié)尾添加兩行

vim /etc/profile

export M_HOME=/usr/local/maven

export PATH=${M_HOME}/bin:$PATH

source /etc/profile

#驗證?

mvn -v

#配置maven倉庫

vim /usr/local/maven/conf/settings.xml

<mirror>?<id>aliyunmaven</id>?<mirrorOf>*</mirrorOf>?<name>阿里云公共倉庫</name>?<url>https://maven.aliyun.com/repository/public</url>?</mirror>

#清理并打包?

mvn clean package

14.使用redisson實現(xiàn)session共享

vim /app/apache-tomcat-8.0.27/conf/context.xml

<Manager className="org.redisson.tomcat.RedissonSessionManager"

configPath="${catalina.base}/conf/redisson.conf" readMode="MEMORY" updateMode="DEFAULT"/>

?vim? /app/apachetomcat-8.0.27/conf/redisson.conf?

{?

"singleServerConfig":{??

?"idleConnectionTimeout":10000,??

?"connectTimeout":10000,???

?"timeout":3000,???

?"retryAttempts":3,??

?"retryInterval":1500,?? ?

"password":null,??

?"subscriptionsPerConnection":1,???

?"clientName":null,?? ?

"address": "redis://10.0.0.5:6379",?? "subscriptionConnectionMinimumIdleSize":1,? "subscriptionConnectionPoolSize":50,?? "connectionMinimumIdleSize":32,???

?"connectionPoolSize":64,???

"database":0,?? "dnsMonitoringInterval":5000 },

?"threads":0,?

"nettyThreads":0,?

"codec":{?? "class":"org.redisson.codec.JsonJacksonCodec"?},?

"transportMode":"NIO"

?}

#準備兩個jar包

#下載

https://github.com/redisson/redisson/tree/master/redisson-tomcat

/app/apache-tomcat-8.0.27/lib/redisson-all-3.14.0.jar?

/app/apache-tomcat-8.0.27/lib/redisson-tomcat-8-3.14.0.jar

#重啟tomcat生效

15.Tomcat監(jiān)控

vim /application/apache-tomcat-8.0.27/bin/catalina.sh

CATALINA_OPTS="$CATALINA_OPTS?

-Dcom.sun.management.jmxremote

?-Djava.rmi.server.hostname=10.0.0.11

?-Dcom.sun.management.jmxremote.port=?12345

-Dcom.sun.management.jmxremote.ssl=false

?-Dcom.sun.management.jmxremote.authenticate=false"?

a:安裝zabbix-java-gateway,?10052

b:配置重啟zabbix-java-gateway?

START_POLLERS=5

?c:配置重啟zabbix-server?

JavaGateway=127.0.0.1

JavaGatewayPort=?10052

StartJavaPollers=5

?d:zabbix-web添加jmx監(jiān)控

16.Tomcat性能優(yōu)化

內(nèi)存參數(shù)

堆內(nèi)存: 新生代 eden survivor? 老年代tenured?非堆內(nèi)存: metaspace? codecache? 編譯區(qū)?gc垃圾回收:? 回收次數(shù)越少越好,回收時間越短越好?設(shè)置: 最大堆內(nèi)存==最小堆內(nèi)存?新生代內(nèi)存滿了,觸發(fā)的gc,局部gc?老年代內(nèi)存滿了,觸發(fā)的gc,全局gc?調(diào)優(yōu): 新生代:老年代的:1:4

jvm 內(nèi)存溢出如何排查??

vim /app/apache-tomcat-8.0.27/bin/catalina.sh

JAVA_OPTS="$JAVA_OPTS -server -Xms512m -Xmx512m -Xss256k??

-XX:+HeapDumpOnOutOfMemoryError?

-XX:HeapDumpPath=/usr/heapdump?

-XX:+PrintGCDetails -XX:+PrintGCTimeStamps

?-Xloggc:/tmp/heap_trace.txt -XX:NewSize=m?

-XX:MaxNewSize=128m"

使用MAT分析

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末佩伤,一起剝皮案震驚了整個濱河市聊倔,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌生巡,老刑警劉巖耙蔑,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異孤荣,居然都是意外死亡甸陌,警方通過查閱死者的電腦和手機须揣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來钱豁,“玉大人耻卡,你說我怎么就攤上這事∩撸” “怎么了卵酪?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長谤碳。 經(jīng)常有香客問我溃卡,道長,這世上最難降的妖魔是什么估蹄? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任塑煎,我火速辦了婚禮,結(jié)果婚禮上臭蚁,老公的妹妹穿的比我還像新娘最铁。我一直安慰自己,他們只是感情好垮兑,可當我...
    茶點故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布冷尉。 她就那樣靜靜地躺著,像睡著了一般系枪。 火紅的嫁衣襯著肌膚如雪雀哨。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天私爷,我揣著相機與錄音雾棺,去河邊找鬼。 笑死衬浑,一個胖子當著我的面吹牛捌浩,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播工秩,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼尸饺,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了助币?” 一聲冷哼從身側(cè)響起浪听,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎眉菱,沒想到半個月后迹栓,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡俭缓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年迈螟,在試婚紗的時候發(fā)現(xiàn)自己被綠了叉抡。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡答毫,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出季春,到底是詐尸還是另有隱情洗搂,我是刑警寧澤,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布载弄,位于F島的核電站耘拇,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏宇攻。R本人自食惡果不足惜惫叛,卻給世界環(huán)境...
    茶點故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望逞刷。 院中可真熱鬧嘉涌,春花似錦、人聲如沸夸浅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽帆喇。三九已至警医,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間坯钦,已是汗流浹背预皇。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留婉刀,地道東北人吟温。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像路星,于是被迫代替她去往敵國和親溯街。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,614評論 2 353

推薦閱讀更多精彩內(nèi)容