- Java語(yǔ)言介紹
- Java EE和Tomcat
- Tomcat的主要配置
- Tomcat的管理工具
- Tomcat的反向代理
一、Java語(yǔ)言介紹
(一)Java的特征
- 面向?qū)ο?/li>
- write once, run anywhere:一次編譯,任何處運(yùn)行
- jdk:包含類庫(kù)(API)、開發(fā)工具(javac)关噪、JVM
(二)Java的三個(gè)方向
- JAVA SE:標(biāo)準(zhǔn)版
- JAVA EE:企業(yè)版,可以視為JAVA SE增加一些企業(yè)級(jí)功能模塊
- JAVA ME:移動(dòng)版
(三)jdk與openjdk
- 2006年Sun開源了jdk,建立了openjdk組織
- openjdk與jdk接口兼容烟具,可以按照需求選擇
- 當(dāng)前有openjdk 1.6, 1.7, 1.8版本,對(duì)應(yīng)oracle jdk的相應(yīng)版本
(四)Java代碼的運(yùn)行
- *.java(source code) --> javac --> *.class(bytecode)
javac程序?qū)ava源碼文件編譯為字節(jié)碼的java類文件 - jvm:class loader闻牡,加載程序的類文件净赴,及程序的類文件依賴到的其它的類文件而后運(yùn)行; 整個(gè)運(yùn)行表現(xiàn)為一個(gè)jvm進(jìn)程
(五)java技術(shù)體系
- Java編程語(yǔ)言
- Java Class文件格式
- Java API
- Java VM
(六)JVM運(yùn)行時(shí)區(qū)域
- 方法區(qū):線程共享罩润, 用于存儲(chǔ)被JVM加載的class信息玖翅、常量、靜態(tài)變量割以、方法等
- 堆:用于存儲(chǔ)對(duì)象金度,是jvm所管理的內(nèi)存中占用空間最大的一部分,也是GC(垃圾回收)管理的主要區(qū)域严沥;
- Java棧:線程私有猜极,存儲(chǔ)線程自己的局部變量
- PC寄存器:線程私有的內(nèi)存空間,程序的指令指針
- 本地方法棧:
(七)jdk的安裝
(1)openjdk的安裝
- java-VERSION-openjdk:核心包
- java-VERSION-openjdk-headless:運(yùn)行時(shí)環(huán)境包
- java-VERSION-openjdk-devel:開發(fā)包
yum install java-1.8.0-openjdk-devel
java -version // 查看當(dāng)前java環(huán)境
(2)oracle jdk的安裝
rpm -ivh jdk-8u151-linux-x64.rpm
vim /etc/profile.d/java.sh
export JAVA_HOME=/usr/java/latest
export PATH=$JAVA_HOME/bin:$PATH
. /etc/profile.d/java.sh
java -version
二消玄、Java EE和Tomcat
(一)Java EE中的關(guān)鍵模塊
-
Servlet:Java編寫的服務(wù)器端程序跟伏,主要功能在于交互式地瀏覽和修改數(shù)據(jù),生成動(dòng)態(tài)Web內(nèi)容
- servlet container:容器翩瓜,提供servlet功能的服務(wù)器
- servlet engine:實(shí)現(xiàn)具體功能的servlet實(shí)例
-
JSP:Java Server Pages受扳,是一種實(shí)現(xiàn)普通靜態(tài)HTML 和動(dòng)態(tài) HTML 混合編碼的技術(shù);
- 特點(diǎn):借助內(nèi)容和外觀的分離兔跌,頁(yè)面制作中不同性質(zhì)的任務(wù)可以方便地分開:由頁(yè)面設(shè)計(jì)者進(jìn)行 HTML設(shè)計(jì)勘高,同時(shí)留出供 Servlet 程序員插入動(dòng)態(tài)內(nèi)容的空間
<html> <title>TITLE</title> <body> <h1>...</h1> <% ... java code... // 插入動(dòng)態(tài)內(nèi)容,實(shí)現(xiàn)前端與后端的分離 %> </body> </html>
-
jsp與servlet的轉(zhuǎn)換關(guān)系:
.jsp -->jasper--> .java --> javac --> .class --> jvm- 基于jasper將靜態(tài)輸出的數(shù)據(jù)轉(zhuǎn)為java代碼進(jìn)行輸出坟桅,結(jié)果為servlet規(guī)范的代碼
- javac工具將servlet代碼編譯為類文件华望,再把類文件加載到j(luò)vm中運(yùn)行
- jsp的作用在于解決servlet處理html時(shí)的復(fù)雜性,將前端與后端的工作分離仅乓。運(yùn)行時(shí)通過(guò)jasper將jsp翻譯為標(biāo)準(zhǔn)的java源代碼赖舟,再按照標(biāo)準(zhǔn)的java代碼運(yùn)行過(guò)程工作。
(二)Tomcat
- Tomcat是一個(gè)servlet container方灾,實(shí)現(xiàn)了Java EE中servlet, jsp部分建蹄,故其只是Java EE的部分實(shí)現(xiàn)
- Tomcat是由Sun開發(fā)的Java Web Server(Java EE的最早實(shí)現(xiàn))與ASF開發(fā)的JServ項(xiàng)目合并后產(chǎn)生的
- 當(dāng)前的Tomcat項(xiàng)目是在Tomcat 4.0(代號(hào):Catalina)的基礎(chǔ)上不斷完善發(fā)展起來(lái)的碌更,故Tomcat中很多地方仍舊能夠看到單詞catalina的痕跡
(三)Java EE的實(shí)現(xiàn)簡(jiǎn)介
- 商業(yè)實(shí)現(xiàn):
WebSphere, WebLogic, Oc4j, Glassfish, Geronimo, JOnAS, JBoss - 開源實(shí)現(xiàn):
Tomcat, Jetty, Resin
(四)Tomcat的安裝
(1)yum安裝
yum install tomcat tomcat-docs-webapp tomcat-admin-webapps tomcat-webapps
systemctl start tomcat
(2)官網(wǎng)下載二進(jìn)制壓縮包,解壓縮安裝
tar xf apache-tomcat-7.0.82.tar.gz -C /usr/local/
cd /usr/local/
ln -sv apache-tomcat-7.0.82/ tomcat
useradd tomcat
setfacl -R -m u:tomcat:rwx ./tomcat/
vim /etc/profile.d/tomcat.sh
export CATALINA_BASE=/usr/local/tomcat
export PATH=$CATALINA_BASE/bin:$PATH
. /etc/profile.d/tomcat.sh
. catalina.sh start // tomcat由java編寫洞慎,使用腳本運(yùn)行將tomcat運(yùn)行在jvm中
(五)Tomcat的程序環(huán)境
(1)tomcat的目錄結(jié)構(gòu)
bin:腳本及啟動(dòng)時(shí)用到的類
conf:配置文件目錄
lib:庫(kù)文件痛单,Java類庫(kù),jar
logs:日志文件目錄
temp:臨時(shí)文件目錄
webapps:webapp的默認(rèn)目錄
work:工作目錄劲腿,存放編譯后的字節(jié)碼文件
(2)catalina.sh --help
run:前臺(tái)模式啟動(dòng)
run -security:帶安全管理的前臺(tái)模式啟動(dòng)
start:后臺(tái)模式啟動(dòng)
start -security:帶安全管理的后臺(tái)模式啟動(dòng)
stop:關(guān)閉
stop n:等待n秒后關(guān)閉
stop -force:強(qiáng)行關(guān)閉
stop n -force:等待n秒后旭绒,強(qiáng)行關(guān)閉
configtest:檢查配置
version:查詢版本
(3)rpm包安裝的程序環(huán)境
- 配置文件目錄:/etc/tomcat
- 主配置文件:server.xml
- webapps存放位置:/var/lib/tomcat/webapps/
examples
manager
host-manager
docs - Unit File:tomcat.service
- 環(huán)境配置文件:/etc/sysconfig/tomcat
三、Tomcat的主要配置
(一)tomcat的配置文件構(gòu)成
- server.xml:主配置文件
- web.xml:每個(gè)webapp只有“部署”后才能被訪問(wèn)焦人,它的部署方式通常由web.xml進(jìn)行定義挥吵,其存放位置為WEB-INF/目錄中;此文件為所有的webapps提供默認(rèn)部署相關(guān)的配置
- context.xml:每個(gè)webapp都可以使用的配置文件花椭,它通常由專用的配置文件context.xml來(lái)定義忽匈,其存放位置為WEB-INF/目錄中;此文件為所有的webapps提供默認(rèn)配置
- tomcat-users.xml:用戶認(rèn)證的賬號(hào)和密碼文件矿辽;角色(role)丹允,用戶(user);此文件在tomcat啟動(dòng)時(shí)被裝入內(nèi)存
- catalina.policy:當(dāng)使用-security選項(xiàng)啟動(dòng)tomcat時(shí)袋倔,用于為tomcat設(shè)置安全策略
- catalina.properties:Java屬性的定義文件雕蔽,用于設(shè)定類加載器路徑,以及一些與JVM調(diào)優(yōu)相關(guān)參數(shù)
- logging.properties:日志系統(tǒng)相關(guān)的配置
(二)tomcat主配置文件:server.xml
-
文件結(jié)構(gòu):
<Server> <Service> <connector/> <connector/> ... <Engine> <Host> <Context/> <Context/> ... </Host> <Host> ... </Host> ... </Engine> </Service> </Server>
每一個(gè)組件都由一個(gè)Java“類”實(shí)現(xiàn)宾娜,這些組件大體可分為以下幾個(gè)類型:
頂級(jí)組件:Server
服務(wù)類組件:Service
連接器組件:http, https, ajp(apache jserv protocol)
容器類:Engine, Host, Context
被嵌套類:valve, logger, realm, loader, manager, ...
集群類組件:listener, cluster, ...
(三)JSP WebAPP的組織結(jié)構(gòu)
index.jsp:主頁(yè)
WEB-INF/:當(dāng)前webapp的私有資源路徑批狐;通常用于存儲(chǔ)當(dāng)前webapp的web.xml和context.xml配置文件
META-INF/:類似于WEB-INF/
classes/:類文件,當(dāng)前webapp所提供的類
lib/:類文件前塔,當(dāng)前webapp所提供的類嚣艇,被打包為jar格式
(四)webapp歸檔格式
.war:webapp
.jar:EJB的類打包文件(類庫(kù))
.rar:資源適配器類打包文件
.ear:企業(yè)級(jí)webapp
(五)部署(deploy)webapp的相關(guān)操作
-
部署步驟:
- 將webapp的源文件放置于目標(biāo)目錄(網(wǎng)頁(yè)程序文件存放目錄)
- 配置tomcat服務(wù)器能夠基于web.xml和context.xml文件中定義的路徑來(lái)訪問(wèn)此webapp
- 將其特有的類和依賴的類通過(guò)class loader裝載至JVM
-
部署有兩種方式:
- 自動(dòng)部署:auto deploy
- 手動(dòng)部署:
冷部署:把webapp復(fù)制到指定的位置,而后才啟動(dòng)tomcat
熱部署:在不停止tomcat的前提下進(jìn)行部署
部署工具:manager, ant腳本, tcd(tomcat client deployer)等
undeploy:拆除(反部署)华弓,停止webapp髓废,并從tomcat實(shí)例上卸載webapp
實(shí)驗(yàn)1:實(shí)現(xiàn)一個(gè)最簡(jiǎn)單的webapp部署操作
mkdir -pv /var/lib/tomcat/webapps/test/{WEB-INF,classes,lib}
vim /var/lib/tomcat/webapps/test/index.jsp
<%@ page language="java" %> // 聲明使用的語(yǔ)言
<%@ page import="java.util.*" %> // 聲明引用的類
<html>
<head>
<title>Test Page</title>
</head>
<body>
<% out.println("hello world");
%>
</body>
</html>
service tomcat restart
登錄http:// 192.168.136.229:8080/test,成功顯示預(yù)期結(jié)果
使用tree命令查看/var/cache/tomcat/work/Catalina/localhost/test目錄下的結(jié)構(gòu)该抒,可以看到index.jsp文件先通過(guò)jasper轉(zhuǎn)化為.java源碼文件,繼而通過(guò)javac編譯為.class類文件并被送入jvm中執(zhí)行
(六)tomcat的常用組件配置
(1)Server組件:
- 代表tomcat instance顶燕,即表現(xiàn)出的一個(gè)java進(jìn)程
- 監(jiān)聽在8005端口凑保,只接收“SHUTDOWN”——建議將監(jiān)聽端口設(shè)為-1,取消shutdown功能
- 各server監(jiān)聽的端口不能相同涌攻,因此欧引,在同一物理主機(jī)啟動(dòng)多個(gè)實(shí)例時(shí),需要修改其監(jiān)聽端口為不同的端口
(2)Service組件:
- 用于實(shí)現(xiàn)將一個(gè)或多個(gè)connector組件關(guān)聯(lián)至一個(gè)engine組件
(3)Connector組件:
負(fù)責(zé)接收請(qǐng)求恳谎,常見的有三類http/https/ajp(apache jserv protocol)
進(jìn)入tomcat的請(qǐng)求可分為兩類:
(1) standalone : 請(qǐng)求來(lái)自于客戶端瀏覽器
(2) 由其它的web server反代:來(lái)自前端的反代服務(wù)器
nginx --> http connector --> tomcat
httpd(proxy_http_module) --> http connector --> tomcat
httpd(proxy_ajp_module) --> ajp connector --> tomcat-
屬性:
- 默認(rèn)存在
port="8080"
protocol="HTTP/1.1"
connectionTimeout="20000" // 單位:毫秒
address:監(jiān)聽的IP地址芝此;默認(rèn)為本機(jī)所有可用地址 - 可以添加的屬性
maxThreads:最大并發(fā)連接數(shù)憋肖,默認(rèn)為200
enableLookups:是否啟用DNS查詢功能,建議關(guān)閉
acceptCount:等待隊(duì)列的最大長(zhǎng)度
secure
sslProtocol
- 默認(rèn)存在
(4)Engine組件:
Servlet實(shí)例婚苹,即servlet引擎岸更,其內(nèi)部可以一個(gè)或多個(gè)host組件來(lái)定義站點(diǎn);通常需要通過(guò)defaultHost來(lái)定義默認(rèn)的虛擬主機(jī)
屬性:
name
defaultHost
jvmRoute:與基于cookie的session sticky有關(guān)
(5)Host組件:
位于engine內(nèi)部用于接收請(qǐng)求并進(jìn)行相應(yīng)處理的主機(jī)或虛擬主機(jī)膊升,示例:
常用屬性說(shuō)明:
(1) appBase:此Host的webapps的默認(rèn)存放目錄怎炊,指存放非歸檔的web應(yīng)用程序的目錄或歸檔的WAR文件目錄路徑;可以使用基于$CATALINA_BASE變量所定義的路徑的相對(duì)路徑
(2) autoDeploy:在Tomcat處于運(yùn)行狀態(tài)時(shí)廓译,將某webapp放置于appBase所定義的目錄中時(shí)评肆,是否自動(dòng)將其部署至tomcat實(shí)驗(yàn)2:實(shí)現(xiàn)在非默認(rèn)webapps部署目錄存放webapp文件
vim /etc/tomcat/server.xml // 創(chuàng)建虛擬主機(jī)
<Host name="test.hellopeiyang.com" appBase="/app/webapps" unpackWARs="true" autoDeploy="true"/>
mkdir -pv /app/webapps/ROOT/{WEB-INF,lib,classes}
vim /app/webapps/ROOT/index.jsp
<%@ page language="java" %>
<%@ page import="java.util.*" %>
<html>
<head>
<title>Test Page</title>
</head>
<body>
<% out.println("hellopeiyang test page");
%>
</body>
</html>
service tomcat restart
(6)Context組件:
實(shí)現(xiàn)別名的功能:如下,當(dāng)url為/PATH時(shí)非区,自動(dòng)尋找磁盤上/PATH/TO/SOMEDIR的文件
<Context path="/PATH" docBase="/PATH/TO/SOMEDIR" reloadable=""/>實(shí)驗(yàn)3:在實(shí)驗(yàn)2的基礎(chǔ)上瓜挽,實(shí)現(xiàn)使用context組件
cp -r /app/webapps/ROOT/ /app/data/
vim /etc/tomcat/server.xml
<Host name="test.hellopeiyang.com" appBase="/app/webapps" unpackWARs="true" autoDeploy="true">
<Context path="/testpage" docBase="/app/data" reloadable="" />
</Host>
vim /app/data/index.jsp
<%@ page language="java" %>
<%@ page import="java.util.*" %>
<html>
<head>
<title>Test Page</title>
</head>
<body>
<% out.println("hellopeiyang another test page");
%>
</body>
</html>
service tomcat restart
(7)Valve組件:
- 定義訪問(wèn)日志: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" />
- 定義訪問(wèn)控制:org.apache.catalina.valves.RemoteAddrValve
<Valve className="org.apache.catalina.valves.RemoteAddrValve" deny="172\.16\.100\.67"/>
- 實(shí)驗(yàn)4:在實(shí)驗(yàn)3的基礎(chǔ)上,使用valve組件實(shí)現(xiàn)定制訪問(wèn)日志和訪問(wèn)控制
vim /etc/tomcat/server.xml // 位置在Host組件語(yǔ)句塊中
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="node1_access_log." suffix=".log"
pattern="%h %l %u %t "%r" %s %b" />
<Valve className="org.apache.catalina.valves.RemoteAddrValve" deny="192\.168\.136\.129"/>
service tomcat restart
tail /var/log/tomcat/node1_access_log.2017-11-07.log
日志內(nèi)容存放在/var/log/tomcat/下定義名稱的日志文件中
192.168.136.129的主機(jī)無(wú)法訪問(wèn)
非192.168.136.129的主機(jī)可以訪問(wèn)
四征绸、Tomcat的管理工具
(一)tomcat管理工具的使用角色(role)
- manager-gui:允許查看圖形管理界面和服務(wù)器狀態(tài)界面
- manager-script:允許通過(guò)文本接口管理和查看服務(wù)器狀態(tài)界面
- manager-jmx :允許通過(guò)JMX代理管理和查看服務(wù)器狀態(tài)界面
- manager-status:只允許查看服務(wù)器狀態(tài)界面
(二)授權(quán)用戶manager-gui角色
vim /etc/tomcat/tomcat-users.xml
<role rolename="manager-gui"/>
<user username="hellopeiyang" password="centos" roles="manager-gui"/>
service tomcat restart
紅框中的為三個(gè)管理工具頁(yè)面的連接久橙,從上之下依次為:服務(wù)器狀態(tài), 管理應(yīng)用歹垫,虛擬主機(jī)管理
網(wǎng)絡(luò)應(yīng)用管理頁(yè)面
服務(wù)器狀態(tài)管理頁(yè)面
(三)授權(quán)用戶admin-gui角色
vim /etc/tomcat/tomcat-users.xml
service tomcat restart
<role rolename="admin-gui"/>
<role rolename="manager-gui"/>
<user username="hellopeiyang" password="centos" roles="manager-gui,admin-gui"/> // 用戶hellopeiyang同時(shí)擁有manager-gui和admin-gui角色
虛擬主機(jī)管理頁(yè)面
五剥汤、Tomcat的反向代理
(一)nginx反向代理至tomcat
- 轉(zhuǎn)發(fā)過(guò)程:client (http) --> nginx (reverse proxy)(http) --> tomcat (http connector)
vim /etc/nginx/nginx.conf
server {
listen 80 default_server;
index index.jsp index.html;
root /usr/share/tomcat/webapps/ROOT;
location ~* \.(jsp|do)$ {
proxy_pass http://127.0.0.1:8080;
}
}
nginx -t
nginx -s reload
直接登錄192.168.136.230,通過(guò)80端口成功訪問(wèn)tomcat服務(wù)器
(二)httpd通過(guò)http協(xié)議反向代理至tomcat
- 轉(zhuǎn)發(fā)過(guò)程:client (http) --> httpd (proxy_http_module)(http) --> tomcat (http connector)
vim /etc/httpd/conf.d/tomcat.conf
<VirtualHost *:80>
ServerName node1.hellopeiyang.com
ProxyRequests Off
ProxyVia On
ProxyPreserveHost On
<Proxy *>
Require all granted
</Proxy>
ProxyPass / http://127.0.0.1:8080/
ProxyPassReverse / http://127.0.0.1:8080/
<Location />
Require all granted
</Location>
</VirtualHost>
httpd -t
systemctl restart httpd
直接登錄192.168.136.230排惨,通過(guò)80端口成功訪問(wèn)tomcat服務(wù)器
(三)httpd通過(guò)ajp協(xié)議反向代理至tomcat
- 轉(zhuǎn)發(fā)過(guò)程:client (http) --> httpd (proxy_ajp_module)(ajp) --> tomcat (ajp connector)
cp /etc/httpd/conf.d/tomcat.conf /etc/httpd/conf.d/ajp-tomcat.conf
mv /etc/httpd/conf.d/tomcat.conf /etc/httpd/conf.d/tomcat.conf.bak
vim /etc/httpd/conf.d/ajp-tomcat.conf
<VirtualHost *:80>
ServerName node1.hellopeiyang.com
ProxyRequests Off
ProxyVia On
ProxyPreserveHost On
<Proxy *>
Require all granted
</Proxy>
ProxyPass / ajp://127.0.0.1:8009/
ProxyPassReverse / ajp://127.0.0.1:8009/
<Location />
Require all granted
</Location>
</VirtualHost>
systemctl restart httpd
直接登錄192.168.136.230吭敢,通過(guò)80端口成功訪問(wèn)tomcat服務(wù)器。
進(jìn)入Server Status管理頁(yè)面暮芭,可以看到此時(shí)ajp協(xié)議開始工作鹿驼,證明現(xiàn)在通過(guò)ajp協(xié)議轉(zhuǎn)發(fā)