springboot項目內置Tomcat,直接打成jar包在dos下運行即可,但有時我們需要用war包以非內嵌Tomcat的方式來部署,以下是本人的實際經驗
1.首先需要修改pom.xml文件
<!-- 打war包時加入此項, 告訴spring-boot tomcat相關jar包用外部的,不要打進去 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency> <!--添加servlet api--> <dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-servlet-api</artifactId> <version>7.0.42</version> <scope>provided</scope> </dependency>
2.修改打包方式,將默認的jar包修改為war包
<packaging>jar</packaging>
3.修改啟動類
//默認 @SpringBootApplication public class InquiryApplication { public static void main(String[] args) { SpringApplication.run(InquiryApplication.class, args); } } //修改為 @SpringBootApplication public class InquiryApplication extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { return builder.sources(InquiryApplication.class); } public static void main(String[] args) { SpringApplication.run(InquiryApplication.class, args); } }
然后maven打包即可。打好的包會在項目目錄下的target目錄下,將其復制到tomcat的webapps目錄下,然后配置server.xml
server.xml是Tomcat中最重要的配置文件,server.xml的每一個元素都對應了Tomcat中的一個組件;通過對xml文件中元素的配置,可以實現對Tomcat中各個組件的控制。因此,學習server.xml文件的配置,對於了解和使用Tomcat至關重要。
說明:由於server.xml文件中元素與Tomcat中組件的對應關系,后文中為了描述方便,“元素”和“組件”的使用不嚴格區分
server.xml整體結構
<Server> <Service> <Connector /> <Connector /> <Engine> <Host> <Context /><!-- 現在常常使用自動部署,不推薦配置Context元素,Context小節有詳細說明 --> </Host> </Engine> </Service> </Server>
該結構中只給出了Tomcat的核心組件,除了核心組件外,Tomcat還有一些其他組件,下面介紹一下組件的分類。
server.xml文件中的元素可以分為以下4類:
(1)頂層元素:<Server>和<Service>
<Server>元素是整個配置文件的根元素,<Service>元素則代表一個Engine元素以及一組與之相連的Connector元素。
(2)連接器:<Connector>
<Connector>代表了外部客戶端發送請求到特定Service的接口;同時也是外部客戶端從特定Service接收響應的接口。
(3)容器:<Engine><Host><Context>
容器的功能是處理Connector接收進來的請求,並產生相應的響應。Engine、Host和Context都是容器,但它們不是平行的關系,而是父子關系:Engine包含Host,Host包含Context。一個Engine組件可以處理Service中的所有請求,一個Host組件可以處理發向一個特定虛擬主機的所有請求,一個Context組件可以處理一個特定Web應用的所有請求。
(4)內嵌組件:可以內嵌到容器中的組件。實際上,Server、Service、Connector、Engine、Host和Context是最重要的最核心的Tomcat組件,其他組件都可以歸為內嵌組件。
下面將詳細介紹Tomcat中各個核心組件的作用,以及相互之間的關系。
各個組件的詳細介紹見 https://www.cnblogs.com/kismetv/p/7228274.html,此處不再做進一步的介紹
我們在端口沖突時,只需要修改<connector>組件的port即可,Service包含兩個Connector:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
(1)通過配置第1個Connector,客戶端可以通過8080端口號使用http協議訪問Tomcat。其中,protocol屬性規定了請求的協議,port規定了請求的端口號,redirectPort表示當強制要求https而請求是http時,重定向至端口號為8443的Connector,connectionTimeout表示連接的超時時間。
在這個例子中,Tomcat監聽HTTP請求,使用的是8080端口,而不是正式的80端口;實際上,在正式的生產環境中,Tomcat也常常監聽8080端口,而不是80端口。這是因為在生產環境中,很少將Tomcat直接對外開放接收請求,而是在Tomcat和客戶端之間加一層代理服務器(如nginx),用於請求的轉發、負載均衡、處理靜態文件等;通過代理服務器訪問Tomcat時,是在局域網中,因此一般仍使用8080端口。
(2)通過配置第2個Connector,客戶端可以通過8009端口號使用AJP協議訪問Tomcat。AJP協議負責和其他的HTTP服務器(如Apache)建立連接;在把Tomcat與其他HTTP服務器集成時,就需要用到這個連接器。之所以使用Tomcat和其他服務器集成,是因為Tomcat可以用作Servlet/JSP容器,但是對靜態資源的處理速度較慢,不如Apache和IIS等HTTP服務器;因此常常將Tomcat與Apache等集成,前者作Servlet容器,后者處理靜態資源,而AJP協議便負責Tomcat和Apache的連接。
因服務器上有其他項目,自己的項目上線時Tomcat默認的8080端口被占用,所以在服務器上再安裝一個tomcat,然后修改config下的server.xml文件的各個端口,不要沖突即可。