tomcat企業級Web應用服務器配置與實戰
環境背景:公司業務經過長期發展,有了很大突破,已經實現盈利,現公司要求加強技術架構應用功能和安全性以及開始向企業應用、移動APP等領域延伸,此時原來開發web服務的php語言已經不適應新的場景,需要上java技術架構,現要求你根據公司需要,實現基於java平台的web應用服務選型、搭建、實現和應用,此時你如何選擇?
實戰一:在linux上安裝tomcat
1、下載安裝java所需要的環境和開發工具包
(1)Java 所需要的環境和開發工具包介紹
JRE: Java Runtime Environment
JDK:Java Development Kit JRE
JRE顧名思義是java運行時環境,包含了java虛擬機,java基礎類庫。是使用java語言編寫的程序運行所需要的軟件環境,是提供給想運行java程序的用戶使用的。
JDK顧名思義是java開發工具包,是程序員使用java語言編寫java程序所需的開發工具包,是提供給程序員使用的。JDK包含了JRE,同時還包含了編譯java源碼的編譯器javac,還包含了很多java程序調試和分析的工具:jconsole,jvisualvm等工具軟件,還包含了java程序編寫所需的文檔和demo例子程序。如果你需要運行java程序,只需安裝JRE就可以了。如果你需要編寫java程序,需要安裝JDK。JRE根據不同操作系統(如:windows,linux等)和不同JRE提供商(IBM,ORACLE等)有很多版本,最常用的是Oracle公司收購SUN公司的JRE版本。
(2)安裝相應版本的rpm包 jdk-VERSION-OS-ARCH.rpm(centos自帶的jdk包)
[root@centos-7 ~]# yum install java-1.8.0-openjdk -y
(3)使用Oracle官網的JDK 8的rpm安裝
官方下載JDK地址:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
[root@centos-7 ~]# yun install jdk-8u211-linux-x64.rpm -y
java配置全局
[root@centos-7 ~]# vim /etc/profile.d/jdk.sh export JAVA_HOME=/usr/java/default export PATH=$JAVA_HOME/bin:$PATH [root@centos-7 ~]# . /etc/profile.d/jdk.sh
查看jdk版本
[root@centos-7 ~]# java -version java version "1.8.0_211" Java(TM) SE Runtime Environment (build 1.8.0_211-b12) Java HotSpot(TM) 64-Bit Server VM (build 25.211-b12, mixed mode)
2、下載安裝tomcat
方法一:二進制安裝(推薦)
(1)從官網下載tomcat二進制安裝包 http://tomcat.apache.org/
下載路徑:https://archive.apache.org/dist/tomcat/
(2)解包,設置目錄
① 解包
[root@centos-7 ~]# tar xvf apache-tomcat-8.5.42.tar.gz -C /usr/local
② 為了方便管理,設置軟連接,若以后換版本了,可以很容易切換
[root@centos-7 local]# ln -s /usr/local/apache-tomcat-8.5.42/ /usr/local/tomcat
(3)啟動tomcat服務
[root@centos-7 bin]# cd /usr/local/tomcat/bin #切換到bin目錄下 [root@centos-7 bin]# ./startup.sh #啟動tomcat服務 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. [root@centos-7 bin]# ss -nlt #查看此時的8080端口是否打開 State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 100 127.0.0.1:25 *:* LISTEN 0 32 192.168.43.100:1194 *:* LISTEN 0 128 *:22 *:* LISTEN 0 100 [::1]:25 [::]:* LISTEN 0 1 [::ffff:127.0.0.1]:8005 [::]:* LISTEN 0 100 [::]:8009 [::]:* LISTEN 0 100 [::]:8080 [::]:* LISTEN 0 128 [::]:22 [::]:*
另外一種啟動tomcat服務的方法:
#cd /usr/local/tomcat/bin #切換到此目錄下啟動tomcata服務 # ./catalina.sh --help [root@centos-7 bin]# ./catalina.sh version #查看此時的版本 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 Server version: Apache Tomcat/8.5.42 Server built: Jun 4 2019 20:29:04 UTC Server number: 8.5.42.0 OS Name: Linux OS Version: 3.10.0-1062.el7.x86_64 Architecture: amd64 JVM Version: 1.8.0_211-b12 JVM Vendor: Oracle Corporation # ./catalina.sh start #啟動tomcata服務 # ./catalina.sh stop #停止tomcata服務
(4)為了tomcat服務安全起見,最好不要用root用戶登錄,防止被破解之后存在安全隱患,建議自己新建一個普通用戶進行登錄
[root@centos-7 bin]# useradd -r java #創建一個系統賬號,此時就沒有家目錄 [root@centos-7 ~]# chown -R java.java /usr/local/tomcat/ #將tomcat目錄下的文件所有者和所屬組都進行修改 [root@centos-7 ~]# su - java -c /usr/local/tomcat/bin/startup.sh #以java用戶形式進行啟動tomcat服務
(5)查看此時啟動的服務是以java用戶進行啟動的
方法二:yum安裝tomcat包
(1)yum安裝tomcat包(版本較低)
# yum install tomcat -y #安裝tomcat主程序 # yum install -y tomcat-admin-webapps tomcat-webapps #安裝tomcat對應的頁面
(2)啟動tomcat服務
[root@centos-7 ~]# systemctl start tomcat
(3)查看端口,默認是8080端口
查看此時訪問的tomcat頁面:
在默認主目錄下添加一個文件此,優先級順序是index.html、index.htm、index.jsp,由大到小排序:
[root@centos-7 ROOT]#cd /usr/share/tomcat/webapps/ROOT #主站點程序都放在此目錄下 [root@centos-7 ROOT]# cat index.html <h>hello!</>
啟動tomcat服務:systemctl start tomcat
查看訪問頁面
想要看到index.jsp頁面,將URL路徑補全即可,此時點開jsp結尾的網頁,會顯示比較慢,那么訪問網頁慢的原因是什么呢?
答:是因為此時的jsp頁面需要轉換為二進制的字節碼,再將二進制的字節碼轉換為.class后綴的文件,,最后才會顯示網頁,當第二次點擊時,就不再需要jsp文件;
需要解決第一次點擊慢的過程,需要一個執行第一次點擊網頁的自動化運行腳本,會為自己將所有的鏈接都去點擊一遍。
3、目錄結構
編譯的二進制tomcat文件,默認訪問網頁的路徑:/usr/local/tomcat/webapps/ROOT/
4、配置文件
5、組件分類
頂級組件
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/AJP等協議的連接,一個Connter只屬於一個Engine |
Service | 用來組織Connter和Engine之間的關系 |
Engine | 響應並處理用戶請求。一個引擎可以綁定多個Connter。 |
Host | 虛擬主機 |
Context | 應用的上下文,配置路徑映射path=>directory |
AJP(Apache Jserv protocol)是一種基於TCP的二進制通訊協議。
核心組件
(1)Tomcat啟動一個Server進程。可以啟動多個Server,但一般只啟動一個。
(2)創建一個Service提供服務。可以創建多個Service,但一般也只創建一個。
- 每個Service中,是Engine和其連接器Connector的關聯配置
(3)可以為這個Server提供多個連接器Connector,這些Connector使用了不同的協議,綁定了不同的端口。其作用就是處理來自客戶端的不同的連接請求或響應。
(4)Service內部還定義了Engine,引擎才是真正的處理請求的入口,其內部定義多個虛擬主機Host。
- Engine對請求頭做了分析,將請求發送給相應的虛擬主機
- 如果沒有匹配,數據就發往Engine上的defaultHost缺省虛擬主機
- Engine上的缺省虛擬主機可以修改
(5)Host定義虛擬主機,虛擬主機有name名稱,通過名稱匹配
(6)Context定義應用程序單獨的路徑映射和配置
舉例:
假設來自客戶的請求為: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,Context里邊可以定義不同的應用程序,交給這些應用程序去處理,最后拿到響應,響應報文直接通過connect返回給客戶端。
(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/(/usr/local/tomcat/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目錄作為主站目錄。
JSP WebApp目錄結構
- 主頁配置:一般指定為index.jsp或index.html
- WEB-INF/:當前WebApp的私有資源路徑,通常存儲當前應用使用的web.xml和context.xml配置文件
- META-INF/:類似於WEB-INF
- classes/:類文件,當前webapp需要的類
- lib/:當前應用依賴的jar包
實驗
默認情況下,/usr/local/tomcat/webapps/ROOT/下添加一個index.html文件,觀察訪問到了什么?
將/usr/local/tomcat/conf/web.xml中的下面<welcome-file-list>標簽內容(默認頁),復制到/usr/local/tomcat/webapps/ROOT/WEB-INF/web.xml中,如下
<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> #將jsp后綴的文件放在最上面 <welcome-file>index.htm</welcome-file> <welcome-file>index.html</welcome-file> #將html后綴文件放在最后面 </welcome-file-list> </web-app>
修改完以上配置文件,需要重啟tomcata服務,默認訪問網站的優先級是:html、htm、jsp后綴的文件,所以將jsp文件放在最前面,此時就是個缺省路徑,默認訪問jsp網頁,不需要指定jsp的URL全路徑,查看訪問網頁效果
webapp歸檔格式
- .war:WebApp打包
- .jar:EJB類打包文件
- .rar:資源適配器類打包文件
- .ear:企業級WebApp打包
傳統,應用開發測試后,通常打包為war格式,這種文件部署到了Tomcat的webapps下,還可以自動展開。
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
部署Deploy
1、部署:將webapp的源文件放置到目標目錄,通過web.xml和context.xml文件中配置的路徑就可以訪問該webapps,通過類加載器加載其特有的類和依賴的類到JVM上,生產中我們用的是冷部署方式。
(1)自動部署Auto Deploy:Tomcat發現多了這個應用就把它加載並啟動起來
(2)手動部署
冷部署:將webapp放到指定目錄,才去啟動Tomcat 熱部署:Tomcat服務不停止,需要依賴工具manager、ant腳本、tcd(tomcat client deployer)等
2、反部署undeploy:停止webapp的運行,並從JVM上清除已經加載的類,從Tomcat實例上卸載掉webapp
3、啟動start:是webapp能夠訪問
4、停止stop:webapp不能訪問,不能提供服務,但是JVM並不清除它
實驗
1、先創建一個存放頁面的目錄
[root@centos-7 ~]# mkdir /projects/myapp/{WEB-INF,classes,lib} -pv mkdir: created directory ‘/projects’ mkdir: created directory ‘/projects/myapp’ mkdir: created directory ‘/projects/myapp/WEB-INF’ mkdir: created directory ‘/projects/myapp/classes’ mkdir: created directory ‘/projects/myapp/lib’
2、在新建的/projects/myapp/目錄下新建一個index.jsp文件。
vim /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> myapp-index.jsp 后面的內容是服務器端動態生成字符串,最后拼接在一起 #顯示的效果是這行內容 <% out.println("hello jsp"); %> </body> </html>
3、將新建的index.jsp文件存放在/usr/local/tomcat/webapps目錄下:
[root@centos-7 ~]# cp -r /projects/myapp/ /usr/local/tomcat/webapps/
4、查看網頁顯示效果:
配置詳解
vim /usr/local/tomcat/conf/service.xml
<?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" / <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> </Host> </Engine> </Service> </Server>>
SHUTDOWN詳解:
<Server port="8005" shutdown="SHUTDOWN">
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
為安全起見:這個管理功能建議禁用,改shutdown為一串猜不出的字符串。
<Server port="8005" shutdown="44ba3c71d57f494992641b258b965f28">
創建一個用戶管理界面賬號
創建manager-gui角色
用戶認證,配置文件是/usr/local/tomcat/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"/> #主要加入此行,添加的用戶名為tomcat <user username="tomcat" password="tomcat" roles="manager-gui"/> #主要加入此行,添加的用戶密碼是tomcat </tomcat-users>
Tomcat啟動加載后,這些內容是常駐內存的。如果配置了新的用戶,需要重啟Tomcat。
訪問192.168.7.100:8080/manager/管理頁面時,此時就會報403,身份驗證錯誤,但是提示中告訴去manager的context.xml中修改
修改配置文件路徑:/usr/local/tomcat/webapps/manager/META-INF/context.xml:
可以在后面追加一個全路徑的IP地址,或者是直接192.*即可:
allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1|192\.168\.\d+\.\d+"
重新啟動tomcat服務:
# /usr/local/tomcat/bin/shutdown.sh # /usr/local/tomcat/bin/start.sh
再訪問網頁時,就會顯示用戶登錄:
輸入新建的賬號和密碼,此時就能訪問管理界面:
用戶賬號:tomcat
用戶密碼:tomcat
創建admin-gui角色
1、如法炮制,與上面類似,但是我們需要進入到host-manager文件中進行修改里邊的conttext.xml文件,在配置文件中添加本地的IP地址的正則表達式,允許本地的IP地址進行管理
# vim /usr/local/tomcat/webapps/host-manager/META-INF/context.xml # allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1|192.*" />
修改配置文件,添加admin-gui新角色:
[root@centos-7 conf]# vim /usr/local/tomcat/conf/tomcat-users.xml <role rolename="admin-gui"/> #添加一個角色admin-gui <role rolename="manager-gui"/> <user username="tomcat" password="tomcat" roles="manager-gui,admin-gui"/> #逗號后面添加admin-gui
重啟tomcat服務:
[root@centos-7 tomcat]# bin/shutdown.sh [root@centos-7 tomcat]# bin/startup.sh
查看此時的端口是否打開:8009和8080端口
此時已經可以登錄到host-manager管理界面:
service配置:
vim /usr/local/tomcat/conf/server.xml文件中查看此時的service服務名稱:
一般情況下,一個Server實例配置一個Service,name屬性相當於該Service的ID。
<Service name="Catalina">
連接器配置:
redirectPort,如果訪問HTTPS協議,自動轉向這個連接器。但大多數時候,Tomcat並不會開啟HTTPS,因為Tomcat往往部署在內部,HTTPS性能較差。
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
引擎配置:
<Engine name="Catalina" defaultHost="localhost">
defaultHost指向內部定義某虛擬主機。缺省虛擬主機可以改動,默認localhost。
虛擬主機配置:
name必須是主機名,用主機名來匹配。
appBase,當期主機的網頁根目錄,相對於CATALINA_HOME,也可以使用絕對路徑
unpackWARs是否自動解壓war格式
autoDeploy 熱部署,自動加載並運行應用
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
虛擬主機配置實驗
1、修改主配置文件,添加域名解析的目錄
[root@centos-7 ROOT]# vim /usr/local/tomcat/conf/server.xml </Host> <Host name="node1.baidu.com" appBase="/data/webapps/" unpackWARs="True" autoDeploy="false" /> #指定域名和要訪問的文件路徑 </Engine>
2、創建一個訪問文件的目錄,並在指定的目錄下創建ROOT目錄,將上面創建的myapp目錄文件復制過來:
[root@centos-7 ROOT]# mkdir /data/webapps/ -p [root@centos-7 webapps]# cp -r /usr/local/tomcat/webapps/myapp/ /data/webapps/ROOT
3、修改/data/webapps/ROOT目錄下的文件,修改為自己要訪問到的頁面:
<%@ 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> node1.baidu.com-index.jsp 后面的內容是服務器端動態生成字符串,最后拼接在一起 #修改此處的域名地址 <% out.println("hello jsp"); %> </body> </html>
4、重啟tomcat服務:
[root@centos-7 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 [root@centos-7 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.
5、在本地hosts配置文件中將IP地址進行域名解析為node1.baidu.net:C:\Windows\System32\drivers\etc目錄下修改
6、訪問網頁進行測試:
Context配置
Context作用:
- 路徑映射
- 應用獨立配置,例如單獨配置應用日志、單獨配置應用訪問控制
<Context path="/test" docBase="/data/test" reloadable="" />
1、path指的是訪問的路徑
2、docBase,可以是絕對路徑,也可以是相對路徑(相對於Host的appBase)
3、reloadable,true表示如果WEB-INF/classes或META-INF/lib目錄下.class文件有改動,就會將WEB應用重新加載。
4、生成環境中,會使用false來禁用。
實驗:
1、將前面創建好的myapp目錄復制到data目錄下並起名為myappv1,並且創建一個軟連接
[root@centos-7 data]# cp -r /usr/local/tomcat/webapps/myapp /data/myappv1 [root@centos-7 data]# ln -s myappv1/ test
2、修改/data/myappv1中的index.jsp配置文件
# vim /data/myappv1/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> myappv1-test.jsp 后面的內容是服務器端動態生成字符串,最后拼接在一起 #修改問網頁要顯示的頁面 <% out.println("hello jsp"); %> </body> </html>
3、修改tomcat配置文件
vim /usr/local/tomcat/conf/server.xml
</Host> <Host name="node1.baidu.com" appBase="/data/webapps/" unpackWARs="True" autoDeploy="false" > #創建在配置文件下面就不能封口 <Context path="/test" docBase="/data/test" reloadable="" /> #指定當前要訪問的文件目錄路徑,寫完需要封口/ </Host> </Engine> </Service> </Server>
訪問網頁測試:http://node1.baidu.com:8080/test/
注意:這里特別使用了軟鏈接,原因就是以后版本升級,需要將軟鏈接指向myappv1,重啟Tomcat。如果新版上
線后,出現問題,重新修改軟鏈接到上一個版本的目錄,並重啟,就可以實現回滾。