1.JVM介紹
JVM是Java Virtual Machine(Java虛擬機)的縮寫
Java虛擬機本質是就是一個程序,當它在命令行上啟動的時候,就開始執(zhí)行保存在某字節(jié)碼文件中的指令。Java語言的可移植性正是建立在Java虛擬機的基礎上。任何平臺只要裝有針對于該平臺的Java虛擬機,字節(jié)碼文件(.class)就可以在該平臺上運行。這就是“一次編譯,多次運行”。
2.Tomcat介紹
1.什么是Tomcat
Tomcat和我們此前學習的 Nginx 類似,也是一個Web服務器。
2.Tomcat與Nginx有什么區(qū)別?
Nginx僅支持靜態(tài)資源,而Tomcat則支持Java開發(fā)的 jsp 動態(tài)資源和靜態(tài)資源。
Nginx適合做前端負載均衡,而Tomcat適合做后端應用服務處理。
通常情況下,企業(yè)會使用 Nginx+tomcat 結合使用,由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.虛擬主機是添加,不要修改
4.context如果寫了,一定要有對應的目錄,不然整體就報錯
/soft/tomcat/logs/catalina.out
作者:UncleZ_strive鏈接:http://www.itdecent.cn/p/2798f56eded0來源:簡書著作權歸作者所有。商業(yè)轉載請聯(lián)系作者獲得授權,非商業(yè)轉載請注明出處。
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目錄結構介紹
[root@tomcat apache-tomcat-8.0.27]# ll
total 92
drwxr-xr-x 2 root root 4096 Aug 3 03:05 bin #主要包含啟動、關閉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配置文件
核心配置文件:

