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的概念
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分析