tomcat
-
簡述
-
tomcat的結構
-
tomcat配置
-
總結與問題
簡述
什么是tomcat?
tomcat是一個java2ee的web容器的殘缺實現,提供了serverlet,asp轉換等組件。
tomcat的功能?
tomcat能夠將asp文件通過轉換,轉換為serverlet格式,這樣子就可以被java識別運行并將結果轉為asp響應,并且tomcat其實也是內置了一個web服務器。
tomcat的結構
server:服務器段,直接面向用戶請求,tomcat的一個實例。 service:服務進程,deamon守護進程。 connect:連接器,用來連接server與service,當server接收請求后,通過連接器將請求傳達給service。 engine:引擎,不同的引擎,提供了不同的方式處理serverlet,一個service中可以有多個engine,但是一般來說只有一個engine。 host:虛擬主機,可以有多個host,每個servername指向各自的host。 context:上下文,可以有多個,每一個context指向了不同的程序。 valve:閥門,用來定義一些獨立的功能,如日志等,每一個host內可以有多個value,每一個value定義一個功能。 Realm:領域,用于用戶的認證和授權。 Logger:用于記錄組件內部的狀態信息,可被用于除Context之外的任何容器中。
tomcat配置
tomcat的下載與安裝
可通過yum源或者code包的方式使用,由于tomcat也是由java所編寫的,所以tomcat其實也是運行在jvm上的一段代碼,運行tomcat也只是將code放在java上運行。
1. yum install tomcat -y 2. tar xvf apache-tomcat-release.tar.gz -C /usr/local ln -sv /usr/local/apache-tomcat-release /usr/local/tomcat
環境變量的設置
# echo -e "export CATALINA_HOME=/usr/local/tomcat \nexport PATH=\$CATALINA_HOME/bin:\$PATH" > /etc/profile.d/tomcat.sh # cat /etc/profile.d/tomcat.sh export CATALINA_HOME=/usr/local/tomcat export PATH=$CATALINA_HOME/bin:$PATH # . /etc/profile.d/tomcat.sh
由于tomcat是通過java編寫的javaweb容器,所以在運行tomcat之前,需要準備好jdk環境,設置好JAVA_HOME和PATH環境變量。
以下的內容通過源碼包方式。
tomcat的主要目錄和文件。
bin/ 二進制文件目錄。 - catalina.sh - ... conf/ 配置文件目錄。 - catalina.policy Java相關的安全策略配置文件; - catalina.properties Tomcat內部package的定義及訪問相關的控制; - context.xml 所有host的默認配置信息; - logging.properties 日志記錄器相關; - server.xml Tomcat的主配置文件,包含Service, Connector, Engine, Realm, Valve, Hosts主組件的相關配置信息; - tomcat-users.xml Realm認證時用到的相關角色、用戶和密碼等信息; - web.xml 遵循Servlet規范標準的配置文件; lib/ class類庫文件目錄。 - catalina.jar - ... logs/ tomcat的日志目錄。 temp/ 臨時文件目錄。 webapps/ 應用程序的默認存放目錄。 - docs - examples - host-manager - manager - ROOT 一般來說,當前版本所使用的APP會被通過ROOT來軟鏈接。 ├── images/ 圖片文件目錄 │ ├── void.gif │ └── ... ├── META-INF/ 相當于一個信息包,用來配置應用程序、擴展程序、類加載器和服務manifest.mf文件,在用jar打包時自動生成。 ├── index.jsp JSP的默認文件,一般是默認主頁。 └── WEB-INF/ ├── classes/ 包含了站點所有用的 class 文件,包括 servlet class 和非servlet class,他們不能包含在 .jar文件中,編譯成class的類庫。 ├── lib/ 存放web應用需要的各種JAR文件,放置僅在這個應用中要求使用的jar文件,如數據庫驅動jar文件。 ├── ... └── web.xml Web應用程序配置文件,描述了 servlet 和其他的應用組件配置及命名規則。 work/ tomcat的工作目錄,存放了已經編譯好了的文件等。
catalina.sh
[root@web1 bin]# catalina.sh --help catalina.sh是tomcat的主要管理腳本。 Using CATALINA_BASE: /usr/local/tomcat 可以這邊列出了CATALINA的一些ENV變量的值。 Using CATALINA_HOME: /usr/local/tomcat Using CATALINA_TMPDIR: /usr/local/tomcat/temp Using JRE_HOME: /usr/java/latest Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar Usage: catalina.sh ( commands ... ) 以下就是catalina.sh的命令使用幫助。 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? Note: Waiting for the process to end and use of the -force option require that $CATALINA_PID is defined
由于java編寫的程序,實際上通過給java傳遞參數來實現運行的,也就是說要將代碼傳遞給java程序來運行,所以,實際上catalina.sh這個腳本就是專門用來管理tomcat并實現簡易化傳遞參數的,并整合了tomcat的bin/目錄下的其他腳本。
server.xml
server.xml的基本結構: <server> <service> <connect /> <connect /> <engine> <host> <context /> <Logger /> <valve /> <Realm /> </host> </engine> </service> </server> ---------------------------------------------------------------------------------------- 文件具體的解析: <?xml version='1.0' encoding='utf-8'?> 定義了xml的版本和采用的編碼。 <Server port="8005" shutdown="SHUTDOWN"> 定義在tomcat關閉時,傳遞給shutdown監聽端口8005的字符串"SHUTDOWN". <Listener className="org.apache.catalina.startup.VersionLoggerListener" /> 類庫的調用和參數傳遞。 <Listener className="org.apache.catalina.security.SecurityListener" /> <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" /> <Listener className="org.apache.catalina.core.JasperListener" /> <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" /> <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" /> <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" /> <GlobalNamingResources> GlobalNamingResources定義了服務器的全局JNDI資源來調用java API結構。 <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> <Service name="Catalina"> 定義了service的name。 <Connector port="8080" protocol="HTTP/1.1" http的連接器; 每一個連接器類似于定義了不同的端口,不同的協議來接收用戶請求。 connectionTimeout="20000" redirectPort="8443" /> <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> ajp的連接器。 <!-- <Connector executor="tomcatThreadPool" tomcat的線程池關聯的連接器。 port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> <Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol" https的連接器相關。 maxThreads="150" SSLEnabled="true" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" /> --> <Engine name="Catalina" defaultHost="web1"> engine段,定義了engine name和訪問/時,默認指向的虛擬主機。 <Realm className="org.apache.catalina.realm.LockOutRealm"> 安全上下文,基于UserDatabase文件(通常是tomcat-user.xml)實現用戶認證。 <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/> </Realm> <Host name="localhost" appBase="webapps" 默認的虛擬主機localhost,指向了tomcat的默認頁面。 unpackWARs="true" autoDeploy="true"> name虛擬主機名稱,appbase程序的目錄,unpackWARs自動展開WAR文件,autoDeploy熱部署。 <Valve className="org.apache.catalina.valves.AccessLogValve" directory="/web/log" valve定義了日志相關。 prefix="localhost_access_log." suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> </Host> <Host name='web1' appBase='/web/data' unpackWARs='ture' autoDeploy='false'> 第二個虛擬主機web1。 <Valve className="org.apache.catalina.valves.AccessLogValve" directory="/web/log" prefix="web1_access_log." suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> <Valve className="org.apache.catalina.valves.RemoteAddrValve" deny="127\.0\.0\.1"/> <!-- 此處通過valve中的類RemoteAddrValve定義了基于ip的訪問控制,拒絕了本地訪問,類RemoteHostValve則是基于主機名的訪問控制 當然其實此處的訪問控制僅為演示,實際上并沒有什么特殊意義!--> <Context path='/' docBase='/web/data/hp' /> 定義了一個訪問路徑,如果訪問/,相對應的路徑為/web/data/hp </Host> </Engine> </Service> </Server>
valve等內嵌段如果沒有什么其他配置,可以通過/>的方式直接閉合;
此處只是列出了一部分的常用配置,更加詳細的配置請參考官方文檔或者google來自行擴展設置;
還有非常多的classname能夠實現各種各樣的功能,認證等,請自行查閱官方文檔。
tomcat.conf (rpm) 或 /etc/sysconfig/tomcat (code)
JAVA_OPS='' 傳遞給java的額外參數,例如: JAVA_OPS='-XMX30m -XMS20m -XX:MaxNewSize=20m'
設定tomcat默認頁上的管理認證
vim tomcat/conf/tomcat-users.xml <role rolename="manager-gui"/> 定義角色;manager-gui <role rolename="manager-script"/> <role rolename="standard"/> <role rolename="admin-gui"/> admin-gui; <user username="tomcat" password="secret" roles="admin-gui,manager-script,standard,admin-gui"/> 定義認證用戶以及屬于的角色。 <user username="" pa... /> 可定義多個用戶。
設定tomcat的默認頁
vim tomcat/conf/web.xml <welcome-file-list> <welcome-file>index.jsp</welcome-file> 第一順位 <welcome-file>index.html</welcome-file> 第二 <welcome-file>index.htm</welcome-file> 第三 </welcome-file-list>
總結和問題
問題
1.訪問文件404,可以看看是不是你的appbase定義錯了,并且查看docbase是否有錯誤,有些時候可以嘗試增減’/web/data/hp/’最后這個/來實驗一下。
2.推薦使用絕對路徑,因為有些時候使用相對路徑會產生一些沖突,比如果你在host中定義了appbase為app,如果在docbase中定義為web,并且path也是web,就會產生沖突,認為你去訪問了app/web/web路徑。
3.訪問不到,可以檢查一下是否設定好了selinux和iptables,并且url有沒有指定你設定的端口,不同的連接器,端口也是不一樣的。
4.ss -tnlp看一下端口是否啟動了。
總結和其他
1.tomcat是一個可以選擇運行為單進程模式或者是master/slave的process模式的,但是官方推薦還是使用單進程減少故障的出錯率。
2.其實我們在使用tomcat時,不會讓tomcat直接面相用戶,也就是說不會讓用戶直接訪問8080,也不改動端口為80,而是在本機上加一個httpd或者nginx代理,將所有80端口的訪問轉到8080來處理,這樣子前端的web服務就可以用來專門建立連接。
3.所以其實tomcat有兩種運行方式,一種方式就是直接面向請求,另外一種就是使用代理來面向請求。
4.至于整合tomcat和nginx或者httpd又或者haporxy放到后面的博客中會仔細闡述實現方式,已經常用的架構。
原創文章,作者:Net18_肖肖,如若轉載,請注明出處:http://www.www58058.com/19869