Tomcat基本使用

安裝

jdk安裝

jdk下載地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html

1)解壓並配置環境變量
#cd /usr/local/src/
#tar xf jdk-8u231-linux-x64.tar.gz
#ln -s jdk1.8.0_231/ jdk
#cat > /etc/profile.d/jdk.sh << EOF
export JAVA_HOME=/usr/local/src/jdk
export CLASSPATH=.:\$JAVA_HOME/jre/lib/rt.jar:\$JAVA_HOME/lib/dt.jar:\$JAVA_HOME/lib/tools.jar
export PATH=\$PATH:\$JAVA_HOME/bin
EOF
#source /etc/profile.d/jdk.sh

2)查看jdk版本
#java -version
java version "1.8.0_231"
Java(TM) SE Runtime Environment (build 1.8.0_231-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.231-b11, mixed mode)

tomcat安裝

安裝包下載地址:https://archive.apache.org/dist/tomcat/tomcat-8/v8.5.42/bin/apache-tomcat-8.5.42.tar.gz

1)解壓併爲Tomcat作軟鏈接
#cd /usr/local/src/
#tar xf apache-tomcat-8.5.42.tar.gz
#ln -s apache-tomcat-8.5.42 tomcat

2)啓動和查看Tomcat狀態
#cd tomcat/bin/
#./startup.sh 
Using CATALINA_BASE:   /usr/local/src/tomcat
Using CATALINA_HOME:   /usr/local/src/tomcat
Using CATALINA_TMPDIR: /usr/local/src/tomcat/temp
Using JRE_HOME:        /usr/local/src/jdk
Using CLASSPATH:       /usr/local/src/tomcat/bin/bootstrap.jar:/usr/local/src/tomcat/bin/tomcat-juli.jar
Tomcat started.
#ps -ef |grep tomcat|grep -v grep
root       6377      1  2 21:19 pts/0    00:00:05 /usr/local/src/jdk/bin/java -Djava.util.logging.config.file=/usr/local/src/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/src/tomcat/bin/bootstrap.jar:/usr/local/src/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/src/tomcat -Dcatalina.home=/usr/local/src/tomcat -Djava.io.tmpdir=/usr/local/src/tomcat/temp org.apache.catalina.startup.Bootstrap start

上面的操做,啓動身份是root,若是要使用普通用戶啓動可使用下面的這種方法
#useradd -r java
#chown -R java.java /usr/local/src/tomcat/
#su - java -c '/usr/local/src/tomcat/bin/startup.sh'
su: warning: cannot change directory to /home/java: No such file or directory
Using CATALINA_BASE:   /usr/local/src/tomcat
Using CATALINA_HOME:   /usr/local/src/tomcat
Using CATALINA_TMPDIR: /usr/local/src/tomcat/temp
Using JRE_HOME:        /usr/local/src/jdk
Using CLASSPATH:       /usr/local/src/tomcat/bin/bootstrap.jar:/usr/local/src/tomcat/bin/tomcat-juli.jar
Tomcat started.
#ps aux |grep tomcat|grep -v grep
java       6529  4.5  4.7 2995916 87744 ?       Sl   21:25   0:02 /usr/local/src/jdk/bin/java -Djava.util.logging.config.file=/usr/local/src/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/src/tomcat/bin/bootstrap.jar:/usr/local/src/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/src/tomcat -Dcatalina.home=/usr/local/src/tomcat -Djava.io.tmpdir=/usr/local/src/tomcat/temp org.apache.catalina.startup.Bootstrap start

使用systemd管理Tomcat服務

1.首先,須要爲tomcat配置pid
#sed -i '/[ -z "\$CATALINA_BASE" ] && CATALINA_BASE="\$CATALINA_HOME"/a\CATALINA_PID="$CATALINA_BASE/tomcat.pid"' /usr/local/src/tomcat/bin/catalina.sh
配置後結果以下
141 # Copy CATALINA_BASE from CATALINA_HOME if not already set
142 [ -z "$CATALINA_BASE" ] && CATALINA_BASE="$CATALINA_HOME"
143 CATALINA_PID="$CATALINA_BASE/tomcat.pid" # 設置pid。必定要加在CATALINA_BASE定義後面,要否則pid會生成到/下面