一個tomcat實例一個server
一個server中包含多個Connector,Connector的主要功能是接受、響應用戶請求。
service的作用是:將connector關聯(lián)至engine(catalina引擎)
一個host就是一個站點,類似于nginx的多站點
context類似于nginx中l(wèi)ocation的概念
Tomcat中的Connector配置講解
Tomcat配置文件解讀
7.Tomcat部署zrlog
1.Tomcat部署博客項目zrlog
域名: zrlog.hai.com:8080
站點目錄: /code/zrlog
1.配置server.xml文件 ,新增zrlog站點在 engline
[root@web01 ~]# vim /soft/tomcat/conf/server.xml
<!--zrlog站點-->
<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)建站點目錄,上傳zrlog的war包
[root@web01 ~]# mkdir /code/zrlog
[root@web01 ~]# cd /code/zrlog/
[root@web01 zrlog]# rz ROOT.war
3.重啟Tomcat服務
[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的庫,配置授權訪問用戶
[root@db01 ~]# mysql -uroot -poldxu.com
MariaDB [(none)]> create database zrlog charset utf8;
<---此前配置過all用戶,可以復用
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默認僅運行本地訪問該管理頁面,需要允許同網(wǎng)段主機訪問
[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認證(可在nginx上進行配置)
1.在tomcat-users.xml文件中進行角色與用戶的綁定
#vim /app/tomcat/conf/tomcat-users.xml
<role rolename="manager-gui"/>
<role rolename="test100"/> -->添加角色
<user username="tomcat" password="1" roles="manager-gui,test100"/> -->角色綁定用戶去認證,需要使用用戶進行basic認證--username="tomcat" password="1"
2.在站點目錄下的WEB-INF的web.xml文件中添加如下內容
# 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> -->想要配置認證的目錄
</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>
9.Nginx+Tomcat集群架構實戰(zhàn)
1.lb服務器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七層負載到后端的nginx服務器
proxy_set_header Host $host;
}
}
2.web服務器nginx配置
server {
listen 80;
server_name blog.oldqiang.com;
location / {
proxy_pass http://127.0.0.1:8080; #將負載轉發(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集群實現(xiàn)全棧Https
1.lb配置文件(在負載均衡上進行ssl證書的配置,進行加密與解密)
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配置多站點
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實例的配置文件中配置讓自己能遠程被監(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雙方應運生成了各自的代理監(jiān)控程序:zabbix 2.0以后添加了服務進程zabbix-java-gateway;Java有了JMX,全稱是Java Management Extensions,即Java管理擴展。
2:配置重啟zabbix-java-gateway
START_POLLERS=5 #預啟動的輪詢器,默認5-->如tomcat的實例多,可以根據(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實例主機,添加模塊Template App Generic Java JMX
可根據(jù)需求來刪除不支持的監(jiān)控項
5.自定義監(jiān)控項
(借助jdk-windows組件來獲取tomcat數(shù)據(jù)然后再zabbix中添加相應想要的監(jiān)控項)
可以在windows上安裝jdk,連接上tomcat實例的遠程端口12345
image.png
image.png
根據(jù)這里的取值設置自定義監(jiān)控項
隨便找一個模板監(jiān)控克隆
image.png
14.Tomcat性能優(yōu)化
1.關于tomcat的內存回收gc
年輕代: 年輕代內存滿了,就會觸發(fā)年輕代 內存回收,局部,存活下的對象存到年老代
年老代: 年老代內存滿了,就會觸發(fā)全局 內存回收,全部
jvm 內存垃圾回收,是不可避免!
垃圾回收的次數(shù)盡可能少:增加內存的容量
垃圾回收的時間盡可能短:減少內存的容量
年輕代最小內存==年輕代最大內存
年老代最小內存==年老代最大內存
堆內存==1年輕代64M+3年老代192M 256M
非堆內存== 持久代
JAVA_OPTS="$JAVA_OPTS -server -Xms3G -Xmx3G -Xss256k -XX:PermSize=128m -XX:MaxPermSize=128m -XX:+UseParallelOldGC -XX:NewSize=1G -XX:MaxNewSize=1G"
xms:最小堆內存
Xmx:最大堆內存
-Xss 線程棧的大小
-XX:NewSize 年輕代的最小內存
-XX:MaxNewSize 年輕代的最大內存
-XX:PermSize: 持久代最小內存
-XX:MaxPermSize: 持久代最大內存
詳細優(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.關于java的三個代
年輕代:
所有新生成的對象首先都是放在年輕代的。年輕代的目標就是盡可能快速的收集掉那些生
命周期短的對象。年輕代分三個區(qū)。一個Eden區(qū),兩個 Survivor區(qū)(一般而言)。大部分對象在
Eden區(qū)中生成。當Eden區(qū)滿時,還存活的對象將被復制到Survivor區(qū)(兩個中的一個),當這
個 Survivor區(qū)滿時,此區(qū)的存活對象將被復制到另外一個Survivor區(qū),當這個Survivor去也滿了
的時候,從第一個Survivor區(qū)復制過來的并且此時還存活的對象,將被復制“年老區(qū)
(Tenured)”。需要注意,Survivor的兩個區(qū)是對稱的,沒先后關系,所以同一個區(qū)中可能同時
存在從Eden復制過來對象,和從前一個Survivor復制過來的對象,而復制到年老區(qū)的只有從第
一個Survivor去過來的對象。而且,Survivor區(qū)總有一個是空的。同時,根據(jù)程序需要,
Survivor區(qū)是可以配置為多個的(多于兩個),這樣可以增加對象在年輕代中的存在時間,減
少被放到年老代的可能。
年老代:
在年輕代中經(jīng)歷了N次垃圾回收后仍然存活的對象,就會被放到年老代中。因此,可以認
為年老代中存放的都是一些生命周期較長的對象。
持久代:
用于存放靜態(tài)文件,如今Java類、方法等。持久代對垃圾回收沒有顯著影響,但是有些應
用可能動態(tài)生成或者調用一些class,例如Hibernate 等,在這種時候需要設置一個比較大的持
久代空間來存放這些運行過程中新增的類。持久代大小通過-XX:MaxPermSize=進行設置。
持久代補充:持久帶也稱為方法區(qū)
方法區(qū):方法區(qū)存儲每一個java類的結構信息:比如運行時常量池,字段和方法數(shù)據(jù),構造函數(shù)和普通方法的字節(jié)碼內容以及類、實例、接口初始化時需要使用到的特殊方法等數(shù)據(jù)。
方法區(qū)也被稱為永久代,如果不顯示指定的話,GC回收的目標僅針對方法區(qū)的常量池和類型卸載
JDK8中已經(jīng)把持久代(PermGen Space) 干掉了,取而代之的元空間(Metaspace)。Metaspace占用的是本地內存,不再占用虛擬機內存。
————————————————
版權聲明:本文為CSDN博主「孟令杰」的原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權協(xié)議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/jenny8080/article/details/79019538