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

相關推薦

  • shell精講

    shell精講 shell變量        定義變量時,變量名不加美元符號($,PHP語言中變量需要) 注意,變量名和等號之間不能有空格,這可能和你熟悉的所有編程語言都不一樣。同時,變量名的命名須遵循如下規則: 首個字符必須為字母(a-z,A-Z)。 中間不能有空格,可以使用下劃線(_)。 不能使…

    Linux干貨 2016-08-21
  • 網絡管理之網絡配置

    一:博客 1 centos6網卡別名 在Linux系統中,我們可以在一塊物理網卡上配置多個IP地址,以此來實現類似子接口的功能,我們稱之為網卡別名。 設置網卡別名,先在/etc/sysconfig/network-scripts目錄下將eth0文件復制名為eth0:1的文件,復制文件中的1可隨意設置,但為方便管理建議按順序排列 注意要修改ifcfg-eth0…

    Linux干貨 2016-09-05
  • 馬哥教育網絡班22期-第6周博客作業

    1、復制/etc/rc.d/rc.sysinit文件至/tmp目錄,將/tmp/rc.sysinit文件中的以至少一個空白字符開頭的行的行首加#; [root@centos6 ~]# cp /etc/rc.d/rc.sysinit /tmp/ [root@centos6 ~]# sed -…

    Linux干貨 2016-12-05
  • 幾個有意思的小腳本

    ①.用腳本畫一個圣誕樹 效果 ②.用腳本畫一個類似國際象棋的棋盤 半成品效果 再像這樣在下面多寫幾個循環,就可以了,我這個方法太笨,全寫完要截圖的太多,就放一部分意思下 ③.編寫一個腳本,打印出九九乘法表 效果 ④.編寫一個腳本,可接收一個 1-7 的數字作為參數,用 if 和 case 兩種方法實現根據輸入的數字輸出對應星期的英文 用if的方法 用case…

    2017-05-11
  • Linux任務計劃、周期性執行任務

    Linux任務計劃、周期性執行任務 在未來指定的時間點執行一次某任務:at、batch 周期性的執行某個任務:crontab執行結果會以郵件形式發送給用戶 如何查看郵件服務是否啟用~ ]# ss -tnl mail 命令: mail [-s ‘郵件名’]+ USERNAME 郵件文件的生成: (1) 交互式輸入: ctrl+d結束或者 以 . 單獨成行 (2…

    Linux干貨 2017-08-16
  • 馬哥教育網絡班21期+第14周課程練習

    iptables關鍵點 表:filter(過濾,防火墻);nat(網絡地址轉換);mangle(拆解報文,做出修改,封裝報文);raw(關閉nat表啟用的鏈接追蹤機制);上述是根據功能來區分的,寫規則要明白要實現的功能 鏈:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING 數據流向:流入PREROUTING–…

    Linux干貨 2016-08-26
欧美性久久久久