2.建立服務腳本
#cat > /usr/lib/systemd/system/tomcat.service << EOF
[Unit]
Description=Apache Tomcat Web Application Container
After=syslog.target network.target

[Service]
Type=forking
Environment="JAVA_HOME=/usr/local/src/jdk"
PIDFile=/usr/local/src/tomcat/tomcat.pid
ExecStart=/usr/local/src/tomcat/bin/startup.sh
ExecReload=/bin/kill -s HUP \$MAINPID
ExecStop=/bin/kill -s QUIT \$MAINPID
PrivateTmp=true
SuccessExitStatus=143                                                   

[Install]
WantedBy=multi-user.target
EOF

3.啓動Tomcat並設置爲開機自啓動,和查看狀態
#systemctl enable --now tomcat && systemctl status tomcat
Created symlink from /etc/systemd/system/multi-user.target.wants/tomcat.service to /usr/lib/systemd/system/tomcat.service.
● tomcat.service - Apache Tomcat Web Application Container
   Loaded: loaded (/usr/lib/systemd/system/tomcat.service; enabled; vendor preset: disabled)
   Active: active (running) since Wed 2020-01-15 17:23:21 CST; 7ms ago
  Process: 9615 ExecStart=/usr/local/src/tomcat/bin/startup.sh (code=exited, status=0/SUCCESS)
 Main PID: 9623 (java)
   CGroup: /system.slice/tomcat.service
           └─9623 /usr/local/src/jdk/bin/java -Djava.util.logging.config.file=/usr/local/src/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli....

Jan 15 17:23:21 CentOS7-01.localdomain systemd[1]: Starting Apache Tomcat Web Application Container...
Jan 15 17:23:21 CentOS7-01.localdomain startup.sh[9615]: Tomcat started.
Jan 15 17:23:21 CentOS7-01.localdomain systemd[1]: Started Apache Tomcat Web Application Container.

使用systemd管理Tomcat服務遇到的問題及解決辦法

1.執行systemctl start tomcat命令
#systemctl start tomcat
Job for tomcat.service failed because the control process exited with error code. See "systemctl status tomcat.service" and "journalctl -xe" for details.
#journalctl -xe
......
startup.sh[10247]: Neither the JAVA_HOME nor the JRE_HOME environment variable is defined
startup.sh[10247]: At least one of these environment variable is needed to run this program
......
若是在tomcat的service文件中沒有設置jdk的環境變量,就會在啓動tomcat的時候報錯,產生以上的錯誤信息,爲解決此問題,須要在service文件中添加以下配置
[Service]
Environment="JAVA_HOME=/usr/local/src/jdk"
注:就算在/etc/profile.d/目錄下單獨配置了jdk環境變量,對於使用systemd管理tomcat服務也是無效的,全部須要在tomcat的service文件中配置。

