目錄
- 前言
- 前期準備
- 具體操作步驟
- HTTP 自動跳轉(zhuǎn) HTTPS 的安全配置(可選)
- 如何檢驗配置是否成功
- 結(jié)語
前言
tomcat配置好了以后默認是使用8080端口訪問的,也就是需要在使用"域名.com:8080"才能訪問。這篇總結(jié)一下如何修改tomcat配置,使可以用"http://域名.com"或"https://域名.com" 訪問。
前期準備
環(huán)境配置:
- 騰訊云輕量應(yīng)用服務(wù)器: CentOS 8.2 64bit
- 遠程訪問推薦使用圖形化界面(Mac 建議Royal TSX,Windows建議Mobaxterm)
- Tomcat 10.0.4 ;
- Java 1.8 ;
前提條件:
配置訪問80端口即"http://域名.com"不需要證書
配置訪問443端口即"https://域名.com" 需要SSL證書,證書可以從你購買服務(wù)器的運營商那里獲取
具體操作步驟
話不多說,直接進入正題
編輯在 /usr/tomcat/*/conf 目錄(這個目錄是你安裝tomcat的目錄)下的 server.xml 文件。添加如下內(nèi)容:
// An highlighted block <Connector port="443" protocol="HTTP/1.1" SSLEnabled="true" ? maxThreads="150" scheme="https" secure="true" #證書保存的路徑 ? keystoreFile="/usr/*/conf/域名.com.jks"? #密鑰庫密碼 ? keystorePass="******" ? clientAuth="false"/>
詳細 server.xml 文件和一些參數(shù)解釋如下(可以直接復(fù)制過去):
<?xml version="1.0" encoding="UTF-8"?> <!-- Server 根元素,創(chuàng)建?個Server實例,?標簽有 Listener、GlobalNamingResources、Service port:關(guān)閉服務(wù)器的監(jiān)聽端? shutdown:關(guān)閉服務(wù)器的指令字符串 --> <Server port="8005" shutdown="SHUTDOWN"> ? ? <!-- 創(chuàng)建 5 個監(jiān)聽器 ?start --> ? ? <!-- 以?志形式輸出服務(wù)器 、操作系統(tǒng)、JVM的版本信息 --> ? ? <Listener className="org.apache.catalina.startup.VersionLoggerListener"/> ? ? <!-- 加載(服務(wù)器啟動) 和 銷毀 (服務(wù)器停?) APR。 如果找不到APR庫, 則會輸出?志, 并不影響 Tomcat啟動 --> ? ? <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on"/> ? ? <!-- 避免JRE內(nèi)存泄漏問題 --> ? ? <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener"/> ? ? <!-- 加載(服務(wù)器啟動) 和 銷毀(服務(wù)器停?) 全局命名服務(wù) --> ? ? <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"/> ? ? <!-- 在Context停?時重建 Executor 池中的線程, 以避免ThreadLocal 相關(guān)的內(nèi)存泄漏 --> ? ? <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener"/> ? ? <!-- 創(chuàng)建 5 個監(jiān)聽器 ?end --> ? ? <!-- ? ? ? ? ?定義服務(wù)器全局的JNDI 資源 命名服務(wù) ? ? --> ? ? <GlobalNamingResources> ? ? ? ? <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> ? ? <!-- ? ? ? ? ? ? 該標簽?于創(chuàng)建 Service 實例,默認使? org.apache.catalina.core.StandardService。 ? ? ? ?默認情況下,Tomcat 僅指定了Service 的名稱, 值為 "Catalina"。 ? ? ? ?Service ?標簽為 : Listener、Executor、Connector、Engine, ? ? ? ?其中: ? ? ? ?Listener ?于為Service添加?命周期監(jiān)聽器, ? ? ? ?Executor ?于配置Service 共享線程池,(可以給多個 Connector連接器使用) ? ? ? ?Connector ?于配置Service 包含的鏈接器, ? ? ? ?Engine ?于配置Service中鏈接器對應(yīng)的Servlet 容器引擎 ? ? ?--> ? ? <Service name="Catalina"> ? ? ? ? <!-- 默認情況下,Service 并未添加共享線程池配置。 如果我們想添加?個線程池, 可以在<Executor> 下添加如下配置: ? ? ? ? ? ? ? name:線程池名稱,?于 Connector中指定 ? ? ? ? ? ? ? namePrefix:所創(chuàng)建的每個線程的名稱前綴,?個單獨的線程名稱為:namePrefix+線程編號 ? ? ? ? ? ? ? maxThreads:池中最?線程數(shù) ? ? ? ? ? ? ? minSpareThreads:活躍線程數(shù),也就是核?池線程數(shù),這些線程不會被銷毀,會?直存在 ? ? ? ? ? ? ? maxIdleTime:線程空閑時間,超過該時間后,空閑線程會被銷毀,默認值為6000(1分鐘),單位毫秒 ? ? ? ? ? ? ? maxQueueSize:在被執(zhí)?前最?線程排隊數(shù)?,默認為Int的最?值,也就是?義的?限。除?特殊情況,這個值 不需要更改,否則會有請求不會被處理的情況發(fā)? ? ? ? ? ? ? ? prestartminSpareThreads:啟動線程池時是否啟動 minSpareThreads部分線程。默認值為false,即不啟動 ? ? ? ? ? ? ? threadPriority:線程池中線程優(yōu)先級,默認值為5,值從1到10 ? ? ? ? ? ? ? className:線程池實現(xiàn)類,未指定情況下,默認實現(xiàn)類為 ? ? ? ? ? ? ? org.apache.catalina.core.StandardThreadExecutor。 ? ? ? ? ? ? ? 如果想使??定義線程池?先需要實現(xiàn)org.apache.catalina.Executor接?--> ? ? ? ? <Executor name="tomcatThreadPool" ? ? ? ? ? ? ? ? ? namePrefix="catalina-exec-" ? ? ? ? ? ? ? ? ? maxThreads="200" ? ? ? ? ? ? ? ? ? minSpareThreads="100" ? ? ? ? ? ? ? ? ? maxIdleTime="60000" ? ? ? ? ? ? ? ? ? maxQueueSize="Integer.MAX_VALUE" ? ? ? ? ? ? ? ? ? prestartminSpareThreads="true" ? ? ? ? ? ? ? ? ? threadPriority="5" ? ? ? ? ? ? ? ? ? className="org.apache.catalina.core.StandardThreadExecutor"/> ? ? ? ? <!-- ? ? ? ? ? ?Connector 標簽?于創(chuàng)建鏈接器實例,默認情況下,server.xml 配置了兩個鏈接器,?個?持HTTP協(xié)議,?個?持AJP協(xié)議 ? ? ? ? ? ??多數(shù)情況下,我們并不需要新增鏈接器配置,只是根據(jù)需要對已有鏈接器進?優(yōu)化 ? ? ? ? ? ? ? ? port: ? ? ? ? ? ? ? ? ? ? ?端?號,Connector ?于創(chuàng)建服務(wù)端Socket 并進?監(jiān)聽, 以等待客戶端請求鏈接。如果該屬性設(shè)置為0, Tomcat將會隨機選擇?個可?的端?號給當前Connector 使? ? ? ? ? ? ? ? ? protocol: ? ? ? ? ? ? ? ? ? ? ?當前Connector ?持的訪問協(xié)議。 默認為 HTTP/1.1 , 并采??動切換機制選擇?個基于 JAVA NIO 的鏈接器或者基于本地APR的鏈接器(根據(jù)本地是否含有Tomcat的本地庫判定) ? ? ? ? ? ? ? ? connectionTimeOut: ? ? ? ? ? ? ? ? ? ? ?Connector 接收鏈接后的等待超時時間, 單位為 毫秒。 -1 表示不超時。 ? ? ? ? ? ? ? ? redirectPort: ? ? ? ? ? ? ? ? ? ? ?如果當前接收的是一個 https 的請求,那么tomcat 會將請求轉(zhuǎn)發(fā)到 redirectPort指定的端口。 ? ? ? ? ? ? ? ? ? ? ?比如現(xiàn)在設(shè)定的:8443 端口當前Connector 不?持SSL請求, 接收到了?個請求, 并且也符合security-constraint 約束,需要SSL傳輸,Catalina?動將請求重定向到指定的端?。 ? ? ? ? ? ? ? ? executor: ? ? ? ? ? ? ? ? ? ? ?指定共享線程池的名稱, 也可以通過maxThreads、minSpareThreads 等屬性配置內(nèi)部線程池。 ? ? ? ? ? ? ? ? URIEncoding: ? ? ? ? ? ? ? ? ? ? ??于指定編碼URI的字符編碼, Tomcat8.x版本默認的編碼為 UTF-8 , Tomcat7.x版本默認為ISO8859-1 ?--> ? ? ? ? <!--org.apache.coyote.http11.Http11NioProtocol, ?阻塞式 Java NIO 鏈接器,tomcat8配置nio會報錯,可能是已經(jīng)集成了nio的原因--> ? ? ? ? <Connector port="80" ? ? ? ? ? ? ? ? ? ?protocol="HTTP/1.1" ? ? ? ? ? ? ? ? ? ?connectionTimeout="20000" ? ? ? ? ? ? ? ? ? ?redirectPort="443" ? ? ? ? ? ? ? ? ? ?executor="tomcatThreadPool" ? ? ? ? ? ? ? ? ? ?URIEncoding="utf-8"/> ? ? ? ? <!-- certificateKeystoreFile 用于指定證書所在的目錄 ; ? ? ? ? ? ? ? ? ? ? ? ? certificateKeystorePassword 用于指定證書的密碼;type是使用的加密算法--> ? ? ? ? <Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol" ? ? ? ? ? ? ? ? ? ?maxThreads="150" schema="https" secure="true" SSLEnabled="true"> ? ? ? ? ? ? <SSLHostConfig> ? ? ? ? ? ? ? ? <Certificate ? ? ? ? ? ? ? ? ? ? ? ? certificateKeystoreFile="conf/你的域名.cn.jks" ? ? ? ? ? ? ? ? ? ? ? ? certificateKeystorePassword="你申請證書時提交密碼" ? ? ? ? ? ? ? ? ? ? ? ? type="RSA" /> ? ? ? ? ? ? </SSLHostConfig> ? ? ? ? </Connector> ? ? ? ? <!-- Define an AJP 1.3 Connector on port 8009 --> ? ? ? ? <Connector protocol="AJP/1.3" ? ? ? ? ? ? ? ? ? ?address="::1" ? ? ? ? ? ? ? ? ? ?port="8009" ? ? ? ? ? ? ? ? ? ?redirectPort="443" /> ? ? ? ? <!--name: ?于指定Engine 的名稱, 默認為Catalina ? ? ? ? ?defaultHost:默認使?的虛擬主機名稱, 當客戶端請求指向的主機?效時, 將交由默認的虛擬主機處 ? ? ? ? ? ? ? 理, 默認為localhost--> ? ? ? ? <Engine name="Catalina" defaultHost="localhost"> ? ? ? ? ? ? <Realm className="org.apache.catalina.realm.LockOutRealm"> ? ? ? ? ? ? ? ? <Realm className="org.apache.catalina.realm.UserDatabaseRealm" ? ? ? ? ? ? ? ? ? ? ? ?resourceName="UserDatabase"/> ? ? ? ? ? ? </Realm> ? ? ? ? ? ? <!--Host 標簽?于配置?個虛擬主機 ? ? ? ? ? ? ? ? ? ? ? name:該host的名稱 ? ? ? ? ? ? ? ? ? ? ? appBase :指定 war包放置的路徑,可以是絕對路徑,也可以是相對路徑(相對路徑,相對的就是tomcat的安裝目錄 ? ? ? ? ? ? ? ? ? ? ? unpackWARs :是否自動解壓 war包 ? ? ? ? ? ? ? ? ? ? ? autoDeploy:是否自動部署 (有點熱部署的效果)--> ? ? ? ? ? ? <Host name="localhost" appBase="webapps" ? ? ? ? ? ? ? ? ? unpackWARs="true" autoDeploy="true"> ? ? ? ? ? ? ? ? <!-- 記錄當前 host 處理請求的日志 --> ? ? ? ? ? ? ? ? <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>
其中有一個需要注意的地方就是,證書的位置certificateKeystoreFile可以填絕對路徑,也可以填相對路徑。如果填寫的是相對路徑,那地址應(yīng)該是conf的上一層目錄(如果你把jks文件放在server.xml的同級目錄下,此處應(yīng)該填"conf/域名.jks"),我因為這個踩過一些坑。
HTTP 自動跳轉(zhuǎn) HTTPS 的安全配置(可選)
如果您需要將 HTTP 請求自動重定向到 HTTPS。您可以通過以下操作設(shè)置:
編輯 /usr/*/conf 目錄下的 web.xml 文件,找到 標簽。
請在結(jié)束標簽 后面換行,并添加以下內(nèi)容:
?? ?<login-config> ? ? <!-- Authorization setting for SSL --> ? ? <auth-method>CLIENT-CERT</auth-method> ? ? <realm-name>Client Cert Users-only Area</realm-name> ? ? </login-config> ? ?? ? ? <security-constraint> ? ? <!-- Authorization setting for SSL --> ? ? <web-resource-collection> ? ? <web-resource-name>SSL</web-resource-name> ? ? <url-pattern>/*</url-pattern> ? ? </web-resource-collection> ? ? <user-data-constraint> ? ? <transport-guarantee>CONFIDENTIAL</transport-guarantee> ? ? </user-data-constraint> ? ? </security-constraint>
如何檢驗配置是否成功
修改server.xml文件后,停止tomcat服務(wù),在/usr/tomcat/*/bin目錄下輸入:
./shutdown.sh
然后以下命令檢查配置文件是否有誤,如果有報錯信息就在網(wǎng)上搜索一下或者自己解決就好了:
./configtest.sh
以上步驟沒有問題以后,輸入以下命令就可以使用"https://域名.com"訪問tomcat了。
./startup.sh
網(wǎng)上的教程大部分都只說./shutdown.sh和./startup.sh兩個命令重啟tomcat,但是有時候重啟時有一些報錯信息并不顯示,就是訪問80端口沒有問題,但是443端口配置有錯無法訪問。
還要注意的是,./configtest.sh命令一定要在./shutdown.sh停止tomcat之后執(zhí)行,要不然會出現(xiàn)端口已被占用的錯誤。
結(jié)語
最近在忙最近的畢業(yè)設(shè)計,最近做后端接口和最近寫網(wǎng)頁,然后在騰訊云上面買了一臺服務(wù)器還有一個域名(總共花了80塊錢,租了一年)。花了半個月終于備案完成,于是迫不及待的把自己寫的網(wǎng)頁傳上去。其中配置docker、tomcat、mysql、rabbitmq、redis都遇到一些坑。希望可以幫到大家吧。
[1]: 騰訊云Tomcat 服務(wù)器 SSL 證書安裝部署(JKS 格式)