一、安裝tomcat之后
tomcat壓縮包解壓之后,進入webapps目錄,可以看到如下webapp:
- docs文檔:這是一個靜態頁面集,不用啟動tomcat也可以閱讀
- examples樣例
- hostmanager主機管理器
- manager應用管理器
- ROOT根目錄:這個app可以訪問以上四個app,這個app是默認的app,這個app十分簡單,只有一些資源文件和一個jsp頁面。
安裝完tomcat之后,在bin目錄下啟動startup.bat。在瀏覽器地址欄輸入localhost:8080,仔細閱讀首頁,此頁面包羅萬象,可以進入到文檔,可以進入到配置,是十分重要的資源索引。
有了文檔,不需要百度,不需要從官網上下載文檔doc-full.zip,仔細閱讀之,一切問題在這里都能找到答案。
二、tomcat端口映射
眾所周知,在unix下,非root用戶不能監聽1~1024的端口號,原因是這些端口號都有特殊用途,是許多默認協議的默認端口號。tomcat默認端口號是8080,最好不要更改tomcat的端口號,通過端口映射的方式可以把80端口的請求轉發到8080。
方法一:配置iptables,把80端口轉到8080
在root賬戶下面運行一下命令:
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
注意:網上朋友的命令dport 前面都是 一個 -,通常都會報錯。另外如果防火牆重新啟動,該命令就會失效。
可以使用下面的命令把該規則保存到iptables里面 :
service iptables save
方法二:使用Nginx
這種方式是最為正規完善的方式,詳見此文
三、tomcat修改端口號
強烈建議不要修改端口號,而是通過端口映射的方式:將80端口的請求轉發到8080端口。
tomcat默認端口號為8080,http服務的默認端口號為80。在瀏覽器地址欄輸入ip或者域名之后,如果不輸入端口號,默認就是80端口。
修改tomcat目錄下的conf/server.xml文件,service標簽下的Connector可以有多個,再添加一個80端口的連接就可以了
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Connector port="80" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
四、設置默認應用
修改tomcat目錄下的conf/server.xml文件,添加Context標簽並設置docBase,需要注意在java中路徑分隔符一律按照'/'來總是正確的。
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<!-- SingleSignOn valve, share authentication between web applications
Documentation at: /docs/config/valve.html -->
<!--
<Valve className="org.apache.catalina.authenticator.SingleSignOn" />
-->
<!-- Access log processes all example.
Documentation at: /docs/config/valve.html
Note: The pattern used is equivalent to using pattern="common" -->
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log." suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
<Context path="" docBase="D:\apache\apache-tomcat-7.0.26\webapps\OnlineExam">
<WatchedResource>WEB-INF/web.xml</WatchedResource>
</Context>
</Host>
實際上,上面介紹的這種方法乃是下策,上策是把webapp的名稱直接改為ROOT
,tomcat默認ROOT目錄是默認webapp
五、tomcat遠程部署
Tomcat安裝成功后,在ip地址:8080上就可以看見熟悉的首頁,在這個首頁中,上方有一個manage app按鈕,點擊就可以進行應用管理了.這樣就不需要使用ftp把war包傳上去了.
要想遠程部署,需要更改兩個地方,第一個地方比較容易發現,只要點擊按鈕,就會跳到一頁,這頁內容指導我們更改TOMCAT_HOME/conf/tomcat-users.xml目錄,照着來就可以了.
仍舊發現無法訪問manage app,這是因為tomcat 8.5以后的版本,默認manage app這個應用不許遠程訪問,需要更改這個應用的配置文件,即:TOMCAT_HOME/webapps/manager/META-INF/context.xml,把這個文件中的ip地址限制那句話注釋掉就可以了.
<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" /-->
</Context>
六、Tomcat解決中文亂碼問題
Tomcat默認使用的編碼時ISO88591。
URLEncode是一種將byte數組轉化為ASCII碼字符串的方式,而byte數組轉化為真正的字符串是需要編碼的。
URLEncode+GBK、URLEncode+UTF8結果是不一樣的。
保守點的方法:把亂碼用ISO88591轉換回byte數組,將byte數組用utf8進行解碼。
String city = new String(request.getParameter("city").getBytes("ISO-8859-1"),"utf-8");
徹底一點的方法:把tomcat的默認URL編碼設置為UTF8。
在TOMCAT中的conf/server.xml中的Connector中添加兩個設置
useBodyEncodingForURI="true" //設置POST和GET使用相同編碼
URIEncoding="UTF-8" //對URI使用utf-8編碼處理。
七、tomcat啟動太慢解決方案
解決方法
方法一:只在Tomcat環境中解決
可以通過配置JRE使用非阻塞的Entropy Source。
在catalina.sh中加入這么一行:-Djava.security.egd=file:/dev/./urandom
即可。
加入后再啟動Tomcat,整個啟動耗時下降到Server startup in 2912 ms。
方法二:在JVM環境中解決
在/dev目錄下,ls | grep random
可以找到random和urandom,查看random文件內容head random
很慢,會卡住一段時間,head urandom
卻很快,我們需要做的就是更改隨機源。
打開$JAVA_PATH/jre/lib/security/java.security
這個文件,找到下面的內容:
securerandom.source=file:/dev/random
替換成
securerandom.source=file:///dev/urandom
問題原因
原因
Tomcat 7/8都使用org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom類產生安全隨機類SecureRandom的實例作為會話ID,這里花去了342秒,也即接近6分鍾。
SHA1PRNG算法是基於SHA-1算法實現且保密性較強的偽隨機數生成器。
在SHA1PRNG中,有一個種子產生器,它根據配置執行各種操作。
1)如果java.security.egd
屬性或securerandom.source
屬性指定的是file:/dev/random
或file:/dev/urandom
,那么JVM會使用本地種子產生器NativeSeedGenerator,它會調用super()方法,即調用SeedGenerator.URLSeedGenerator(/dev/random)方法進行初始化。
2)如果java.security.egd
屬性或securerandom.source
屬性指定的是其它已存在的URL,那么會調用SeedGenerator.URLSeedGenerator(url)
方法進行初始化。
這就是為什么我們設置值為file:///dev/urandom
或者值為file:/./dev/random
都會起作用的原因。
在這個實現中,產生器會評估熵池(entropy pool)中的噪聲數量。隨機數是從熵池中進行創建的。當讀操作時,/dev/random
設備會只返回熵池中噪聲的隨機字節。/dev/random
非常適合那些需要非常高質量隨機性的場景,比如一次性的支付或生成密鑰的場景。
當熵池為空時,來自/dev/random
的讀操作將被阻塞,直到熵池收集到足夠的環境噪聲數據。這么做的目的是成為一個密碼安全的偽隨機數發生器,熵池要有盡可能大的輸出。對於生成高質量的加密密鑰或者是需要長期保護的場景,一定要這么做。
那么什么是環境噪聲?
隨機數產生器會手機來自設備驅動器和其它源的環境噪聲數據,並放入熵池中。產生器會評估熵池中的噪聲數據的數量。當熵池為空時,這個噪聲數據的收集是比較花時間的。這就意味着,Tomcat在生產環境中使用熵池時,會被阻塞較長的時間。
參考資料