2.執行systemctl stop tomcat命令
#systemctl stop tomcat
#systemctl status tomcat
● tomcat.service - Apache Tomcat Web Application Container
   Loaded: loaded (/usr/lib/systemd/system/tomcat.service; enabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since Wed 2020-01-15 19:17:27 CST; 2min 21s ago
  Process: 10635 ExecStop=/bin/kill -s QUIT $MAINPID (code=exited, status=0/SUCCESS)
  Process: 10574 ExecStart=/usr/local/src/tomcat/bin/startup.sh (code=exited, status=0/SUCCESS)
 Main PID: 10582 (code=exited, status=143)

Jan 15 19:17:19 CentOS7-01.localdomain systemd[1]: Starting Apache Tomcat Web Application Container...
Jan 15 19:17:19 CentOS7-01.localdomain startup.sh[10574]: Tomcat started.
Jan 15 19:17:19 CentOS7-01.localdomain systemd[1]: Started Apache Tomcat Web Application Container.
Jan 15 19:17:27 CentOS7-01.localdomain systemd[1]: Stopping Apache Tomcat Web Application Container...
Jan 15 19:17:27 CentOS7-01.localdomain systemd[1]: tomcat.service: main process exited, code=exited, status=143/n/a
Jan 15 19:17:27 CentOS7-01.localdomain systemd[1]: Stopped Apache Tomcat Web Application Container.
Jan 15 19:17:27 CentOS7-01.localdomain systemd[1]: Unit tomcat.service entered failed state.
Jan 15 19:17:27 CentOS7-01.localdomain systemd[1]: tomcat.service failed.

中止tomcat的時候並無報錯,可是查看tomcat的status時,發現tomcat服務進入了失敗的狀態,爲解決此問題,須要在tomcat的service中添加以下配置
[Service]
SuccessExitStatus=143

參考文檔:https://stackoverflow.com/questions/40331741/systemd-tomcat-service-failed-with-no-errors

目錄結構

目錄 說明
bin 服務啓動、中止等相關
conf 配置文件
lib 庫目錄
logs 日誌目錄
webapps 應用程序,應用部署目錄
work jsp編譯後的結果文件

配置文件

文件名 說明
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 日誌系統相關的配置。log4j

組件分類

類別 說明
頂級組件 Server,表明整個Tomcat容器
服務類組件 Service,組織Engine和Connector,裏面只能包含一個Engine
鏈接器組件 Connector,有HTTP、HTTPS、A JP協議的鏈接器
容器類 Engine、Host、Context都是容器類組件,能夠嵌入其它組件,內部配置如何運行應用程序。
內嵌類 能夠內嵌到其餘組件內,valve、logger、realm、loader、manager等。以logger舉例,在不一樣容器組件內定義。
集羣類組件 listener、cluster

內部組成結構

由上述組件就構成了Tomcat,以下圖

Tomcat基本使用

名稱 說明
Server Tomcat運行的進程實例
Connector 負責客戶端的HTTP、HTTPS、A JP等協議的鏈接。一個Connector只屬於某一個Engine
Service 用來組織Engine和Connector的關係
Engine 響應並處理用戶請求。一個引擎上能夠綁定多個Connector
Host 虛擬主機
Context 應用的上下文,配置路徑映射path => directory
AJP(Apache Jserv protocol) 是一種基於TCP的二進制通信協議。

核心組件說明

  • Tomcat啓動一個Server進程。能夠啓動多個Server,但通常只啓動一個
  • 建立一個Service提供服務。能夠建立多個Service,但通常也只建立一個
    • 每一個Service中,是Engine和其鏈接器Connector的關聯配置
  • 能夠爲這個Server提供多個鏈接器Connector,這些Connector使用了不一樣的協議,綁定了不一樣的端口。其做用就是處理來自客戶端的不一樣的鏈接請求或響應
  • Service內部還定義了Engine,引擎纔是真正的處理請求的入口,其內部定義多個虛擬主機Host
    • Engine對請求頭作了分析,將請求發送給相應的虛擬主機
    • 若是沒有匹配,數據就發往Engine上的defaultHost缺省虛擬主機
    • Engine上的缺省虛擬主機能夠修改
  • Host定義虛擬主機,虛擬主機有name名稱,經過名稱匹配
  • Context定義應用程序單獨的路徑映射和配置

Tomcat處理請求的流程

假設來自客戶的請求爲:http://localhost:8080/test/index.jsp
  1)瀏覽器端的請求被髮送到服務端端口8080,Tomcat進程監聽在此端口上。經過偵聽的HTTP/1.1 Connector得到此請求。                  
  2)Connector把該請求交給它所在的Service的Engine來處理,並等待Engine的響應
  3)Engine得到請求localhost:8080/test/index.jsp,匹配它全部虛擬主機Host
  4)Engine匹配到名爲localhost的Host。即便匹配不到也把請求交給該Host處理,由於該Host被定義爲該Engine的默認主機
  5)localhost Host得到請求/test/index.jsp,匹配它所擁有的全部Context
  6)Host匹配到路徑爲/test的Context
  7)path=/test的Context得到請求/index.jsp,在它的mapping table中尋找對應的servlet
  8)Context匹配到URL PATTERN爲*.jsp 的servlet,對應於JspServlet類構造HttpServletRequest對象和HttpServletResponse對象,做爲參數調用JspServlet的doGet或doPost方法。
  9)Context把執行完了以後的HttpServletResponse對象返回給Host
  10)Host把HttpServletResponse對象返回給Engine
  11)Engine把HttpServletResponse對象返回給Connector
  12)Connector把HttpServletResponse對象返回給瀏覽器端

