Tomcat基礎《一》----WEB技術
1.1Tomcat
1.1.1曆史
起始于SUN的一個Servlet的參考實作項目Java Web Server,作者是James Duncan Davidson,後将項目貢獻給了ASF。和ASF現有的項目合并,并開源成為頂級項目,官網http://tomcat.apache.org/
Tomcat僅僅實作了Java EE規範中與Servlet、JSP相關的類庫,是JavaEE不完整實作。
著名圖書出版商O’Reilly約稿該項目成員,Davidson希望使用一個公貓作為封面,但是公貓已經被另一本書使用,書出版後封面是一隻雪豹。
1999年釋出初始版本是Tomcat 3.0,實作了Servlet 2.2和JSP1.1規範。
Tomcat 4.x釋出時,内建了Catalina(Servlet容器)和Jasper(JSP engine)等。
商用的有IBM WebSphere、Oracle WebLogic(原屬于BEA公司)、Oracle Oc4j、Glassfish、JBoss等。
開源實作有Tomcat、Jetty、Resin。
1.1.2安裝
可以使用CentOS7 yum源自帶的安裝。yum源中是Tomcat 7.0版本。安裝完通過浏覽器可以觀察一下首頁。
# yum install tomcat tomcat-admin-webapps tomcat-webapps
# systemctl start tomcat.service
# ss -tanl
LISTEN 0 100 :::8009
LISTEN 0 100 :::8080
采用Apache官網下載下傳,下載下傳8.x.x
# tar xf apache-tomcat-8.5.42.tar.gz -C /usr/local
# cd /usr/local
# ln -sv apache-tomcat-8.5.42/ tomcat
[[email protected] local]#ll
total 0
drwxr-xr-x 9 root root 220 Jan 16 20:28 apache-tomcat-8.5.42
drwxr-xr-x. 2 root root 6 Apr 11 2018 bin
drwxr-xr-x. 2 root root 6 Apr 11 2018 etc
drwxr-xr-x. 2 root root 6 Apr 11 2018 games
drwxr-xr-x. 2 root root 6 Apr 11 2018 include
drwxr-xr-x. 2 root root 6 Apr 11 2018 lib
drwxr-xr-x. 2 root root 6 Apr 11 2018 lib64
drwxr-xr-x. 2 root root 6 Apr 11 2018 libexec
drwxr-xr-x. 2 root root 21 Jan 12 22:00 sbin
drwxr-xr-x. 5 root root 49 Dec 5 21:43 share
drwxr-xr-x. 2 root root 6 Apr 11 2018 src
lrwxrwxrwx 1 root root 21 Jan 16 20:30 tomcat -> apache-tomcat-8.5.42/
# cd tomcat
# cd bin
# ./catalina.sh --help
# ./catalina.sh version
# ./catalina.sh start
# ss -tanlp
# ./catalina.sh stop
# ./startup.sh
# ./shutdown.sh
useradd -r java 建立系統賬号
上例中,啟動身份是root,如果使用普通使用者啟動可以使用
# useradd -r java
# chown -R java.java ./*
# su - java -c '/usr/local/tomcat/bin/catalina.sh start'
# ps -aux | grep tomcat
[[email protected] tomcat]#bin/startup.sh
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/java/default
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.
[[email protected] tomcat]#ss -tanl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:22 *:*
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 100 :::8009 :::*
LISTEN 0 100 :::8080 :::*
LISTEN 0 128 :::22 :::*
LISTEN 0 100 ::1:25 :::*
LISTEN 0 1 ::ffff:127.0.0.1:8005 :::*
[[email protected] tomcat]#ps aux |grep tomcat
root 16792 2.0 8.3 3006864 155360 pts/0 Sl 21:09 0:03 /usr/java/default/bin/java
-Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties -
Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -
Djdk.tls.ephemeralDHKeySize=2048 -
Djava.protocol.handler.pkgs=org.apache.catalina.webresources -
Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath
/usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar -
Dcatalina.base=/usr/local/tomcat -Dcatalina.home=/usr/local/tomcat -
Djava.io.tmpdir=/usr/local/tomcat/temp org.apache.catalina.startup.Bootstrap start
root 16987 0.0 0.0 112712 968 pts/0 S+ 21:12 0:00 grep --color=auto tomcat
[[email protected] tomcat]#pwd
/usr/local/tomcat
[[email protected] tomcat]#bin/shutdown.sh
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/java/default
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
[[email protected] tomcat]#ss -ntl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:22 *:*
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 128 :::22 :::*
LISTEN 0 100 ::1:25 :::*
[[email protected] tomcat]#useradd -r duanxin
[[email protected] tomcat]#
[[email protected] tomcat]#id duanxin
uid=997(duanxin) gid=995(duanxin) groups=995(duanxin)
[[email protected] tomcat]#su - duanxin -c "/usr/local/tomcat/bin/catalina.sh start"
su: warning: cannot change directory to /home/duanxin: No such file or directory
-bash: /usr/local/tomcat/bin/catalina.sh: Permission denied #權限不夠,因為是用root安裝的
[[email protected] tomcat]#chown -R duanxin.duanxin /usr/local/tomcat/* #給對應的權限
[[email protected] tomcat]#su - duanxin -c "/usr/local/tomcat/bin/catalina.sh start"
su: warning: cannot change directory to /home/duanxin: No such file or directory
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/java/default
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.
[[email protected] tomcat]#ss -tanl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:22 *:*
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 100 :::8009 :::*
LISTEN 0 100 :::8080 :::*
LISTEN 0 128 :::22 :::*
LISTEN 0 100 ::1:25 :::*
LISTEN 0 1 ::ffff:127.0.0.1:8005 :::*
[[email protected] tomcat]#
1.1.3目錄說明
1.1.4配置檔案
1.1.5元件分類
頂級元件
Server,代表整個Tomcat容器
服務類元件
Service,組織Engine和Connector,裡面隻能包含一個Engine
連接配接器元件
Connector(8080 8009),有HTTP、HTTPS、AJP協定的連接配接器
容器類
Engine、Host、Context(路徑映射)都是容器類元件,可以嵌入其它元件,内部配置如何運作應用程式。
内嵌類
可以内嵌到其他元件内,valve、logger、realm、loader、manager等。以logger舉例,在不同容器元件内定義。
叢集類元件
listener、cluster
2.1Tomcat内部組成
由上述元件就構成了Tomcat,如下圖
AJP(Apache Jserv protocol)是一種基于TCP的二進制通訊協定。隻能和apache配合,nginx是沒有的。
核心元件
- Tomcat啟動一個Server程序。可以啟動多個Server,但一般隻啟動一個
-
建立一個Service提供服務。可以建立多個Service,但一般也隻建立一個
每個Service中,是Engine和其連接配接器Connector的關聯配置,可以多個,但是端口别沖突
-
可以為這個Server提供多個連接配接器Connector,這些Connector使用了不同的協定,綁定了不同的
端口。其作用就是處理來自用戶端的不同的連接配接請求或響應
-
Service内部還定義了Engine,引擎才是真正的處理請求的入口,其内部定義多個虛拟主機Host
Engine對請求頭做了分析,将請求發送給相應的虛拟主機
如果沒有比對,資料就發往Engine上的defaultHost預設虛拟主機
Engine上的預設虛拟主機可以修改
- Host定義虛拟主機,虛拟主機有name名稱,通過名稱比對
- Context定義應用程式單獨的路徑映射和配置
<?xml version="1.0" encoding="UTF-8"?>
<Server port="8005" shutdown="SHUTDOWN">
<Service name="Catalina">
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
<Engine name="Catalina" defaultHost="localhost"> #預設主機
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
</Host>
</Engine>
</Service>
</Server>
舉例:
假設來自客戶的請求為:http://localhost:8080/test/index.jsp
浏覽器端的請求被發送到服務端端口8080,Tomcat程序監聽在此端口上。通過偵聽的HTTP/1.1Connector獲得此請求。
Connector把該請求交給它所在的Service的Engine來處理,并等待Engine的響應
Engine獲得請求localhost:8080/test/index.jsp,比對它所有虛拟主機Host
Engine比對到名為localhost的Host。即使比對不到也把請求交給該Host處理,因為該Host被定義為該Engine的預設主機
localhost Host獲得請求/test/index.jsp,比對它所擁有的所有Context
Host比對到路徑為/test的Context
path=/test的Context獲得請求/index.jsp,在它的mapping table中尋找對應的servlet
Context比對到URL PATTERN為*.jsp 的servlet,對應于JspServlet類構造HttpServletRequest對象和
HttpServletResponse對象,作為參數調用JspServlet的doGet或doPost方法。
Context把執行完了之後的HttpServletResponse對象傳回給Host
Host把HttpServletResponse對象傳回給Engine
Engine把HttpServletResponse對象傳回給Connector
Connector把HttpServletResponse對象傳回給浏覽器端
3.1應用部署
3.1.1根目錄
Tomcat中預設網站根目錄是CATALINA_BASE/webapps/
在Tomcat中部署主站應用程式和其他應用程式,和之前WEB服務程式不同。
nginx
假設在nginx中部署2個網站應用eshop、bbs,假設網站根目錄是/var/www/html,那麼部署可以是這樣的。
eshop解壓縮所有檔案放到/var/www/html/目錄下。
bbs的檔案放在/var/www/html/bbs下。
Tomcat
Tomcat中預設網站根目錄是CATALINA_BASE/webapps/
在Tomcat的webapps目錄中,有個非常特殊的目錄ROOT,它就是網站預設根目錄。
将eshop解壓後的檔案放到這個ROOT中。
bbs解壓後檔案都放在CATALINA_BASE/webapps/bbs目錄下。
每一個虛拟主機的目錄都可以使用appBase配置自己的站點目錄,裡面都可以使用ROOT目錄作為主站目錄。
3.1.2JSP WebApp目錄結構
首頁配置:一般指定為index.jsp或index.html
WEB-INF/:目前WebApp的私有資源路徑,通常存儲目前應用使用的web.xml和context.xml配置檔案
META-INF/:類似于WEB-INF
classes/:類檔案,目前webapp需要的類
lib/:目前應用依賴的jar包
3.1.3首頁實驗
預設情況下,/usr/local/tomcat/webapps/ROOT/下添加一個index.html檔案,觀察通路到了什麼?
将/usr/local/tomcat/conf/web.xml中的下面标簽内容(預設頁),複制到/usr/local/tomcat/webapps/ROOT/WEB-INF/web.xml中,如下
[[email protected] ~]#cat /usr/local/tomcat/conf/web.xml #檢視最後幾行
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
#通路是按照以上的順序進行查詢通路
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1"
metadata-complete="true">
<display-name>Welcome to Tomcat</display-name>
<description>
Welcome to Tomcat
</description>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>
[[email protected] ~]#cat /usr/local/tomcat/webapps/ROOT/index.html
<h1>Hello kaivi</h1>
#通路
[[email protected] ~]#curl 192.168.32.7:8080
<h1>Hello kaivi</h1>
3.1.4webapp歸檔格式
.war:WebApp打包
.jar:EJB類打封包件
.rar:資源擴充卡類打封包件
.ear:企業級WebApp打包
傳統應用開發測試後,通常打包為war格式,這種檔案部署到了Tomcat的webapps下,還可以自動展開。
3.1.5部署Deploy
部署:将webapp的源檔案放置到目标目錄,通過web.xml和context.xml檔案中配置的路徑就可以通路該webapp,通過類加載器加載其特有的類和依賴的類到JVM上。
自動部署Auto Deploy:Tomcat發現多了這個應用就把它加載并啟動起來
手動部署
冷部署:将webapp放到指定目錄,才去啟動Tomcat
熱部署:Tomcat服務不停止,需要依賴manager、ant腳本、tcd(tomcat clientdeployer)等工具
反部署undeploy:停止webapp的運作,并從JVM上清除已經加載的類,從Tomcat應用目錄中移除部署的檔案
啟動start:是webapp能夠通路
停止stop:webapp不能通路,不能提供服務,但是JVM并不清除它
3.2.1實驗
1、添加一個檔案,test.jsp
[[email protected] ~]#cat /usr/local/tomcat/webapps/ROOT/test.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>jsp例子</title>
</head>
<body>
後面的内容是伺服器端動态生成字元串,最後拼接在一起 #文本一部分
<%
out.println("hello jsp for kaivi"); #輸出
%>
<br> #換行 ,和上面的文本連接配接一起
<%=request.getRequestURL()%> #請求對象 把URL列印出來 動态的
</body>
</html>
先把test.jsp放到ROOT下去,試試看,通路http://YourIP:8080/test.jsp 。
立即可以看到,這是通過路徑映射找到相應的test.jsp後,轉換成test_jsp.java,在編譯成test_jsp.class。
/usr/local/tomcat/work/Catalina/localhost/ROOT/org/apache/jsp下有轉換後的檔案。
[[email protected] jsp]#pwd
/usr/local/tomcat/work/Catalina/localhost/ROOT/org/apache/jsp
[[email protected] jsp]#ll
total 68
-rw-r----- 1 duanxin duanxin 18182 Jun 5 2019 index_jsp.class
-rw-r----- 1 duanxin duanxin 30078 Jun 5 2019 index_jsp.java
-rw-r----- 1 duanxin duanxin 5796 Jan 17 14:09 test_jsp.class
-rw-r----- 1 duanxin duanxin 5080 Jan 17 14:09 test_jsp.java
2、添加一個應用
模拟部署一個應用 和ROOT同級即可
# cd
常見開發項目目錄組成
# mkdir projects/myapp/{WEB-INF,classes,lib} -pv
mkdir: 已建立目錄 "projects"
mkdir: 已建立目錄 "projects/myapp"
mkdir: 已建立目錄 "projects/myapp/WEB-INF"
mkdir: 已建立目錄 "projects/myapp/classes"
mkdir: 已建立目錄 "projects/myapp/lib"
常見應用首頁,内容就用上面的test.jsp
# vim projects/myapp/index.jsp
[[email protected] ~]#cat projects/myapp/index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>jsp例子</title>
</head>
<body>
後面的内容是伺服器端動态生成字元串,最後拼接在一起
<%
out.println("hello jsp for kaivi and duanxin"); #列印的内容
%>
<br>
<%=request.getRequestURL()%> #列印的URL
</body>
</html>
手動複制項目目錄到webapps目錄下去
# cp -r projects/myapp/ /usr/local/tomcat/webapps/ #注意權限即可
使用http://YourIP:8080/myapp/通路試試看
3.2.2配置詳解
server.xml
<?xml version="1.0" encoding="UTF-8"?>
<Server port="8005" shutdown="SHUTDOWN"> #安全 隻能本機通路 ::ffff:127.0.0.1:8005
<Service name="Catalina">
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
<Engine name="Catalina" defaultHost="localhost">
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
</Host>
</Engine>
</Service>
</Server>
8005是Tomcat的管理端口,預設監聽在127.0.0.1上。SHUTDOWN這個字元串接收到後就會關閉此Server。
# telnet 127.0.0.1 8005
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
SHUTDOWN
[[email protected] ~]#ss -ntl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:22 *:*
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 100 :::8009 :::*
LISTEN 0 100 :::8080 :::*
LISTEN 0 128 :::22 :::*
LISTEN 0 100 ::1:25 :::*
LISTEN 0 1 ::ffff:127.0.0.1:8005 :::*
[[email protected] ~]#telnet 127.0.0.1 8005
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
SHUTDOWN
[[email protected] ~]#ss -ntl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:22 *:*
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 128 :::22 :::*
LISTEN 0 100 ::1:25 :::*
這個管理功能建議禁用,改shutdown為一串猜不出的字元串。
<Server port="8005" shutdown="44ba3c71d57f494992641b258b965f28"> #修改端口或者hash
<GlobalNamingResources>
<!-- Editable user database that can also be used by
UserDatabaseRealm to authenticate users
-->
<Resource name="UserDatabase" auth="Container"
type="org.apache.catalina.UserDatabase"
description="User database that can be updated and saved"
factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
pathname="conf/tomcat-users.xml" />
</GlobalNamingResources>
使用者認證
配置檔案是conf/tomcat-users.xml。
打開tomcat-users.xml,我們需要一個角色manager-gui。可直接到錯誤網頁複制粘貼,隻需要修改對應的賬号以及密碼即可
<tomcat-users xmlns="http://tomcat.apache.org/xml"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-users.xsd"
version="1.0">
<role rolename="manager-gui"/>
<user username="wayne" password="wayne" roles="manager-gui"/> #修改對應的賬号以及密碼
</tomcat-users>
Tomcat啟動加載後,這些内容是常駐記憶體的。如果配置了新的使用者,需要重新開機Tomcat。
通路manager app的時候告訴403,提示中告訴去manager的context.xml中修改
檔案路徑/usr/local/tomcat/webapps/manager/META-INF/context.xml
<?xml version="1.0" encoding="UTF-8"?>
<Context antiResourceLocking="false" privileged="true" >
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" /> #需要增加對應的ip位址段
<Manager sessionAttributeValueClassNameFilter="java\.lang\.
(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.CsrfPreventionF
ilter\$LruCache(?:\$1)?|java\.util\.(?:Linked)?HashMap"/>
</Context>
看正規表達式就知道是本地通路了,由于目前通路位址是192.168.x.x,可以修改正則為
重新開機,再次測試,成功。需要輸入配置的賬号以及密碼
實驗操作
[[email protected] tomcat]#cat conf/tomcat-users.xml |tail -10
<role rolename="role1"/>
<user username="tomcat" password="<must-be-changed>" roles="tomcat"/>
<user username="both" password="<must-be-changed>" roles="tomcat,role1"/>
<user username="role1" password="<must-be-changed>" roles="role1"/>
-->
<role rolename="manager-gui"/>
<user username="kaivi" password="duanxin" roles="manager-gui"/>
</tomcat-users>
但是依舊還不能通路,需要修改提示中告訴去manager的context.xml中修改
[[email protected] tomcat]#pwd
/usr/local/tomcat
[[email protected] tomcat]#vim webapps/manager/META-INF/context.xml
allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1|192.*" /> #增加對應的ipv4位址段
需要重新開機才能通路:
通路Host Manager 依舊通路不了,和上面同樣配置即可
[[email protected] tomcat]#cat conf/tomcat-users.xml |tail -10
<user username="both" password="<must-be-changed>" roles="tomcat,role1"/>
<user username="role1" password="<must-be-changed>" roles="role1"/>
-->
<role rolename="manager-gui"/>
<role rolename="admin-gui"/>
<user username="kaivi" password="duanxin" roles="manager-gui,admin-gui"/> #注意書寫 可以參考上面的格式
</tomcat-users>
[[email protected] tomcat]#pwd
/usr/local/tomcat
[[email protected] tomcat]#vim webapps/host-manager/META-INF/context.xml #這個是host-manager檔案配置
allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1|192.*" />
需要重新開機才能通路:
[[email protected] tomcat]#pwd
/usr/local/tomcat
[[email protected] tomcat]#bin/shutdown.sh
[[email protected] tomcat]#bin/startup.sh
需要輸入認證的賬号以及密碼:
這些操作要在服務啟動之前做好,不然重新開機可能耽誤業務
一般情況下,一個Server執行個體配置一個Service,name屬性相當于該Service的ID。
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" /> #跳轉問題 通過代理找她
連接配接器配置。
redirectPort,如果通路HTTPS協定,自動轉向這個連接配接器。但大多數時候,Tomcat并不會開啟
HTTPS,因為Tomcat往往部署在内部,HTTPS性能較差。
引擎配置。
defaultHost指向内部定義某虛拟主機。預設虛拟主機可以改動,預設localhost。
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
#自動解壓 自動部署 隻需要修改appBase 這個參數 相對路徑是 Catelina
虛拟主機配置。
name必須是主機名,用主機名來比對。
appBase,目前主機的網頁根目錄,是相對于CATALINA_HOME,也可以使用絕對路徑
unpackWARs是否自動解壓war格式
autoDeploy 熱部署,自動加載并運作應用
3.2.3虛拟主機配置實驗
嘗試再配置一個虛拟主機,并将myapp部署到/data/webapps目錄下
常見虛拟主機根目錄
# mkdir /data/webapps -pv
mkdir: 已建立目錄 "/data"
mkdir: 已建立目錄 "/data/webapps"
# cp -r ~/projects/myapp/ /data/webapps/ROOT
# pwd
/usr/local/tomcat
# bin/shutdown.sh
# bin/startup.sh
剛才在虛拟主機中主機名定義node1.magedu.com,是以需要主機在本機手動配置一個域名解析。
如果是windows,修改在C:\Windows\System32\drivers\etc下的hosts檔案,需要管理者權限。
使用http://node1.magedu.com:8080/通路試試看。
也可以在tomcat的host-manager中觀察。
實驗操作:
[[email protected] tomcat]#pwd
/usr/local/tomcat
[[email protected] tomcat]#vim conf/server.xml
<Host name="www.likai.com" appBase="/data/webapps"
unpackWARs="true" autoDeploy="true">
window 10 的hosts DNS域名解析:
C:\Windows\System32\drivers\etc\hosts
192.168.32.7 www.likai.com
3.2.4Context配置
Context作用:
路徑映射
應用獨立配置,例如單獨配置應用日志、單獨配置應用通路控制
path指的是通路的路徑
docBase,可以是絕對路徑,也可以是相對路徑(相對于Host的appBase)
reloadable,true表示如果WEB-INF/classes或META-INF/lib目錄下.class檔案有改動,就會将WEB應用重新加載,性能消耗很大。生成環境中,會使用false來禁用。
将~/projects/myapp/下面的項目檔案複制到/data/下
# cp -r ~/projects/myapp /data/myappv1
# cd /data
# ln -sv myappv1 test
可以修改一下index.jsp好差別一下。
Tomcat的配置檔案server.xml中修改如下
<Host name="node1.magedu.com" appBase="/data/webapps" unpackWARs="true" autoDeploy="true" >
<Context path="/test" docBase="/data/test" reloadable="false" />
</Host>
使用http://node1.magedu.com:8080/test/
注意:這裡特别使用了軟連結,原因就是以後版本更新,需要将軟連結指向myappv2,重新開機Tomcat。
如果新版上線後,出現問題,重新修改軟連結到上一個版本的目錄,并重新開機,就可以實作復原。
實驗操作:
[[email protected] ~]#cp projects/myapp/ /data/myappv1 -r
[[email protected] ~]#cd /data/
[[email protected] data]#ln -sv myappv1/ test
‘test’ -> ‘myappv1/’
[[email protected] data]#ll
drwxr-xr-x 5 root root 64 Jan 17 16:02 myappv1
lrwxrwxrwx 1 root root 8 Jan 17 16:02 test -> myappv1/
drwxr-xr-x 3 root root 18 Jan 17 15:45 webapps
[[email protected] tomcat]#pwd
/usr/local/tomcat
[[email protected] tomcat]#vim conf/server.xml
[[email protected] tomcat]#cat conf/server.xml |tail -10
</Host>
<Host name="www.likai.com" appBase="/data/webapps"
unpackWARs="true" autoDeploy="true">
<Context path="/test" docBase="/data/test" reloadable="false" /> #增加路徑
</Host>
</Engine>
</Service>
</Server>
重新開機通路即可
[[email protected]centos7mini tomcat]#pwd
/usr/local/tomcat
[[email protected] tomcat]#bin/shutdown.sh
[[email protected] tomcat]#bin/startup.sh
隻能通過域名通路test:
4.1常見部署方式
standalone模式,Tomcat單獨運作,直接接受使用者的請求,不推薦。
反向代理,單機運作,提供了一個Nginx作為反向代理,可以做到靜态由nginx提供響應,動态jsp代理給Tomcat
LNMT:Linux + Nginx + MySQL + Tomcat
LAMT:Linux + Apache(Httpd)+ MySQL + Tomcat
前置一台Nginx,給多台Tomcat執行個體做反向代理和負載均衡排程,Tomcat上部署的純動态頁面更适合
LNMT:Linux + Nginx + MySQL + Tomcat
多級代理
LNNMT:Linux + Nginx + Nginx + MySQL + Tomcat
4.1.1Nginx和Tomcat實踐
nginx安裝
從epel源安裝nginx
# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
# yum install nginx -y
# cd /etc/nginx
# vim nginx.conf
# nginx -t
全部反向代理測試
# 全部反向代理測試
location / {
proxy_pass http://127.0.0.1:8080; # 不管什麼請求,都會通路後面的localhost虛拟主機
}
http://192.168.142.151/或者http://www.likai.com/全部代理給了自定義的虛拟主機
注意:www.likai.com需要配置解析,可以通過nginx -t測試。
# 全部反向代理測試
location / {
# proxy_pass http://127.0.0.1:8080; # 不管什麼請求,都會通路後面的localhost虛拟主機
proxy_pass http://www.likai.com:8080; # 修改伺服器的/etc/hosts
}
動靜分離代理
location / {
root /data/webapps/ROOT;
index index.html;
}
# ~* 不區分大小寫
location ~* \.(jsp|do)$ {
proxy_pass http://www.likai.com:8080; # /etc/hosts
}
在/data/webapps/ROOT目錄下增加一個index.html。
http://192.168.32.7/和http://192.168.32.17/index.jsp測試一下看看。
但是實際上Tomcat不太适合做動靜分離,用它來管理程式的圖檔不好做動靜分離部署。
實驗操作:
[[email protected] ~]#vim /etc/nginx/nginx.conf
location / {
# proxy_pass http://127.0.0.1:8080;
index index.html; #靜态頁面
root /data/webapps/ROOT;
}
location ~* \.(jsp|do)$ { #動态頁面
proxy_pass http://www.likai.com:8080;
}
[[email protected] ROOT]#pwd
/data/webapps/ROOT
[[email protected] ROOT]#vim index.html
[[email protected] ROOT]#cat index.html
HELLO nginx ~~~
4.1.2應用管理
# 全部反向代理
location / {
proxy_pass http://127.0.0.1:8080; # 不管什麼請求,都會通路後面的localhost虛拟主機
}
點選Tomcat首頁的右上角的“Manager App”按鈕,彈出登入對話框。
管理界面
Applications 應用程式管理,可以啟動、停止、重加載、反部署、清理過期session
Deploy 可以熱部署,也可以部署war檔案。
點選Tomcat首頁的右上角的“Manager App”按鈕,彈出登入對話框。
Host Manager虛拟主機管理
配置如下
<tomcat-users xmlns="http://tomcat.apache.org/xml"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-users.xsd"
version="1.0">
<role rolename="manager-gui"/>
<role rolename="admin-gui" />
<user username="wayne" password="wayne" roles="manager-gui,admin-gui"/>
</tomcat-users>
重新開機Tomcat,點選“Host Manager”按鈕
可以新增虛拟主機。
4.1.3httpd和Tomcat實踐
# yum install httpd -y
# httpd -M
# httpd -M | grep proxy
proxy_module (shared)
proxy_ajp_module (shared)
proxy_balancer_module (shared)
proxy_http_module (shared)
proxy_fcgi_module (shared)
proxy_fdpass_module (shared)
proxy_ftp_module (shared)
proxy_http_module (shared)
proxy_scgi_module (shared)
proxy_wstunnel_module (shared)
httpd配置
proxy_http_module子產品代理配置
<VirtualHost *:80> #80端口 就代理
ServerName node1.magedu.com
ProxyRequests Off
ProxyVia On
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:8080/ #代理去哪裡
ProxyPassReverse / http://127.0.0.1:8080/
</VirtualHost>
ProxyRequests:Off關閉正向代理。
ProxyPass:反向代理指令
ProxyPassReverse:保留代理的response頭不重寫(個别除外)
ProxyPreserveHost:On開啟。讓代理保留原請求的Host首部
ProxyVia:On開啟。代理的請求響應時提供一個response的via首部
# vim /etc/httpd/conf.d/http-tomcat.conf
# httpd -t
# systemctl start httpd
# /usr/local/tomcat/bin/startup.sh
http://192.168.142.151/
http://node1.magedu.com/
http://node1.magedu.com/index.jsp
實驗操作:
[[email protected] tomcat]#cat /etc/httpd/conf.d/tomcat.conf
<VirtualHost *:80>
ServerName www.likai.com
ProxyRequests Off
ProxyVia On
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:8080/
ProxyPassReverse / http://127.0.0.1:8080/
</VirtualHost>
[[email protected] tomcat]#httpd -t
Syntax OK
systemctl start httpd
這個的原因是因為httpd配置DocumentRoot沒有修改
以上3個URL看到了不同的頁面,說明ProxyPreserveHost On 起了作用。
設定ProxyPreserveHost Off 再看效果,說明什麼?
這個會導緻到預設的主機上去,進而不會代理到自己定義的虛拟主機上面
proxy_ajp_module子產品代理配置
<VirtualHost *:80>
ServerName node1.magedu.com
ProxyRequests Off
ProxyVia On
ProxyPreserveHost On
ProxyPass / ajp://127.0.0.1:8009/ #ajp協定修改 後面的端口要指到8009上面去 二進制協定
</VirtualHost>
檢視Server Status可以看到确實使用的是ajp連接配接了。
相對來講,AJP協定基于二進制比使用HTTP協定的連接配接器效率高些。
網站架構不是一天建成的,都是演化來的。不是最新最時髦的架構,而是最合适的,能駕馭的
了、成本可控的架構。
實驗操作:
[[email protected] tomcat]#vim /etc/httpd/conf.d/tomcat.conf
<VirtualHost *:80>
ServerName www.likai.com
ProxyRequests Off
ProxyVia On
ProxyPreserveHost On
ProxyPass / ajp://127.0.0.1:8009/
</VirtualHost>
[[email protected] tomcat]#httpd -t
Syntax OK
[[email protected] tomcat]#systemctl reload httpd