tomcat

tomcat


  • 簡述

  • tomcat的結構

  • tomcat配置

  • 總結與問題


簡述

什么是tomcat?

tomcat是一個java2ee的web容器的殘缺實現,提供了serverlet,asp轉換等組件。

tomcat的功能?

tomcat能夠將asp文件通過轉換,轉換為serverlet格式,這樣子就可以被java識別運行并將結果轉為asp響應,并且tomcat其實也是內置了一個web服務器。

tomcat的結構

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 &quot;%r&quot; %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 &quot;%r&quot; %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

(0)
Net18_肖肖Net18_肖肖
上一篇 2016-06-24 12:47
下一篇 2016-06-24 21:31

相關推薦

  • 網絡分層基礎概念與TCP,IP協議解析

    網絡分層基礎概念:   與ISO的OSI網絡分層模型不同。網絡分層事實上的標準為TCP/IP 的網絡分層模型。   下圖是他們是他們之間的對應關系。   左邊為OSI網絡分層模型。右邊為TCP/IP的網絡分層模型。 網絡分層,是將一個大而復雜的網絡,拆分為多個層次,每個層次單獨完成自己的任務,多個層次再結合起來,完成一個復雜的通…

    2017-05-04
  • iptables實驗3 關于內網外網的地址轉換及端口轉換

    地址屬于內核,而不屬于網卡?。。?!     網絡防火墻的實現(主要是forward鏈) 172.16.100.68(A)和172.16.100.67(B) 192.168.12.10(B)和192.168.12.77(C)(VNET2) B作為C的網關   配置B主機的網卡一個為192.168.1.72,另一個為172.16.2…

    Linux干貨 2016-10-30
  • 馬哥教育網絡班20期+第2周課程練習

    1、Linux上的文件管理類命令都有哪些,其常用的使用方法及其相關示例演示。   答:文件操作     ls 列出目錄下的文件名      ls -l /     touch 文件不存在時生成該文件      touch a.txt   &…

    Linux干貨 2016-06-23
  • LNAMP Shell 部署腳本

    LNAMP Shell 部署腳本 學習總結: 這個腳本,早期是出于對個人學習Shell的總結而寫,應該有些年頭了,目前也在一邊學馬哥視頻的基礎上陸續完善,10月初才完成LNAMP環境的分離式部署,并減少整個Shell腳本各部分的依賴關系。 我是網絡班13期高級班的學員,因個人做了幾年Linux運維,所以目前整個高級班的課程,我是跳著看了集群(LVS + Ke…

    Linux干貨 2015-10-27
  • 電子眼find

     1、摩根定律。         話不多說,先上圖。          如圖:A和B交集為3    A = 4 + 3  &nbs…

    Linux干貨 2016-08-16
  • 文件查看及查找命令

    cat  查看一個文件   -E: 顯示行結束符$   -n: 對顯示出的每一行進行編號   -A:顯示所有控制符   -b:非空行編號   -s:壓縮連續的空行成一行   -T:顯示制表符 常用:cat -An /et…

    Linux干貨 2017-04-08
欧美性久久久久