應用部署

根目錄

Tomcat中默認網站根目錄是CATALINA_BASE/webapps/,在Tomcat的webapps目錄中,有個很是特殊的目錄ROOT,它就是網站默認根目錄。
每個虛擬主機的目錄均可以使用appBase配置本身的站點目錄,裏面均可以使用ROOT目錄做爲主站目錄。

JSP WebApp目錄結構

主頁配置:通常指定爲index.jsp或index.html
WEB-INF/:當前WebApp的私有資源路徑,一般存儲當前應用使用的web.xml和context.xml配置文件
META-INF/:相似於WEB-INF
classes/:類文件,當前webapp須要的類
lib/:當前應用依賴的jar包

更改默認主頁文件

默認狀況下,訪問Tomcat的主頁,返回的內容是CATALINA_BASE/webapps/ROOT/index.jsp文件提供的,這裏將在CATALINA_BASE/webapps/ROOT/下添加一個index.html文件,內容以下
#cat /usr/local/src/tomcat/webapps/ROOT/index.html 
tomcat index.html
添加完該文件內容後再訪問Tomcat默認頁,返回結果以下
#curl localhost:8080
tomcat index.html

產生上面結果的緣由是CATALINA_BASE/conf/web.xml文件中的<welcome-file-list>標籤內容(默認頁)所致使的,複製到CATALINA_BASE/webapps/ROOT/WEB-INF/web.xml中,以下

<?xml version="1.0" encoding="UTF-8"?>
<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>

配置修改後,再次訪問首頁,結果以下圖

Tomcat基本使用

從上面的驗證結果能夠發現,Tomcat的默認頁訪問順序是從上往下依次匹配的

webapp歸檔格式

.war:WebApp打包
.jar:EJB類打包文件
.rar:資源適配器類打包文件
.ear:企業級WebApp打包

傳統應用開發測試後,一般打包爲war格式,這種文件部署到了Tomcat的webapps下,還能夠自動展開。

部署Deploy

  • 部署:將webapp的源文件放置到目標目錄,經過web.xml和context.xml文件中配置的路徑就能夠訪問該webapp,經過類加載器加載其特有的類和依賴的類到JVM上。
    • 自動部署Auto Deploy:Tomcat發現多了這個應用就把它加載並啓動起來
    • 手動部署
    • 冷部署:將webapp放到指定目錄,纔去啓動Tomcat
    • 熱部署:Tomcat服務不中止,須要依賴manager、ant腳本、tcd(tomcat client
      deployer)等工具
  • 反部署undeploy:中止webapp的運行,並從JVM上清除已經加載的類,從Tomcat應用目錄中移除部署的文件
  • 啓動start:是webapp可以訪問
  • 中止stop:webapp不能訪問,不能提供服務,可是JVM並不清除它

實驗

1 添加一個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");
%>
<br>
<%=request.getRequestURL()%>
</body>
</html>

把test.jsp放到ROOT下去,而後訪問http://YourIP:8080/test.jsp
當即能夠看到,這是經過路徑映射找到相應的test.jsp後,轉換成test_jsp.java,再編譯成test_jsp.class

CATALINA_BASE/work/Catalina/localhost/ROOT/org/apache/jsp/ 目錄下有轉換後的文件

2 添加一個應用

模擬部署一個應用

常見開發項目目錄組成結構
#mkdir projects/myapp/{WEB-INF,classes,lib} -p
#tree projects/
projects/
└── myapp
    ├── classes
    ├── lib
    └── WEB-INF

4 directories, 0 files

常見應用首頁,內容就用上面的test.jsp
#cp webapps/ROOT/test.jsp projects/myapp/index.jsp

複製項目目錄到webapps目錄下去
#cp -r projects/myapp/ /usr/local/src/tomcat/webapps/

訪問測試http://YourIP:8080/myapp

主配置文件詳解

CATALINA_BASE/conf/server.xml html

1)8005端口

<Server port="8005" shutdown="SHUTDOWN">

該端口是Tomcat的管理端口,默認監聽在127.0.0.1上。SHUTDOWN這個字符串接收到後就會關閉此Server。

