1.JVM介紹
JVM是Java Virtual Machine(Java虛擬機(jī))的縮寫
Java虛擬機(jī)本質(zhì)是就是一個程序,當(dāng)它在命令行上啟動的時候奸鸯,就開始執(zhí)行保存在某字節(jié)碼文件中的指令。Java語言的可移植性正是建立在Java虛擬機(jī)的基礎(chǔ)上幻林。任何平臺只要裝有針對于該平臺的Java虛擬機(jī)愚墓,字節(jié)碼文件(.class)就可以在該平臺上運(yùn)行杠氢。這就是“一次編譯摘能,多次運(yùn)行”续崖。
2.Tomcat介紹
1.什么是Tomcat
Tomcat和我們此前學(xué)習(xí)的 Nginx 類似,也是一個Web服務(wù)器徊哑。
2.Tomcat與Nginx有什么區(qū)別袜刷?
Nginx僅支持靜態(tài)資源聪富,而Tomcat則支持Java開發(fā)的 jsp 動態(tài)資源和靜態(tài)資源莺丑。
Nginx適合做前端負(fù)載均衡,而Tomcat適合做后端應(yīng)用服務(wù)處理墩蔓。
通常情況下梢莽,企業(yè)會使用 Nginx+tomcat 結(jié)合使用,由Nginx處理靜態(tài)資源奸披,Tomcat處理動態(tài)資源昏名。
3.Tomcat快速安裝
方法1:
rpm -ivh jdk-8u102-linux-x64.rpm -->使用rpm包去安裝jdk不需要添加環(huán)境變量
mkdir /app
tar xf apache-tomcat-8.0.27.tar.gz -C /app
/app/apache-tomcat-8.0.27/bin/startup.sh
方法2:
mkdir /app/
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\nexport PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH\nexport CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar' /etc/profile
source /etc/profile
tar xf apache-tomcat-8.0.27.tar.gz -C /app
/app/apache-tomcat-8.0.27/bin/startup.sh
tomcat無法啟動的幾個原因
1.替換配置文件: pkill java 然后在啟動
2.配置文件寫錯
3.虛擬主機(jī)是添加,不要修改
4.context如果寫了,一定要有對應(yīng)的目錄,不然整體就報錯
/soft/tomcat/logs/catalina.out
作者:UncleZ_strive鏈接:http://www.reibang.com/p/2798f56eded0來源:簡書著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán)阵面,非商業(yè)轉(zhuǎn)載請注明出處轻局。
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
total 92
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運(yùn)行需要加載的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 #在運(yùn)行過程中產(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 #站點(diǎn)目錄
drwxr-xr-x 3 root root 22 Aug 3 03:05 work #tomcat運(yùn)行時產(chǎn)生的緩存文件
6.tomcat配置文件
核心配置文件:
一個tomcat實(shí)例一個server
一個server中包含多個Connector,Connector的主要功能是接受镇饮、響應(yīng)用戶請求蜓竹。
service的作用是:將connector關(guān)聯(lián)至engine(catalina引擎)
一個host就是一個站點(diǎn),類似于nginx的多站點(diǎn)
context類似于nginx中l(wèi)ocation的概念
Tomcat中的Connector配置講解
Tomcat配置文件解讀
7.Tomcat部署zrlog
1.Tomcat部署博客項目zrlog
域名: zrlog.hai.com:8080
站點(diǎn)目錄: /code/zrlog
1.配置server.xml文件 ,新增zrlog站點(diǎn)在 engline
[root@web01 ~]# vim /soft/tomcat/conf/server.xml
<!--zrlog站點(diǎn)-->
<Host name="zrlog.hai.com" appBase="/code/zrlog"
unpackWARs="true" autoDeploy="true">
<Va0lve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="zrlog_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
2.創(chuàng)建站點(diǎn)目錄,上傳zrlog的war包
[root@web01 ~]# mkdir /code/zrlog
[root@web01 ~]# cd /code/zrlog/
[root@web01 zrlog]# rz ROOT.war
3.重啟Tomcat服務(wù)
[root@web01 zrlog]# /soft/tomcat/bin/shutdown.sh && /soft/tomcat/bin/startup.sh && tail -f /soft/tomcat/logs/catalina.out
4.域名劫持
5.在172.16.1.51的數(shù)據(jù)庫上,創(chuàng)建一個zrlog的庫,配置授權(quán)訪問用戶
[root@db01 ~]# mysql -uroot -poldxu.com
MariaDB [(none)]> create database zrlog charset utf8;
<---此前配置過all用戶,可以復(fù)用
MariaDB [(none)]> grant all privileges on *.* to 'all'@'%' identified by 'oldboy.com';
2.如何開啟 Server Status Host Manager頁面
1.配置conf/tomcat-users.xml
<role rolename="manager-gui"/>
<user username="tomcat" password="123456" roles="manager-gui"/>
2.如果訪問還是403储藐,是因為tomcat默認(rèn)僅運(yùn)行本地訪問該管理頁面俱济,需要允許同網(wǎng)段主機(jī)訪問
[root@web01 ~]# ll /soft/tomcat/webapps/manager/
[root@web01 ~]# ll /soft/tomcat/webapps/host-manager/
[root@es-node1 tomcat]# vim 項目目錄下/META-INF/context.xml
allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
#修改為
allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1|10\.0\.0\.\d+" />
8.配置tomcat basic認(rèn)證(可在nginx上進(jìn)行配置)
1.在tomcat-users.xml文件中進(jìn)行角色與用戶的綁定
#vim /app/tomcat/conf/tomcat-users.xml
<role rolename="manager-gui"/>
<role rolename="test100"/> -->添加角色
<user username="tomcat" password="1" roles="manager-gui,test100"/> -->角色綁定用戶去認(rèn)證,需要使用用戶進(jìn)行basic認(rèn)證--username="tomcat" password="1"
2.在站點(diǎn)目錄下的WEB-INF的web.xml文件中添加如下內(nèi)容
# vim /app/tomcat/webapps/ROOT/WEB-INF/web.xml
<web-app>
......
<security-constraint>
<web-resource-collection>
<web-resource-name>test</web-resource-name>
<url-pattern>/*</url-pattern> -->想要配置認(rèn)證的目錄
</web-resource-collection>
<auth-constraint>
<role-name>test100</role-name> -->認(rèn)證的角色钙勃,需要綁定用戶蛛碌,進(jìn)行認(rèn)證
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>Default</realm-name>
</login-config>
</web-app>
9.Nginx+Tomcat集群架構(gòu)實(shí)戰(zhàn)
1.lb服務(wù)器nginx配置文件
upstream test {
server 172.16.1.7;
server 172.16.1.8;
}
server {
listen 80;
server_name blog.oldqiang.com;
location / {
proxy_pass http://test; #nginx七層負(fù)載到后端的nginx服務(wù)器
proxy_set_header Host $host;
}
}
2.web服務(wù)器nginx配置
server {
listen 80;
server_name blog.oldqiang.com;
location / {
proxy_pass http://127.0.0.1:8080; #將負(fù)載轉(zhuǎn)發(fā)過來的動態(tài)處理請求交給后端的tomcat處理
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
proxy_buffering on;
proxy_buffer_size 32k;
proxy_buffers 4 128k;
}
}
10.Nginx+Tomcat集群實(shí)現(xiàn)全棧Https
1.lb配置文件(在負(fù)載均衡上進(jìn)行ssl證書的配置,進(jìn)行加密與解密)
upstream test {
server 172.16.1.7;
server 172.16.1.8;
}
server {
listen 80;
server_name blog.oldqiang.com;
location / {
rewrite ^(.*) https://$server_name$1 redirect;
}
}
server {
listen 443 ssl;
server_name blog.oldqiang.com;
client_max_body_size 100m;
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_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://test;
proxy_set_header Host $host;
}
}
11.Nginx+tomcat動靜分離
server {
listen 80;
server_name blog.oldqiang.com;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
proxy_buffering on;
proxy_buffer_size 32k;
proxy_buffers 4 128k;
}
location ~* \.(gif|jpg|jpeg)$ {
root /app/tomcat/webapps/ROOT ; #靜態(tài)請求直接用nginx處理
}
}
12.tomcat配置多站點(diǎn)
1.在server.xml配置文件中添加一個Host
# vim /app/tomcat/conf/server.xml
<Host name="www.mysun.com" appBase="webapps" -->配置域名和根目錄辖源,重啟tomcat會生成aooBase目錄
unpackWARs="true" autoDeploy="true"> -->開啟自動解壓左医,自動部署
#日志的文件的配置
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt" -->日志名稱
pattern="%h %l %u %t "%r" %s %b" /> -->日志的格式吧~~
</Host>
<Host name="www.myqu.com" appBase="webapps2"
unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="tomcat_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
13.Tomcat監(jiān)控
zabbix監(jiān)控tomcat
1.在tomcat實(shí)例的配置文件中配置讓自己能遠(yuǎn)程被監(jiān)控(重啟tomcat之后會啟動一個端口12345)
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.72
-Dcom.sun.management.jmxremote.port=12345
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false"
1:安裝zabbix-java-gateway,10052(在tomcat上安裝zabbix-java-gateway)
Zabbix本身不支持直接監(jiān)控Java同木,在zabbix 1.8以前浮梢,只能使用Zapcat來做代理監(jiān)控,而且要修改源代碼彤路,非常麻煩秕硝。所有后來為了解決這個監(jiān)控問題,Zabbix和Java雙方應(yīng)運(yùn)生成了各自的代理監(jiān)控程序:zabbix 2.0以后添加了服務(wù)進(jìn)程zabbix-java-gateway洲尊;Java有了JMX,全稱是Java Management Extensions,即Java管理擴(kuò)展远豺。
2:配置重啟zabbix-java-gateway
START_POLLERS=5 #預(yù)啟動的輪詢器,默認(rèn)5-->如tomcat的實(shí)例多坞嘀,可以根據(jù)需求去增加
3:配置重啟zabbix-server
vim /etc/zabbix/zabbix_server.conf (增加如下參數(shù))
JavaGateway=127.0.0.1 -->zabbix-java-gateway組件安裝的IP地址
JavaGatewayPort=10052 -->zabbix-java-gateway組件的端口
StartJavaPollers=5 -->Java 輪詢器
4:zabbix-web添加jmx監(jiān)控
添加tomcat實(shí)例主機(jī)躯护,添加模塊Template App Generic Java JMX
可根據(jù)需求來刪除不支持的監(jiān)控項
5.自定義監(jiān)控項
(借助jdk-windows組件來獲取tomcat數(shù)據(jù)然后再zabbix中添加相應(yīng)想要的監(jiān)控項)
可以在windows上安裝jdk,連接上tomcat實(shí)例的遠(yuǎn)程端口12345
image.png
image.png
根據(jù)這里的取值設(shè)置自定義監(jiān)控項
隨便找一個模板監(jiān)控克隆
image.png
14.Tomcat性能優(yōu)化
1.關(guān)于tomcat的內(nèi)存回收gc
年輕代: 年輕代內(nèi)存滿了丽涩,就會觸發(fā)年輕代 內(nèi)存回收棺滞,局部,存活下的對象存到年老代
年老代: 年老代內(nèi)存滿了矢渊,就會觸發(fā)全局 內(nèi)存回收继准,全部
jvm 內(nèi)存垃圾回收,是不可避免矮男!
垃圾回收的次數(shù)盡可能少:增加內(nèi)存的容量
垃圾回收的時間盡可能短:減少內(nèi)存的容量
年輕代最小內(nèi)存==年輕代最大內(nèi)存
年老代最小內(nèi)存==年老代最大內(nèi)存
堆內(nèi)存==1年輕代64M+3年老代192M 256M
非堆內(nèi)存== 持久代
JAVA_OPTS="$JAVA_OPTS -server -Xms3G -Xmx3G -Xss256k -XX:PermSize=128m -XX:MaxPermSize=128m -XX:+UseParallelOldGC -XX:NewSize=1G -XX:MaxNewSize=1G"
xms:最小堆內(nèi)存
Xmx:最大堆內(nèi)存
-Xss 線程棧的大小
-XX:NewSize 年輕代的最小內(nèi)存
-XX:MaxNewSize 年輕代的最大內(nèi)存
-XX:PermSize: 持久代最小內(nèi)存
-XX:MaxPermSize: 持久代最大內(nèi)存
詳細(xì)優(yōu)化參數(shù):
JAVA_OPTS="$JAVA_OPTS -server -Xms256m -Xmx256m -Xss256k -XX:+UseParallelOldGC -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/heap_dump -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:/tmp/heap_trace.txt -XX:NewSize=128m -XX:MaxNewSize=128m"
2.關(guān)于java的三個代
年輕代:
所有新生成的對象首先都是放在年輕代的移必。年輕代的目標(biāo)就是盡可能快速的收集掉那些生
命周期短的對象。年輕代分三個區(qū)毡鉴。一個Eden區(qū)崔泵,兩個 Survivor區(qū)(一般而言)秒赤。大部分對象在
Eden區(qū)中生成。當(dāng)Eden區(qū)滿時憎瘸,還存活的對象將被復(fù)制到Survivor區(qū)(兩個中的一個)倒脓,當(dāng)這
個 Survivor區(qū)滿時,此區(qū)的存活對象將被復(fù)制到另外一個Survivor區(qū)含思,當(dāng)這個Survivor去也滿了
的時候崎弃,從第一個Survivor區(qū)復(fù)制過來的并且此時還存活的對象,將被復(fù)制“年老區(qū)
(Tenured)”含潘。需要注意饲做,Survivor的兩個區(qū)是對稱的,沒先后關(guān)系遏弱,所以同一個區(qū)中可能同時
存在從Eden復(fù)制過來對象盆均,和從前一個Survivor復(fù)制過來的對象,而復(fù)制到年老區(qū)的只有從第
一個Survivor去過來的對象漱逸。而且泪姨,Survivor區(qū)總有一個是空的。同時饰抒,根據(jù)程序需要肮砾,
Survivor區(qū)是可以配置為多個的(多于兩個),這樣可以增加對象在年輕代中的存在時間袋坑,減
少被放到年老代的可能仗处。
年老代:
在年輕代中經(jīng)歷了N次垃圾回收后仍然存活的對象,就會被放到年老代中枣宫。因此婆誓,可以認(rèn)
為年老代中存放的都是一些生命周期較長的對象。
持久代:
用于存放靜態(tài)文件也颤,如今Java類洋幻、方法等。持久代對垃圾回收沒有顯著影響翅娶,但是有些應(yīng)
用可能動態(tài)生成或者調(diào)用一些class文留,例如Hibernate 等,在這種時候需要設(shè)置一個比較大的持
久代空間來存放這些運(yùn)行過程中新增的類故觅。持久代大小通過-XX:MaxPermSize=進(jìn)行設(shè)置厂庇。
持久代補(bǔ)充:持久帶也稱為方法區(qū)
方法區(qū):方法區(qū)存儲每一個java類的結(jié)構(gòu)信息:比如運(yùn)行時常量池,字段和方法數(shù)據(jù)输吏,構(gòu)造函數(shù)和普通方法的字節(jié)碼內(nèi)容以及類、實(shí)例替蛉、接口初始化時需要使用到的特殊方法等數(shù)據(jù)贯溅。
方法區(qū)也被稱為永久代拄氯,如果不顯示指定的話,GC回收的目標(biāo)僅針對方法區(qū)的常量池和類型卸載
JDK8中已經(jīng)把持久代(PermGen Space) 干掉了它浅,取而代之的元空間(Metaspace)译柏。Metaspace占用的是本地內(nèi)存,不再占用虛擬機(jī)內(nèi)存姐霍。
————————————————
版權(quán)聲明:本文為CSDN博主「孟令杰」的原創(chuàng)文章鄙麦,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明镊折。
原文鏈接:https://blog.csdn.net/jenny8080/article/details/79019538