tomcat從入門到進(jìn)階
Tomat是由Apache軟件基金會下屬的Jakarta項(xiàng)目開發(fā)的一個(gè)Servlet容器。由于Tomcat本身也包含了一個(gè)HTTP服務(wù)器琼开,它可以被視作一個(gè)單獨(dú)的WEB服務(wù)器易结。不過HTTP服務(wù)器是C語言實(shí)現(xiàn)的Web服務(wù)器,而Tomcat則是由Java編寫柜候。
什么是Servlet
呢搞动? Servlet
,全稱 Java Servlet渣刷,是用Java編寫的服務(wù)器端程序鹦肿,主要功能在于交互式的瀏覽和修改數(shù)據(jù),生成動態(tài)Web內(nèi)容辅柴。
JSP代碼運(yùn)行過程
index.jsp
–> 由jasper
轉(zhuǎn)換 –> index_jsp.java
–> 通過javac編譯器
–> 生成類文件 index_jsp.class
–> 在(engine上)jvm虛擬機(jī)
上運(yùn)行
基于jsp將靜態(tài)輸出的數(shù)據(jù)轉(zhuǎn)為java代碼進(jìn)行輸出箩溃,結(jié)果為Servlet規(guī)范的代碼
Java代碼運(yùn)行過程
.java –> javac –> .class(bytecode字節(jié)碼)
JVM運(yùn)行時(shí)區(qū)域
方法區(qū) : 用于存儲被JVM加載的class信息、常量碌嘀、靜態(tài)變量涣旨,方法等
堆 : 是jvm所管理的內(nèi)存中占用空間最大的一部分,也是GC管理的主要區(qū)域股冗,用
來存儲對象信息
棧 : 線程私有霹陡,存儲線程自己的局部變量
PC寄存器 : 線程私有的內(nèi)存空間,程序的指令指針
GC : 垃圾回收魁瞪,回收堆中不再使用的空間
JDK
在Linux下想要運(yùn)行tomcat
穆律,就必須依賴JDK
環(huán)境了,這里我們使用的JDK版本是java-1.8.0-openjdk
导俘。openjdk是jdk的一個(gè)分支峦耘,也是其開源的項(xiàng)目。
安裝JDK
由于使用的是Centos 7
旅薄,所以在base倉庫就已經(jīng)提供了3種openjdk版本:
$ yum list all *jdk*
java-1.6.0-openjdk
java-1.7.0-openjdk
java-1.8.0-openjdk
這里我們使用java-1.8.0-openjdk
版本
$ yum install java-1.8.0-openjdk
$ java -version
為了防止其他程序要使用java
時(shí)找不到JAVA_HOME
辅髓,我們這里手動配置JAVA_HOME
$ vim /etc/profile.d/java.sh
export JAVA_HOME=/usr
$ . /etc/profile.d/java.sh
如果是使用Oracle
版本的JDK,其默認(rèn)安裝在/usr/java/jdk_VERSION
路徑下
$ vim /etc/profile.d/java.sh
export JAVA_HOME=/usr/java/jdk_VERSION
export PATH=$JAVA_HOME/bin:$PATH
$ . /etc/profile.d/java.sh
安裝完jdk
之后少梁,我們就可以開始安裝和配置Tomcat了洛口!
Tomcat安裝與配置
安裝Tomcat
-
使用base倉庫安裝
$ yum install -y tomcat tomcat-lib tomcat-admin-webapps tomcat-webapps tomcat-docs-webapp
使用官方二進(jìn)制版本安裝
$ wget http://mirrors.hust.edu.cn/apache/tomcat/tomcat-8/v8.5.16/bin/apache-tomcat-8.5.16.tar.gz
$ tar -xf apache-tomcat-8.5.16.tar.gz -C /usr/local/
$ cd /usr/local
$ ln -sv apache-tomcat-8.5.16 tomcat
注意這里使用軟連接的方式,是為了生產(chǎn)環(huán)境中凯沪,如果需要版本升級時(shí)第焰,可以很好的進(jìn)行替換操作,只需將連接修改至新版本即可妨马。
如果使用了二進(jìn)制版本安裝挺举,我們就需要手動添加環(huán)境變量了:
$ vim /etc/profile.d/tomcat.sh
export CATALINA_BASE=/usr/local/tomcat
export PATH=$CATALINA_BASE/bin:$PATH
$ . /etc/profile.d/tomcat.sh
Tomcat程序環(huán)境
tomcat的目錄結(jié)構(gòu)
bin 腳本杀赢,及啟動時(shí)用到的類
conf 配置文件目錄
lib 庫文件,Java類庫湘纵,jar
logs 日志文件目錄
temp 臨時(shí)文件目錄
webapps webapp的默認(rèn)目錄
work 工作目錄
ROOT 存放主站的文件脂崔,就是訪問 / 的顯示的頁面
rpm包安裝的程序環(huán)境
配置文件目錄:/etc/tomcat
主配置文件:/etc/tomcat/server.xml
認(rèn)證用戶配置文件:/etc/tomcat/tomcat-users.xml
webapps存放位置:/var/lib/tomcat/webapps/
Unit File:/usr/lib/systemd/system/tomcat.service
環(huán)境配置文件:/etc/sysconfig/tomcat
運(yùn)行Tomcat進(jìn)程的用戶
默認(rèn)為tomcat用戶,但無權(quán)監(jiān)聽80端口
使用authbind程序使tomcat用戶可以監(jiān)聽80端口
$ wget https://s3.amazonaws.com/aaronsilber/public/authbind-2.1.1-0.1.x86_64.rpm
$ yum install -y ./authbind-2.1.1-0.1.x86_64.rpm
$ chmod 755 /etc/authbind/port/80
$ chown test.test /etc/authbind/port/80
$ authbind --deep systemctl restart tomcat
authbind-github下載
tomcat的配置文件
配置文件路徑 /etc/tomcat/conf
server.xml 主配置文件
web.xml 每個(gè)webapp只有"部署"后才能被訪問梧喷,它的部署方式通常由web.xml進(jìn)行定義砌左,其存放位置為WEB-INF/目錄中;此文件為所有的webapps提供默認(rèn)部署相關(guān)的配置
context.xml 每個(gè)webapp都可以專用的配置文件铺敌,它通常由專用的配置文件context.xml來定義汇歹,其存放位置為WEB-INF/目錄中;此文件為所有的webapps提供默認(rèn)配置
tomcat-users.xml 用戶認(rèn)證的賬號和密碼文件
catalina.policy 當(dāng)使用-security選項(xiàng)啟動tomcat時(shí)适刀,用于為tomcat設(shè)置安全策略秤朗;
catalina.properties Java屬性的定義文件,用于設(shè)定類加載器路徑笔喉,以及一些與JVM調(diào)優(yōu)相關(guān)參數(shù)
logging.properties 日志系統(tǒng)相關(guān)的配置
二進(jìn)制安裝中 catalina.sh腳本使用方法
debug 測試模式
debug -security 安全策略的測試模式
run 運(yùn)行為守護(hù)進(jìn)程
run -security 安全策略模式啟動
start 運(yùn)行為守護(hù)進(jìn)程
start -security 安全策略模式啟動
stop 停止
stop n 等待幾秒后停止
stop -force 強(qiáng)制停止
stop n -force 幾秒后強(qiáng)制停止
version 版本
$ catalina.sh start #啟動tomcat
$ catalina.sh version #查看tomcat版本
JSP WebAPP的組織結(jié)構(gòu)
路徑 /var/lib/tomcat/webapps
/ webapps的根目錄
index.jsp 主頁文件
WEB-INF/ 當(dāng)前webapp的'私有資源路徑'取视;通常用于存儲當(dāng)前webapp的web.xml和context.xml配置文件
META-INF/ 類似于WEB-INF/
classes/ 類文件,當(dāng)前webapp所提供的類
lib/ 類文件常挚,當(dāng)前webapp所提供的類作谭,被打包為jar格式
部署deploy webapp的相關(guān)操作
deploy 將webapp的源文件放置于目標(biāo)目錄(網(wǎng)頁程序文件存放目錄),配置tomcat服務(wù)器能夠基于web.xml和context.xml文件中定義的路徑來訪問此webapp
undeploy 反部署奄毡,停止webapp折欠,并從tomcat實(shí)例上卸載webapp
start 啟動處于停止?fàn)顟B(tài)的webapp
stop 停止webapp,不再向用戶提供服務(wù)吼过;其類依然在jvm上
redeploy 重新部署
部署有兩種方式
自動部署:auto deploy(可能需要重啟)
手動部署:
冷部署:把webapp復(fù)制到指定的位置锐秦,而后才啟動tomcat
熱部署:在不停止tomcat的前提下進(jìn)行部署
部署工具:manager、ant腳本盗忱、tcd(tomcat client deployer)等
tomcat的兩個(gè)管理應(yīng)用
manager
不用關(guān)閉tomcat酱床,完成webapp的熱部署
使用此功能,需要先配置用戶和密碼:
conf/tomcat-user.xml
$ vim tomcat-user.xml
<role rolename="manager-gui">
<user username="tomcat" password="tomcat" roles="manager-gui" />
修改完之后趟佃,重啟tomcat
$ systemctl restart tomcat
expire session:清除超過指定時(shí)間的會話
只要把webapp放到路徑下扇谣,然后在網(wǎng)頁控制頁面中的deploy填寫 /test /test2 類似這樣
并創(chuàng)建WEB-INF、META-INF闲昭、index.jsp即可
host-manager
此管理應(yīng)用罐寨,需要另一個(gè)配置。
<role rolename="admin-gui">n
<user username="tomcat" password="tomcat" roles="admin-gui" />
但是在這里通過圖形化界面添加的 虛擬主機(jī)序矩,重啟tomcat后鸯绿,就會失效,需要定義在 server.xml
Tomcat的常用組件配置
Server:代表tomcat instance,即表現(xiàn)出的一個(gè)java進(jìn)程楞慈;監(jiān)聽在8005端口幔烛,只接收“SHUTDOWN”。各server監(jiān)聽的端口不能相同囊蓝,因此,在同一物理主機(jī)啟動多個(gè)實(shí)例時(shí)令蛉,需要修改其監(jiān)聽端口為不同的端口
Service:用于實(shí)現(xiàn)將一個(gè)或多個(gè)connector組件關(guān)聯(lián)至一個(gè)engine組件
Connector組件:
負(fù)責(zé)接收請求聚霜,常見的有三類http/https/ajp;
進(jìn)入tomcat的請求可分為兩類:
(1) standalone : 請求來自于客戶端瀏覽器珠叔;
(2) 由其它的web server反代:來自前端的反代服務(wù)器蝎宇;
nginx --> http connector --> tomcat
httpd(proxy_http_module) --> http connector --> tomcat
httpd(proxy_ajp_module) --> ajp connector --> tomcat
http(mod_jk) --> ajp connector --> tomcat
參數(shù):
address:監(jiān)聽的IP地址;默認(rèn)為本機(jī)所有可用地址
maxThreads:最大并發(fā)連接數(shù)祷安,默認(rèn)為200
enableLookups:是否啟用DNS查詢功能
acceptCount:等待隊(duì)列的最大長度
Engine組件:
Servlet實(shí)例姥芥,即servlet引擎,其內(nèi)部可以一個(gè)或多個(gè)host組件來定義站點(diǎn)汇鞭; 通常需要通過defaultHost來定義默認(rèn)的虛擬主機(jī)
Host組件:
位于engine內(nèi)部用于接收請求并進(jìn)行相應(yīng)處理的主機(jī)或虛擬主機(jī)
參數(shù):
(1)'appBase':此Host的'webapps的默認(rèn)存放目錄'凉唐,指存放非歸檔的web應(yīng)用程序的目錄或歸檔的WAR文件目錄路徑;可以使用基于$CATALINA_BASE變量所定義的路徑的相對路徑霍骄;
(2) autoDeploy:在Tomcat處于運(yùn)行狀態(tài)時(shí)台囱,將某webapp放置于appBase所定義的目錄中時(shí),是否'自動將其部署至tomcat读整;'
(3) unpackWARs:是否自動解開 WAR 文件
注意:'這里如果是新建的HOST簿训,主頁的文件資源必須放在appBase指定的目錄下的ROOT目錄下,否則將無法訪問'
Context組件:(類似于nginx中的alias)
參數(shù):
path:URL路徑
reloadable:是否支持自動裝載
docBase:系統(tǒng)文件路徑
Valve組件:
參數(shù):
定義訪問日志:org.apache.catalina.valves.AccessLogValve
定義訪問控制:org.apache.catalina.valves.RemoteAddrValve
pattern:日志格式
prefix:日志前綴
suffix:日志后綴
日志路徑:
rpm安裝:/var/log/tomcat/
綠色安裝:/usr/local/tomcat/logs/
綜合示例:
<Host name="www.maxie.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"
# 設(shè)置為combined格式的日志
pattern="%h %l %u %t %r %s %b %{Referer}i %{User-Agent}i" />
</Context>
</Host>
配置幾個(gè)Tomcat示例
簡單測試頁 配置
- 安裝Tomcat
安裝所需要的包:
$ yum install -y java-1.8.0-openjdk-devel tomcat tomcat-webapps tomcat-admin-webapps tomcat-docs-webapp
配置tomcat.users.xml
$ vim /etc/tomcat/tomcat.users.xml
<role rolename="admin-gui"/>
<user username="tomcat" password="tomcat" roles="admin-gui"/>
<role rolename="manager-gui"/>
<user username="maxie" password="maxie" roles="manager-gui"/>
修改網(wǎng)卡地址為內(nèi)網(wǎng)地址
- 配置Tomcat測試頁
$ mkdir /usr/share/tomcat/webapps/test/{classes,META-INF,WEB-INF}
$ vim /usr/share/tomcat/webapps/test/index.jsp
<%@ page language="java" %>
<%@ page import="java.util.*" %>
<html>
<head>
<title>Test Page</title>
</head>
<body>
<font size=10 color="#38B0DE" > Tomcat One Server </font>
<table align="centre" border="1">
<tr>
<td>Session ID</td>
<% session.setAttribute("magedu.com","magedu.com"); %>
<td><%= session.getId() %></td>
</tr>
<tr>
<td>Created on</td>
<td><%= session.getCreationTime() %></td>
</tr>
</table>
<br>
<% out.println("hello world");
%>
</body>
</html>
$ systemctl restart tomcat
- 使用nginx作為反向代理tomcat
$ yum install nginx
$ vim /etc/nginx/nginx.conf
upstream
server {
listen 80;
server_name www1.maxie.com;
location / {
proxy_pass http://192.168.1.30:8080;
}
}
$ systemctl start nginx
-
修改客戶端HOSTS文件
$ sudo vim /etc/hosts 172.16.3.10 www1.maxie.com
打開網(wǎng)頁進(jìn)行測試
使用反向代理Tomcat
- 使用httpd作為反代服務(wù)器(需要將之前nginx服務(wù)關(guān)閉米间,防止端口沖突)
$ yum install httpd
$ cd /etc/httpd
$ vim conf.d/maxie-http.conf
<VirtualHost *:80>
ServerName www1.maxie.com
DocumentRoot "/data/maxie/"
ProxyRequests Off # 關(guān)閉正向代理
ProxyVia On # 添加首部Via(由誰代理)--> 有可能會httpd被取消掉
ProxyPreserveHost On # 把主機(jī)頭部發(fā)送到后端强品;保留代理服務(wù)器上虛擬主機(jī)的頭部(域名)
<Proxy *>
Require all granted
</Proxy>
ProxyPass / http://192.168.1.30:8080/ # 把/ 代理到后端服務(wù)器的地址
#或者可以定義成:
ProxyPass / http://192.168.1.30:8080/test/ # 把 / 代理到后端的 /test 上
ProxyPassReverse / http://192.168.1.30:8080/ # 把重定向返回給客戶端
<Location /> # 設(shè)置代理的/ 允許誰訪問
Require all granted
</Location>
</VirtualHost>
$ httpd -M | grep proxy # 確保 proxy_http 模塊裝載
$ httpd -t
$ systemctl start httpd
- 使用ajp協(xié)議進(jìn)行通信(確保 proxy_ajp_module裝載)
$ cp conf.d/maxie-http.conf conf.d/maxiecloud-ajp.conf
$ vim conf.d/maxiecloud-ajp.conf
<VirtualHost *:80>
ServerName www1.maxiecloud.com
DocumentRoot "/data/maxie/"
ProxyRequests Off
ProxyVia On
ProxyPreserveHost On
<Proxy *>
Require all granted
</Proxy>
ProxyPass / ajp://192.168.1.30:8009/
ProxyPassReverse / ajp://192.168.1.30:8009/
<Location />
Require all granted
</Location>
</VirtualHost>
$ systemctl restart httpd
使用nginx/httpd負(fù)載均衡Tomcat
這時(shí)需要兩臺Tomcat機(jī)器,兩臺配置一樣屈糊。只需復(fù)制之前做的一臺上的配置文件以及/test測試jsp文件
使用nginx反向代理調(diào)度器對tomcat實(shí)現(xiàn)負(fù)載均衡
-
停止httpd服務(wù)
$ systemctl stop httpd
配置nginx
$ vim /etc/nginx/conf.d/maxie.conf
upstream tomcatsrv {
server 192.168.1.50:8080;
server 192.168.1.60:8080;
}
server {
listen 80;
server_name www.maxie.com;
location / {
proxy_pass http://tomcatsrv;
}
}
$ systemctl restart nginx
- 打開網(wǎng)頁進(jìn)行測試
如需設(shè)置會話保持功能:
$ vim /etc/nginx/conf.d/maxie.conf
在upstream中添加
hash $request_uri consistent;
或者
ip_hash;
或者
hash $cookie_name consistent;
使用httpd作為反向代理時(shí)的榛,對后端2臺tomcat實(shí)現(xiàn)負(fù)載均衡
-
停止nginx服務(wù)
$ systemctl stop nginx
配置httpd
$ vim /etc/httpd/conf.d/maxie-http.conf
<Proxy balancer://tomcatsrv>
BalancerMember http://192.168.1.50:8080
BalancerMember http://192.168.1.60:8080
ProxySet lbmethod=byrequests
</Proxy>
<VirtualHost *:80>
ServerName www.maxie.com
ProxyRequests Off # 關(guān)閉正向代理
ProxyVia On # 添加首部Via(由誰代理)--> 有可能會httpd被取消掉
ProxyPreserveHost On # 把主機(jī)頭部發(fā)送到后端;保留代理服務(wù)器上虛擬主機(jī)的頭部(域名)
<Proxy *>
Require all granted
</Proxy>
ProxyPass / balancer://tomcatsrv/ # 把/ 代理到后端服務(wù)器的地址
ProxyPassReverse / balancer://tomcatsrv/ # 把重定向返回給客戶端
<Location /> # 設(shè)置代理的/ 允許誰訪問
Require all granted
</Location>
</VirtualHost>
$ httpd -t
$ systemctl restart httpd
- 打開網(wǎng)頁測試即可另玖,效果如nginx代理一樣
- httpd負(fù)載均衡實(shí)現(xiàn)會話粘性并開啟httpd內(nèi)建的負(fù)載均衡狀態(tài)頁
$ vim /etc/httpd/conf.d/maxie-http.conf
Header add Set-Cookie "MYID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED
<Proxy balancer://tomcatsrv>
BalancerMember http://192.168.1.50:8080 route=tom1 loadfactor=2
BalancerMember http://192.168.1.60:8080 route=tom2 loadfactor=1
ProxySet lbmethod=byrequests
ProxySet stickysession=MYID
</Proxy>
<VirtualHost *:80>
ServerName wwww.maxie.com
ProxyRequests Off
ProxyVia On
ProxyPreserveHost On
<Proxy *>
Require all granted
</Proxy>
ProxyPass / balancer://tomcatsrv/
ProxyPassReverse / balancer://tomcatsrv/
<Location />
Require all granted
</Location>
<Location /http-stats> # 開啟管理負(fù)載均衡的接口
SetHandler balancer-manager # 啟動balancer-manager這個(gè)內(nèi)建功能
ProxyPass ! # !表示 不反代困曙,只在本機(jī)處理
Require all granted
</Location>
</VirtualHost>
$ systemctl restart httpd
- 打開網(wǎng)頁測試