#ss -nlt|grep 8080
LISTEN     0      100       [::]:8080                  [::]:*  
#telnet 127.0.0.1 8005
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
SHUTDOWN
Connection closed by foreign host.

這個管理功能建議禁用,將SHUTDOWN改成一串猜不出來的字符串,例如
<Server port="8005" shutdown="4dbbcd8bf182d05bed2b5ef419397b0d">

2)用戶認證

CATALINA_BASE/conf/tomcat-users.xml java

Tomcat基本使用

若是想要使用Manager App,須要一個角色manager-gui,在CATALINA_BASE/conf/tomcat-users.xml配置文件中添加,以下
<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="test" password="test" roles="manager-gui"/>
</tomcat-users>

Tomcat啓動加載後,這些內容是常駐內存的。若是配置了新的用戶,須要重啓Tomcat。訪問Manager App

Tomcat基本使用

訪問manager的時候告訴403,提示中告訴去manager的context.xml中修改,文件路徑CATALINA_BASE/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" />
  <Manager sessionAttributeValueClassNameFilter="java\.lang\.(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.CsrfPreventionFilter\$LruCache(?:\$1)?|java\.util\.(?:Linked)?HashMap"/>
</Context>
從配置文件中能夠看到allow後面的正則表達式寫的是隻容許本地訪問,但我當前的地址是192.168段的,全部須要添加正則表達式以支持訪問,配置後以下
allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1|192\.168\.\d+\.\d+"

重啓後再次訪問測試

Tomcat基本使用

3)Service

<Service name="Catalina">

通常狀況下,一個Server實例配置一個Service,name屬性至關於該Service的ID。

4)鏈接器配置

<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443" />

redirectPort,若是訪問HTTPS協議,自動轉向這個鏈接器。但大多數時候,Tomcat並不會開啓HTTPS,由於Tomcat每每部署在內部,HTTPS性能較差。

5)引擎配置

<Engine name="Catalina" defaultHost="localhost">

defaultHost指向內部定義某虛擬主機。缺省虛擬主機能夠改動,默認localhost。

6) 虛擬主機配置

<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">

配置說明:
name #必須是主機名,用主機名來匹配。
appBase #當前主機的網頁根目錄,是相對於CATALINA_HOME,也可使用絕對路徑
unpackWARs #是否自動解壓war格式
autoDeploy #熱部署,自動加載並運行應用

虛擬主機配置實驗

嘗試再配置一個虛擬主機,並將myapp部署到/data/webapps目錄下

<Host name="www.hechunping.com" appBase="/data/webapps/" unpackWARs="true"
autoDeploy="false" />

#mkdir /data/webapps -p
#cp -r projects/myapp/ /data/webapps/ROOT
剛纔在虛擬主機中主機名定義www.hechunping.com,全部須要在宿主機的hosts文件中添加域名解析

訪問測試

Tomcat基本使用

Context配置

Context做用

  • 路徑映射
  • 應用獨立配置,例如單獨配置應用日誌、單獨配置應用訪問控制
<Context path="/test" docBase="/data/test" reloadable="false" />

配置說明:
path #指的是訪問的路徑
docBase #能夠是絕對路徑,也能夠是相對路徑(相對於Host的appBase)
reloadable #true表示若是WEB-INF/classes或META-INF/lib目錄下.class文件有改動,就會將WEB應用從新加載,性能消耗很大。生產環境中,會使用false來禁用。

將projects/myapp下的項目文件複製到/data/下
#cp -r projects/myapp/ /data/myapp_v1
#cd /data/
#ln -s myapp_v1/ test

在Tomcat的主配置文件server.xml中添加以下內容
<Host name="www.hechunping.com"  appBase="/data/webapps"                          unpackWARs="true" autoDeploy="true">
  <Context path="/test" docBase="/data/test" reloadable="false" />
</Host>

訪問測試http://www.hechunping.com:8080/test/

Tomcat基本使用

注意:這裏特別使用了軟連接,緣由就是之後版本升級,須要將軟連接指向myapp_v2,重啓Tomcat。若是新版上線後,出現問題,從新修改軟連接到上一個版本的目錄,並重啓,就能夠實現回滾。
相關文章
相關標籤/搜索