java程序有着一次編譯,隨處運行的特性,此特性主要與java的運行環境jre有關。jre中的bin文件夾對應java虛擬機即jvm;jre中的lib文件夾則包含jvm運行java類文件所需的各類庫文件,二者共同組成了java程序的運行環境。jdk則是java程序的開發環境,其內包含jre。javascript
Java代碼的運行:css
*.java(source code) --> javac --> *.class(bytecode) -->jre運行
java源碼由javac編譯器編譯爲class類文件(字節碼)再交由jre環境運行。html
在web應用程序上,早期Java的實現方式是服務器端放置應用程序,客戶端訪問時將其下載到客戶端本地並執行,這樣不只不安全,並且要求客戶有java運行環境,這種實現方式是applet。前端
與applet相對的是servlet,但它是服務端程序。後來,java將應用程序放在服務器端,客戶端請求此應用程序時,服務端經過servlet類庫分析http協議,將請求的應用程序在服務端執行,而後將結果組織起來返回給客戶端,但此時servlet能分析的http協議很是簡單,且和html的組織方式很是不友好,它要求java程序員首先得懂html開發(實際上如今仍是如此,java程序員至少要懂簡單的html/css/javascript等前端技術),因而後來出現了JSP類庫。java
JSP能夠簡單的將java代碼嵌入在html文檔中,它們可以很友好地結合,結合後的文檔類型爲.jsp文件。當客戶端請求應用程序資源時,JSP類庫負責解析.jsp文件中的jsp部分並經過jasper組件將其翻譯成servlet的java源代碼,而後再編譯成class文件並交給JVM來執行。實際上,jsp的本就就是servlet,jsp類只不過是繼承於servlet類並添加了一些和html友好結合的特性,最終它仍是要翻譯成servlet代碼。node
JSP的本質仍是Servlet,每一個JSP頁面就是一個Servlet對象(固然也可能引用了其餘servlet對象),Servlet再負責響應用戶的動態請求數據(其實也包括靜態數據,由於jasper翻譯jsp代碼時,靜態標籤也被翻譯到servlet的java源文件中以待輸出)。對於Tomcat而言,JSP頁面生成的Servlet放在work路徑對應的Web應用下。linux
考慮到tomcat和httpd、nginx等http服務程序的對比,有兩點須要明確:nginx
(1).一個java程序只有一個進程,可是能夠有多個線程,也就是說java程序的開發是基於線程的。那惟一的進程就是JVM進程,每一個應用程序都開啓一個JVM進程,根據開發時設計的多線程代碼,在這個JVM進程中會啓動多個線程。它不像httpd或nginx,能開啓多進程(對於tomcat而言,這意味着多個不一樣的應用程序甚至意味着開啓多個tomcat實例)。程序員
(2).tomcat能夠處理動態請求,也能夠處理靜態資源請求。但不管是動態資源,仍是靜態資源的請求,都是通過servlet處理並響應給客戶端的,只不過請求靜態資源時使用的是默認的servlet。雖然它能像httpd和nginx同樣處理靜態資源,但顯然,它既要處理動態請求,又要處理靜態請求,壓力會很大。所以tomcat前通常使用httpd或nginx專門處理靜態請求,而動態請求則經過反向代理的方式代理至tomcat。web
tomcat是jdk+servlet(嚴格地說是+jsp)實現的精簡版的java ee,因爲它只在jdk的基礎上附加了jsp和servlet類庫,因此它的應用範圍主要是web應用。tomcat項目目前由apache軟件基金會維護。
一個server能夠有多個service。一個service能夠有多個connector和惟一的containor。containor是容器類,從containor層次開始,真正進入servlet容器相關的過程。它包含了惟一的engine容器,engine容器中包含了一個或多個host容器,host容器中包含了一個或多個context容器,context容器中包含了惟一的wrapper。它們的組織結構大體以下:
bin:腳本,及啓動時用到的類; conf:配置文件目錄; lib:庫文件,Java類庫,jar; logs:日誌文件目錄; temp:臨時文件目錄; webapps:webapp的默認目錄; work:工做目錄;
配置文件目錄:/etc/tomcat 主配置文件:server.xml webapps存放位置:/var/lib/tomcat/webapps/ examples manager host-manager docs Unit File:tomcat.service 環境配置文件:/etc/sysconfig/tomcat
server.xml:主配置文件; web.xml:每一個webapp只有「部署」後才能被訪問,它的部署方式一般由web.xml進行定義,其存放位置爲WEB-INF/目錄中;此文件爲全部的webapps提供默認部署相關的配置; context.xml:每一個webapp均可以專用的配置文件,它一般由專用的配置文件context.xml來定義,其存放位置爲WEB-INF/目錄中;此文件爲全部的webapps提供默認配置; tomcat-users.xml:用戶認證的帳號和密碼文件; catalina.policy:當使用-security選項啓動tomcat時,用於爲tomcat設置安全策略; catalina.properties:Java屬性的定義文件,用於設定類加載器路徑,以及一些與JVM調優相關參數; logging.properties:日誌系統相關的配置;
/: webapps的根目錄
index.jsp:主頁; WEB-INF/:當前webapp的私有資源路徑;一般用於存儲當前webapp的web.xml和context.xml配置文件; META-INF/:相似於WEB-INF/; classes/:類文件,當前webapp所提供的類; lib/:類文件,當前webapp所提供的類,被打包爲jar格式;
webapp歸檔格式: .war:webapp .jar:EJB的類打包文件; .rar:資源適配器類打包文件; .ear:企業級webapp;
deploy:將webapp的源文件放置於目標目錄(網頁程序文件存放目錄),配置tomcat服務器可以基於web.xml和context.xml文件中定義的路徑來訪問此webapp;將其特有的類和依賴的類經過class loader裝載至JVM;
部署有兩種方式: 自動部署:auto deploy 手動部署: 冷部署:把webapp複製到指定的位置,然後才啓動tomcat; 熱部署:在不中止tomcat的前提下進行部署; 部署工具:manager、ant腳本、tcd(tomcat client deployer)等; undeploy:反部署,中止webapp,並從tomcat實例上卸載webapp; start:啓動處於中止狀態的webapp; stop:中止webapp,再也不向用戶提供服務;其類依然在jvm上; redeploy:從新部署;
OpenJDK: java-VERSION-openjdk: The OpenJDK runtime environment. java-VERSION-openjdk-headless: The OpenJDK runtime environment without audio and video support. java-VERSION-openjdk-devel: The OpenJDK development tools. #服務端必須安裝開發環境用於編譯java代碼
注意:多版本並存時,可以使用 alternatives命令設定默認使用的版本; Oracle JDK: 安裝相應版本的rpm包;或者從官網下載對應版本tar包 jdk-VERSION-OS-ARCH.rpm 例如:jdk-1.8.0_25-linux-x64.rpm
注意:yum/rpm安裝完成後不須要設置環境變量;二進制tar包展開後要配置JAVA_HOME環境變量,指向java的安裝路徑; echo 'export JAVA_HOME=/usr/java/latest' > /etc/profile.d/jdk.sh echo 'export PATH=$JAVA_HOME/bin:$PATH' >> /etc/profile.d/jdk.sh . /etc/profile.d/jdk.sh 設置完成後可使用java命令查看version肯定設置正確與否 [root@storm ~]# java -version openjdk version "1.8.0_181" OpenJDK Runtime Environment (build 1.8.0_181-b13) OpenJDK 64-Bit Server VM (build 25.181-b13, mixed mode)
一樣的tomcat若是使用yum安裝不須要配置環境變量,下載tar包展開後須要設置以下:
echo "export CATALINA_HOME=/usr/local/tomcat" > /etc/profile.d/tomcat.sh echo 'export PATH=$CATALINA_HOME/bin:$PATH' >> /etc/profile.d/tomcat.sh . /etc/profile.d/tomcat.sh
yum安裝tomcat.noarch、tomcat-admin-webapps.noarch(webgui管理功能包) 、tomcat-docs-webapp.noarch(web文檔包),安裝命令指明這三個包便可,其餘包由yum依據依賴關係安裝。
安裝完成後試運行能夠發現8080、800五、8009端口均已監聽。
訪問8080端口能夠看到tomcat的歡迎界面
如上圖所示,app與host的web管理功能由tomcat-admin-webapps.noarch提供,幫助文檔則由tomcat-docs-webapp.noarch提供。健康檢測頁面與另外兩個管理功能均須要在配置文件中設置用戶驗證才能訪問。
點擊這三個頁面的任意按鈕,會提示驗證,取消後轉到tomcat自帶的401頁面,此頁面提示以下:
You are not authorized to view this page. If you have not changed any configuration files, please examine the file "conf/tomcat-users.xml" in your installation. That file must contain the credentials to let you use this webapp. For example, to add the manager-gui role to a user named tomcat with a password of s3cret, add the following to the config file listed above. <role rolename="manager-gui"/> <user username="tomcat" password="s3cret" roles="manager-gui"/> Note that for Tomcat 7 onwards, the roles required to use the manager application were changed from the single manager role to the following four roles. You will need to assign the role(s) required for the functionality you wish to access. manager-gui - allows access to the HTML GUI and the status pages manager-script - allows access to the text interface and the status pages manager-jmx - allows access to the JMX proxy and the status pages manager-status - allows access to the status pages only The HTML interface is protected against CSRF but the text and JMX interfaces are not. To maintain the CSRF protection: Users with the manager-gui role should not be granted either the manager-script or manager-jmx roles. If the text or jmx interfaces are accessed through a browser (e.g. for testing since these interfaces are intended for tools not humans) then the browser must be closed afterwards to terminate the session. For more information - please see the Manager App HOW-TO.
注意:yum安裝的用戶配置文件在/etc/tomcat/tomcat-users.xml ,且配置用戶後須要重啓tomcat服務。
Server組件:
表明tomcat instance,即表現出的一個java進程;監聽在8005端口,只接收「SHUTDOWN」。各server監聽的端口不能相同,所以,在同一物理主機啓動多個實例時,須要修改其監聽端口爲不一樣的端口;一個server能夠有多個engine;
Service組件:
用於實現將一個或多個connector組件關聯至一個engine組件;一個sever能夠有多個service;一個service只能有一個engine;
Connector組件:
一個鏈接器只能有一個service,也就只能有一個engine;
負責接收請求,常見的有三類http/https/ajp; 進入tomcat的請求可分爲兩類: (1) standalone : 請求來自於客戶端瀏覽器; (2) 由其它的web server反代:來自前端的反代服務器; nginx --> http connector --> tomcat httpd(proxy_http_module) --> http connector --> tomcat httpd(proxy_ajp_module) --> ajp connector --> tomcat httpd(mod_jk) --> ajp connector --> tomcat 屬性: port="8080" protocol="HTTP/1.1" connectionTimeout="20000" address:監聽的IP地址;默認爲本機全部可用地址; maxThreads:最大併發鏈接數,默認爲200; enableLookups:是否啓用DNS查詢功能; acceptCount:等待隊列的最大長度; secure: sslProtocol:
Engine組件:
Servlet實例,即servlet引擎,其內部能夠一個或多個host組件來定義站點; 一般須要經過defaultHost來定義默認的虛擬主機;通常來講,僅使用基於主機名的虛擬主機;
屬性: name= defaultHost="localhost" jvmRoute=
Host組件:
位於engine內部用於接收請求並進行相應處理的主機或虛擬主機,示例:
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> </Host> 經常使用屬性說明: (1) appBase:此Host的webapps的默認存放目錄,指存放非歸檔的web應用程序的目錄或歸檔的WAR文件目錄路徑;可使用基於$CATALINA_BASE變量所定義的路徑的相對路徑; (2) autoDeploy:在Tomcat處於運行狀態時,將某webapp放置於appBase所定義的目錄中時,是否自動將其部署至tomcat; 示例: <Host name="[tc1.magedu.com](http://tc1.magedu.com/)" appBase="/appdata/webapps" unpackWARs="true" autoDeploy="true"> </Host>
手動提供一測試類應用,並冷部署:
mkidr -pv /usr/local/tomcat/webapps/test/{classes,lib,WEB-INF}
建立文件/usr/local/tomcat/webapps/test/index.jsp
<%@ page language="java" %> <%@ page import="java.util.*" %> <html> <head> <title>Test Page</title> </head> <body> <% out.println("hello world"); %> </body> </html>
Context組件:
示例: <Context path="/PATH" docBase="/PATH/TO/SOMEDIR" reloadable=""/> 綜合示例: <Host name="[node1.magedu.com](http://node1.magedu.com/)" appBase="/web/apps" unpackWARs="true" autoDeploy="true"> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="node1_access" suffix=".log" pattern="%h %l %u %t "%r" %s %b" /> <Context path="/test" docBase="test" reloadable=""> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="node1_test_access_" suffix=".log" pattern="%h %l %u %t "%r" %s %b" /> </Context> </Host>
Valve組件:
Valve存在多種類型:
定義訪問日誌:org.apache.catalina.valves.AccessLogValve
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" />
定義訪問控制:org.apache.catalina.valves.RemoteAddrValve
<Valve className="org.apache.catalina.valves.RemoteAddrValve" deny="172\.16\.100\.67"/>
AT模式: Apache(httpd) + Tomcat,若是使用Nginx+Tomcat則僅能使用HTTP協議。
httpd的代理模塊: proxy_module proxy_http_module:適配http協議客戶端; proxy_ajp_module:適配ajp協議客戶端; Client (http) --> httpd (proxy_http_module)(http) --> tomcat (http connector) Client (http) --> httpd (proxy_ajp_module)(ajp) --> tomcat (ajp connector)
proxy_http_module代理配置示例:
<VirtualHost *:80> ServerName [tc1.magedu.com](http://tc1.magedu.com/) ProxyRequests Off ProxyVia On ProxyPreserveHost On <Proxy *> Require all granted </Proxy> ProxyPass / <http://tc1.magedu.com:8080/> ProxyPassReverse / <http://tc1.magedu.com:8080/> <Location /> Require all granted </Location> </VirtualHost>
proxy_ajp_module代理配置示例:
<VirtualHost *:80> ServerName [tc1.magedu.com](http://tc1.magedu.com/) ProxyRequests Off ProxyVia On ProxyPreserveHost On <Proxy *> Require all granted </Proxy> ProxyPass / <ajp://tc1.magedu.com:8009/> ProxyPassReverse / <ajp://tc1.magedu.com:8009/> <Location /> Require all granted </Location> </VirtualHost>
內存空間:單java進程最大可用使用32G內存
內存空間:單java進程最大可用使用32G內存
/etc/sysconfig/tomcat JAVA_OPTS="-server -Xms32g -Xmx32g -XX:NewSize= -XX:MaxNewSize= -XX:PermSize= -XX:MaxPermSize=" -server:hotspot jvm的server模式默認佔用64M內存,若是是client則是32M; -Xms:堆內存初始化大小,建議與Xmx一致,即開始就分配全部內存; -Xmx:堆內存空間上限; -XX:NewSize=:新生代空間初始化大小; -XX:MaxNewSize=:新生代空間最大值;建議不設定,由程序自行決定。 -XX:PermSize=:持久代空間初始化大小; -XX:MaxPermSize=:持久代空間最大值;
對於tomcat來講,線程池參數主要在connector中設置。
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> 經常使用屬性: maxThreads:最大線程數; minSpareThreads:最小空閒線程數; maxSpareThreads:最大空閒線程數; acceptCount:等待隊列的最大長度; URIEncoding:URI地址編碼格式,建議使用UTF-8; enableLookups:是否啓用dns解析,建議禁用; compression:是否啓用傳輸壓縮機制,建議「on"; compressionMinSize:啓用壓縮傳輸的數據流最小值,單位是字節; compressableMimeType:定義啓用壓縮功能的MIME類型; text/html, text/xml, text/css, text/javascript
<Server port="-1" shutdown="SHUTDOWN">
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> Server="SOME STRING"
jstat:對jvm應用程序的資源和性能進行實時監控; jstack:查看全部線程的運行狀態; jconsole:圖形工具 jvisualvm:圖形工具
jps:Java virutal machine Process Status tool,用來查看運行的全部jvm進程;
jps [-q] [-mlvV] [<hostid>] -q:靜默模式; -v:顯示傳遞給jvm的命令行參數; -m:輸出傳入main方法的參數; -l:輸出main類或jar徹底限定名稱; -V:顯示經過flag文件傳遞給jvm的參數; [<hostid>]:主機id,默認爲localhost;
jinfo:輸出給定的java進程的全部配置信息;
jinfo [option] <pid> -flags:to print VM flags -sysprops:to print Java system properties -flag <name>:to print the value of the named VM flag
jstack:查看指定的java進程的線程棧的相關信息;
jstack [-l] <pid> jstack -F [-m] [-l] <pid> -l:long listings,會顯示額外的鎖信息,所以,發生死鎖時經常使用此選項; -m:混合模式,既輸出java堆棧信息,也輸出C/C++堆棧信息; -F:當使用「jstack -l PID"無響應,可使用-F強制輸出信息;
jstat:輸出指定的java進程的統計信息
jstat -help|-options jstat -<option> [-t][-h] <vmid> [<interval> [<count>]] \# jstat -options -class:class loader -compiler:JIT -gc:gc -gccapacity:統計堆中各代的容量 -gccause: -gcmetacapacity -gcnew:新生代 -gcnewcapacity -gcold:老年代 -gcoldcapacity -gcutil -printcompilation [<interval> [<count>]] interval:時間間隔,單位是毫秒; count:顯示的次數; -gc: YGC:新生代的垃圾回收次數; YGCT:新生代垃圾回收消耗的時長; FGC:Full GC的次數; FGCT:Full GC消耗的時長; GCT:GC消耗的總時長;