********** 第一部分 Tomcat基礎配置 ***********
一、Apatch Tomcat 在win下配置
大部分轉載自:http://blog.csdn.net/liuhaomatou/article/details/39893897
首先從官方網站http://tomcat.apache.org/下載Tomcat,我這里下載的是最新版本的Tomcat8.0
下載后解壓得到:
進入到bin目錄下面:
運行tomcat8w.exe tomcat8.exe ,提示 指定的服務未安裝 unable to open the service 'tomcat8'
解決方法:
打開命令行提示符窗口=> 進入Tomcat安裝目錄==> 進入bin目錄下==> 輸入:
service.bat install //這個命令的實質就是給windows安裝一個服務
這個時候會提示:
The CATALINA_HOME environment variable is not defined correctly 的錯誤信息。
這個是因為環境變量沒有配置正確導致的。
解決方法如下: 1、JAVA_HOME中的路徑不能使用分號結尾,如 E:\Java\jdk1.6.0_10; 這樣寫就會出現提示CATALINA_HOME或是JAVA_HOME沒有配置好的錯誤,,還有就是JAVA_HOME的路徑一定不要寫成了JRE的路徑 2、CATALINA_BASE,CATALINA_HOME,TOMCAT_HOME中的路徑不能以"\"結尾,如 E:\Java\apache-tomcat-6.0.29\ 這樣寫就會出現java.util.logging.ErrorManager的錯誤,屏幕一閃而過 正確的寫法:
JAVA_HOME C:\Program Files\Java\jdk1.8.0_11 CATALINA_BASE D:\tools\apache-tomcat-8.0.14-windows-x64\apache-tomcat-8.0.14 CATALINA_HOME D:\tools\apache-tomcat-8.0.14-windows-x64\apache-tomcat-8.0.14 TOMCAT_HOME D:\tools\apache-tomcat-8.0.14-windows-x64\apache-tomcat-8.0.14
事實上,tomcat的核心就是catalina,startup.sh, shutdown.sh本質就是調用catalina命令
配置好了環境變量后在重新打開運行->cmd->進入到tomcat8.0的bin目錄下運行:
service.bat install</span>
這個時候就會提示如下信息:

在瀏覽器網頁中輸入:http://localhost:8080/ 后不能打開,是因為Tomcat沒有啟動,點擊如下圖片所示的start按鈕即可以啟動。
二、Apatch Tomcat 在Linux 和 MacOS上的配置問題
1、下載壓縮包
2、解壓縮
3、配置環境變量,這里重點介紹兩個方法
(1)方法一,修改~/.bash_profile文件
export PATH=$PATH:/Users/fuhua/Documents/Tomcat/apache-tomcat-8.0.30/bin
完了之后可以在bash中,輸入startup.sh, shutdown.sh進行開啟和關閉tomcat
(2)方法二,寫一個腳本文件,丟入/usr/bin變為全局命令,更加靈活和方便
執行方法,bash中輸入tomcat start 之類
-
#!/bin/bash
-
-
case $
1 in
-
start)
-
sh /Library/Tomcat/bin/startup.sh
-
;;
-
stop)
-
sh /Library/Tomcat/bin/shutdown.sh
-
;;
-
restart)
-
sh /Library/Tomcat/bin/shutdown.sh
-
sh /Library/Tomcat/bin/startup.sh
-
;;
-
*)
-
echo “Usage: start|stop|restart”
-
;;
-
esac
-
-
exit
0
********** 第二部分 Tomcat高級配置 ***********
Tomcat默認監聽的是8080端口,如果想修改此端口號,打開
D:\Program Files\apache-tomcat-8.0.3\conf\server.xml,找到如下代碼段,修改port屬性即可
- <Connector port="8080" protocol="HTTP/1.1"
- connectionTimeout="20000"
- redirectPort="8443" />
(1)制作xx.keystore文件
在命令行下輸入如下命令:
keytool -genkey -alias tomcat -keyalg RSA -keystore D:\test.keystore
(keytool.exe 在C:\Program Files\Java\jdk1.7.0_51\bin目錄下。因為已設置jdk環境變量,因此可以在命令行下可直接使用keytool)
密鑰庫口令隨意填,最后一步的密鑰口令也隨意填,也可以選擇跟密鑰庫口令一樣(按”Enter”鍵即可)
在D盤下可以看到test.keystore 文件
(2) 修改server.xml
打開D:\Program Files\apache-tomcat-8.0.3\conf\server.xml,找到如下代碼段
- <!--
- <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
- maxThreads="150" scheme="https" secure="true"
- clientAuth="false" sslProtocol="TLS" />
- -->
將注釋打開,並修改Connector 標簽內容,keystorePass為密鑰庫口令
- <Connector port="8443"
- protocol="org.apache.coyote.http11.Http11NioProtocol" SSLEnabled="true"
- maxThreads="150" scheme="https" secure="true"
- keystoreFile="D:\tomcat.keystore" keystorePass="password"
- clientAuth="false" sslProtocol="TLS" />
重啟Tomcat,在瀏覽器下輸入https://localhost:8443,即可看到Tomcat首頁
3、iOS, Android設置https
具體實現,參考這篇文章,有點小復雜
http://blog.csdn.net/wangyadong99/article/details/49124413
4、Tomcat設置默認WEB項目
修改后的Host 標簽
- <Host name="localhost" appBase="webapps"
- unpackWARs="true" autoDeploy="true">
- <Context path="" docBase="examples" reloadable="true" crossContext="true">
- </Context>
- <!-- 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" />
- </Host>
重新啟動Tomcat,在瀏覽器下輸入http://localhost:8080,即可看到examples的首頁
訪問http://localhost:8080/host-manager/index.jsp,會提示輸入用戶名、密碼,點”取消”,會彈出錯誤頁面,根據此錯誤頁面可以找到設置Tomcat賬號的辦法
打開D:\Program Files\apache-tomcat-8.0.3\conf\tomcat-users.xml,在tomcat-users標簽下添加如下內容
重啟Tomcat,然后訪問http://localhost:8080/host-manager/index.jsp,用戶名輸入tomcat,密碼輸入s3cret,即可
5、修改Session有效時間
默認情況下,Session有效時間為30分鍾。打開\conf\web.xml,修改session-timeout標簽的值
- <session-config>
- <session-timeout >30</session-timeout>
- </session-config>
6、maxThreads 連接數限制
maxThreads 是 Tomcat 所能接受最大連接數。一般設置不要超過8000以上,如果你的網站訪問量非常大可能使用運行多個Tomcat實例的方法。
即,在一個服務器上啟動多個tomcat然后做負載均衡處理。
-
<Connector port="8080" address="localhost"
-
maxThreads=
"2048" maxHttpHeaderSize=
"8192"
-
emptySessionPath=
"true" protocol=
"HTTP/1.1"
-
enableLookups=
"false" redirectPort=
"8181" acceptCount=
"100"
-
connectionTimeout=
"20000"
disableUploadTimeout=
"true" />
maxThreads 配置要結合 JVM -Xmx 參數調整,也就是要考慮內存開銷。
7、壓錯傳輸
通常所說的gzip壓縮,Tomcat通過在server.xml配置設置壓縮的選項。
-
<Connector port="8080" protocol="HTTP/1.1"
-
connectionTimeout=
"20000"
-
redirectPort=
"8443"
-
compression=
"on"
-
compressionM
inSize1=
"2048"
-
noCompressionUserAgents=
"gozilla, traviata"
-
compressableMimeType=
"text/html,text/xml,text/javascript,text/css,text/plain,,application/octet-stream"/>
當Tomcat完成安裝后你首先要做的事情如下:
首次安裝完成后立即刪除webapps下面的所有代碼(已經沒有用了)
rm -rf /srv/apache-tomcat/webapps/*
注釋或刪除 tomcat-users.xml 所有用戶權限,看上去如下:
-
# cat conf/tomcat-users.xml
-
<?xml version='1.0' encoding='utf-8'?>
-
<tomcat-users>
-
</tomcat-users>
隱藏Tomcat版本信息
-
vim $CATALINA_HOME/conf/server.xml
-
-
<Connector port=
"80" protocol=
"HTTP/1.1"
-
connectionTimeout=
"20000"
-
redirectPort=
"8443"
-
maxThreads=
"8192"
-
minSpareThreads=
"64"
-
maxSpareThreads=
"128"
-
acceptCount=
"128"
-
enableLookups=
"false"
-
server=
"Neo App Srv 1.0"/>
-
-
-
-
# curl -I http://localhost:8080/
-
HTTP/
1
.
1
400 Bad Request
-
Transfer-Encoding: chunked
-
Date: Thu,
20 Oct
2011
09:
51:
55 GMT
-
Connection:
close
-
Server: Neo App Srv
1
.
0
服務器信息已經被改為 Server: Neo App Srv 1.0
不要使用root用戶啟動tomcat,Java程序與C程序不同。nginx,httpd 使用root用戶啟動守護80端口,子進程/線程會通過setuid(),setgid()兩個函數切換到普通用戶。即父進程所有者是root用戶,子進程與多線程所有者是一個非root用戶,這個用戶沒有shell,無法通過ssh與控制台登陸系。Java 的JVM 是與系統無關的,是建立在OS之上的,你使用什么用戶啟動Tomcat,那麽Tomcat 就會繼承該所有者的權限。
這造成了一個問題,Linux系統小於1024的端口只有root可以使用,這也是為什么Tomcat默認端口是8080。如果你想使用80端口只能使用root啟動Tomcat。這有帶來了很多安全問題。
解決方案是創建一個不同用戶,如:
-
groupadd -g 80 daemon
-
adduser -o --home /daemon --shell /sbin/nologin --uid
80 --gid
80 -
c
"Web Server" daemon
注意 /sbin/nologin , 意味着該用戶不能登錄,同時我也沒有給它指定密碼,這個用戶只能用於啟動tomcat
-
chown daemon:daemon -R /srv/*
-
su - daemon -c
"/srv/apache-tomcat/bin/startup.sh"
接下來解決80端口問題, 思路就是80去調用8080,或者映射端口。
下面是影射方案,80 跳轉 8080
-
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
-
-
取消跳轉
-
iptables -t nat -D PREROUTING -p tcp
--dport 80 -j REDIRECT --to-port 8080
-
-
查看規則
-
iptables -t nat -L
另一個就是從80請求去調用8080的方案
這個方案可以在 Tomcat 前段增加反向代理,例如:Nginx,Apache,Squid,Varnish或者F5, Array這類設備等等
關閉war自動部署 unpackWARs="false" autoDeploy="false"。防止被植入木馬等惡意程序
應用程序部署與tomcat啟動,不能使用同一個用戶。
我的tomcat 安裝在 /srv目錄下,Tomcat啟動用戶為daemon; 應用程序放在/www目錄下www所有者是www用戶。這樣的目的是一旦tomcat被植入web shell程序,它將不能創建或編輯/www目錄下面的任何內容。
adduser --home /www -c "Web Application" www
********** 第三部分 延伸閱讀 catalin.sh腳本分析 ***********
1、解釋startup.sh 和 catalin.sh 的區別
Linux下Tomcat啟動后顯示控制台:
采用 ./startup.sh 啟動,則沒有顯示控制台。
要像windows一樣顯示控制台,則 : ./catalina.sh run
2、(轉載)tomcat學習筆記之catalina.sh
原文鏈接: http://blog.csdn.net/jackie_xiaonan/article/details/49229139
本文基於tomcat 8.0.18版本的源碼實現寫作,隨tomcat7發布的腳本可能會有些差異。
最早是在07年部門培訓的時候接觸到tomcat,但后來的工作都和web開發不相關,所以沒有積累多少使用經驗,只有一點膚淺的感性認識;12年中項目組啟動了新部件的開發,使用tomcat做為運行平台,但和我的工作內容不相關,所以還沒有實質性的接觸;15年初,調離原項目,加入新產品的研發,而新產品是基於tomcat的j2ee項目,工作這么多年終於有機會和tomcat做一次親密接觸。
與catalina.sh相關的腳本
tomcat發布版本中附帶了很多腳本,和catalina.sh相關有如下
- version.sh,查看當前tomcat的版本號。
- startup.sh,啟動運行tomcat實例。
- shutdown.sh,停止tomcat實例的運行。
- configtest.sh,校驗tomcat配置文件server.xml的格式、內容等是否合法、正確。
- setclasspath.sh,catalina.sh依賴這個腳本來設置一些運行時變量。
腳本version.sh、startup.sh、shutdown.sh、configtest.sh都是對catalina.sh的包裝,內容大同小異,差異在於功能介紹和調用catalina.sh時的參數不同。
下面就重點分析下catalina.sh的實現。
catalina.sh的命令行選項
在shell下不帶任何參數來執行catalina.sh,可以看到類似如下的輸出信息。
Usage: catalina ( commands ... )
commands:
debug Start Catalina in a debugger
debug -security Debug Catalina with a security manager
jpda start Start Catalina under JPDA debugger
run Start Catalina in the current window
run -security Start in the current window with security manager
start Start Catalina in a separate window
start -security Start in a separate window with security manager
stop Stop Catalina, waiting up to 5 seconds for the process to end
stop n Stop Catalina, waiting up to n seconds for the process to end
stop -force Stop Catalina, wait up to 5 seconds and then use kill -KILL if still running
stop n -force Stop Catalina, wait up to n seconds and then use kill -KILL if still running
configtest Run a basic syntax check on server.xml - check exit code for result
version What version of tomcat are you running?
幫助信息給出了各選項的意義,但tomcat提供的封裝腳本中只用到了其中的一部分,比如:
- version,在version.sh中使用。
- start,在startup.sh中使用。
- stop,在shutdown.sh中使用。
- configtest,在configtest.sh中使用。
如果需要使用其它命令行選項,最簡單的方法即是復制startup.sh腳本並重命名為新的腳本,使用文本編輯器調整傳給catalina.sh的參數,如此操作之后,滿足自定義需求的腳本即創建好了。
catalina.sh中使用的變量
catalina.sh提供了哪些變量?
用文本編輯器打開catalina.sh,首先可以看到一些環境變量的說明,基於功能可以做如下分類:
- 指定tomcat和應用的啟動路徑
- CATALINA_HOME,指向tomcat的安裝路徑,或者腳本catalina.sh所在位置的父目錄。
- CATALINA_BASE,可選項,如無定義,則與CATALINA_HOME取值相同。用於指向用戶自定義的tomcat路徑,tomcat啟動時將以CATALINA_BASE變量值來計算配置文件、日志文件等的路徑。
- Java運行時路徑,tomcat運行依賴系統已安裝好的Java運行時軟件,因此如下兩個變量中至少定義一個,並且變量值指向合法路徑。
- JAVA_HOME,指定JDK的安裝路徑。
- JRE_HOME,指定JRE的安裝路徑。取值原則,如用戶未指定JRE_HOME,則取JAVA_HOME的值;如JRE_HOME和JAVA_HOME都有定義,則優先取JRE_HOME的定義。
- Java運行時參數
- JAVA_OPTS,顧名思義,用來定義傳遞Java運行時的參數,對全部命令行選項都會生效,因此不建議在本變量中定義堆大小、GC參數、JMX參數等。
- CATALINA_OPTS,用來定義傳遞給Java運行時的參數,僅在命令行選項為run/start/debug時有效,可以用來傳遞堆大小、GC參數、JMX參數等。
- CATALINA_TMPDIR,用來定義java.io.tmpdir變量的值,默認值為$CATALINA_BASE/temp。
- JAVA_ENDORSED_DIRS,以分號相隔的目錄列表,用來替換非JCP提供的jar實現,默認值為$CATALINA_HOME/endorsed。
- 遠程調試參數。當開發環境與應用運行環境不一致,或者開發環境下出於各種原因不適合調試應用時,這時即可借助遠程調試來解決問題。JPDA的介紹可參考閱讀資料。
- JPDA_TRANSPORT,默認值dt_socket。
- JPDA_ADDRESS,默認值localhost:8000。
- JPDA_SUSPEND,默認值n
- JPDA_OPTS,默認值為-agentlib:jdwp=transport=$JPDA_TRANSPORT,address=$JPDA_ADDRESS,server=y,suspend=$JPDA_SUSPEND
- 其它
- CATALINA_OUT,使用全路徑方式指定stdout和stderr重定向之后的文件名,默認值為$CATALINA_BASE/logs/catalina.out。
- CATALINA_PID,本選項在*nix下有效,指定pid文件的存儲路徑,默認值為空,如用戶指定,則啟動、停止時都會從變量指定的文件中提取進程ID。
- LOGGING_CONFIG,定義tomcat使用的日志配置文件的路徑,默認值為$CATALINA_BASE/conf/logging.properties。
- LOGGING_MANAGER,定義tomcat使用的日志管理器。
看過變量的定義之后,是否有定制變量取值的沖動了?
如何定義catalina.sh提供的變量?
- 方法一,修改catalina.sh,在腳本的開始位置為前述變量賦值。
- 方法二,提供自定義的啟動、停止腳本,在自定義的腳本中為前述變量賦值。
- 方法三,使用tomcat開發人員預留的擴展方法,在$CATALINA_BASE/bin/setenv.sh中為前述變量賦值。
個人推薦方法二,升級tomcat版本時非常簡單,不需要從原tomcat安裝路徑下復制文件到升級后的tomcat的安裝路徑下。
catalina.sh的實現
catalina.sh規格接近600行代碼,這足以嚇退很多人,但如果肯硬着頭皮看幾遍的話,其實可以了解到catalina.sh的代碼並不復雜,可讀性還是很高的。
除去catalina.sh中對cygwin、os400的特殊處理,代碼做了如下操作:
- 加載類路徑,通過加載、執行setclasspath.sh實現。
- 加載用戶自定義變量,通過加載setenv.sh實現。
- 校驗變量,包括前述介紹的變量,檢查是否存在定義,如無定義則使用默認值,並依據用途做相應的校驗。
- 運行命令,依據腳本接收到的選項,將變量拼接為命令,並執行。
閱讀材料
- JPDA是Java Platform Debugger Architecture的簡寫,詳盡的閱讀材料可參考http://docs.oracle.com/javase/8/docs/technotes/guides/jpda。
3、tomcat啟動腳本startup.sh分析
原文地址:
一、分析說明
為了寫出更加完善的tomcat啟動方面的自動化腳本,健壯自己用於代碼上線自動化部署的腳本,特分析下tomcat的bin目錄下的starup.sh腳本,學習標准的sh腳本的編寫方法,從中吸取經驗
二、腳本分析
#!/bin/sh # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # ----------------------------------------------------------------------------- # Start Script for the CATALINA Server # # $Id: startup.sh 1130937 2011-06-03 08:27:13Z markt $ # ----------------------------------------------------------------------------- # Better OS/400 detection: see Bugzilla 31132 os400=false darwin=false #os400是 IBM的AIX #darwin是MacOSX 操作環境的操作系統成份 #Darwin是windows平台上運行的類UNIX模擬環境 case "`uname`" in CYGWIN*) cygwin=true;; OS400*) os400=true;; Darwin*) darwin=true;; esac #上一個判斷是為了判斷操作系統,至於何用,往下看 # resolve links - $0 may be a softlink #讀取腳本名 PRG="$0" #test �h File 文件存在並且是一個符號鏈接(同-L) while [ -h "$PRG" ] ; do ls=`ls -ld "$PRG"` link=`expr "$ls" : '.*-> \(.*\)$'` if expr "$link" : '/.*' > /dev/null; then PRG="$link" else PRG=`dirname "$PRG"`/"$link" fi done #上面循環語句的意思是保證文件路徑不是一個連接,使用循環直至找到文件原地址 #遇到一時看不明白的shell,可以拆解后自己在linux反復運行驗證,一點點拆解就會明白的 #link=`expr "$ls" : '.*-> \(.*\)$'` 模擬后: expr 'lrwxrwxrwx 1 root root 19 3月 17 10:12 ./bbb.sh -> /root/shell/test.sh' : '.*-> \(.*\)$' #很明確的發現是用expr來提取/root/shell/test.sh的內容 #而這個循環就可以明確其目的,排除命令為鏈接,找出命令真正的目錄,防止后面的命令出錯 #這段代碼如果在以后有這方面的找出鏈接源頭的需求可以完全借鑒#獲取這個腳本的目錄
PRGDIR=dirname <span class="string" style="color:#dd1144;">"<span class="variable">$PRG</span>"</span>
EXECUTABLE=catalina.sh
# Check that target executable exists
#這些判斷是否氣是其他的操作系統
if $os400; then
# -x will Only work on the os400 if the files are:
# 1. owned by the user
# 2. owned by the PRIMARY group of the user
# this will not work if the user belongs in secondary groups
eval
#這個eval還沒有理解
else
if [ ! -x "$PRGDIR"/"$EXECUTABLE" ]; then
#判斷腳本catalina.sh是否存在並有可執行權限,沒有執行權限就退出
echo "Cannot find $PRGDIR/$EXECUTABLE"
echo "The file is absent or does not have execute permission"
echo "This file is needed to run this program"
exit 1
fi
fi
exec "$PRGDIR"/"$EXECUTABLE" start "$@"
#exec命令在執行時會把當前的shell process關閉,然后換到后面的命令繼續執行。
#exec命令可以很好的進行腳本之間過渡,並且結束掉前一個腳本這樣不會對后面執行的腳本造成干擾。
#exec 命令:常用來替代當前 shell 並重新啟動一個 shell,換句話說,並沒有啟動子 shell。使用這一命令時任何現
#有環境都將會被清除。exec 在對文件描述符進行操作的時候,也只有在這時,exec 不會覆蓋你當前的 shell 環境。
#exec 可以用於腳本執行完啟動需要啟動另一個腳本是使用,但須考慮到環境變量是否被繼承。
三、總結
tomcat的startup.sh腳本主要用來判斷環境,找到catalina.sh腳本源路徑,將啟動命令參數傳遞給catalina.sh執行。然而catalina.sh腳本中也涉及到判斷系統環境和找到catalina.sh腳本原路徑的相關代碼,所以執行tomcat啟動時,無需使用startup.sh腳本(下一篇分析的shutdown.sh也類似),直接./catalina.sh start|stop|restart 即可。
http://vekergu.blog.51cto.com/9966832/d-2