馬哥教育網絡班21期+第19周課程練習

1、描述Tomcat的架構;

Tomcat組件,分為4類:

  • 頂層類組件:包括<Server>元素和<Service>元素,它們位于整個配置文件的頂層;

  • 連接器類組件:為<Connector>元素,代表介于客戶端與服務器端之間的通信接口,負責將客戶端的請求發送給服務器端,并將服務器的響應結果返回給客戶端;

  • 容器類組件:代表處理客戶端請求并生成響應結果的組件,共有四類,分別為<Engine>、<Host><Context><Cluster>元素。Engine組件為特定的Service組件處理所有客戶端請求,Host組件為特定的虛擬主機處理所有的客戶端請求,Context組件為特定的Web應用處理所有的客戶端請求。Cluster組件負責為Tomcat集群系統進行會話復制、Context組件的屬性的復制,以及集群范圍內WAR文件的發布。

  • 嵌套類組件:代表可以被嵌入到容器中的組件,如<Valve>元素和<Realm>元素等。

Tomcat元素:

  • <Server>元素:代表整個Servlet容器組件,是Tomcat的頂級元素。在<Server>元素中可包含一個或多個<Service>元素;

  • <Service>元素:包含一個<Engine>元素,以及一個或多個<Connector>元素,這些<Connector>元素共享同一個<Engine>元素;

  • <Connector>元素:代表和客戶端實際交互的組件,負責接收客戶端請求,以及向客戶端返回響應結果;

  • <Engine>元素:每個<Service>元素只能包含一個<Engine>元素。<Engine>元素處理在同一個<Service>中所有<Connector>元素接收到的客戶端請求;

  • <Host>元素:在一個<Engine>元素中可以包含多個<Host>元素。每個<Host>元素定義了一個虛擬主機,它可以包含一個或多個Web應用;

  • <Context>元素:每個<Context>元素代表了運行在虛擬主機上的單個Web應用。在一個<Host>元素中可以包含多個<Context>元素。

tomcat架構.png

2、詳細解釋Tomcat的配置文件及配置文件中的參數所代表的含義;

server.xml

<Server port="8005" shutdown="SHUTDOWN">
    <!--Server元素代表整個Catalina Servlet容器,是Tomcat實例的頂級元素;
    port,指定Tomcat服務器監聽shutdown命令的端口;
    shutdown,指定當終止Tomcat服務器時,發送給它的shutdown監聽端口的字符串。 -->
  <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
      <!-- className,指定實現此Server接口的類。-->

  <Service name="Catalina">
      <!-- Service元素用于關聯一個引擎和與此引擎相關的連接器;
      name,用于定義Service的名字;
      className,指定實現此Service接口的類-->
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
        <!-- Connector元素是與客戶端交互的組件;
        port,設定監聽端口號;
        protocol,設定使用的協議;
        connectionTimeout,定義超時時長,以毫秒為單位;
        redirectPort,如果某連接器支持的協議是http,當接收到https請求時,轉發至此屬性定義的端口;
        enableLookups,是否支持服務器對客戶端進行域名解析。 -->


    <Connector port="8443" protocol="org.apache.coyote.http11.Http11AprProtocol"
               maxThreads="150" SSLEnabled="true" >
        <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
        <SSLHostConfig>
            <Certificate certificateKeyFile="conf/localhost-rsa-key.pem"
                         certificateFile="conf/localhost-rsa-cert.pem"
                         certificateChainFile="conf/localhost-rsa-chain.pem"
                         type="RSA" />
        </SSLHostConfig>
    </Connector>
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

    <Engine name="Catalina" defaultHost="localhost">
        <!-- Engine是Servlet處理器的一個實例,即Servlet引擎;
        name,定義Engine的名字;
        defaultHost:指定處理客戶端請求的默認主機名;
        jvmRoute,定義Tomcat路由標示。 -->

      <Realm className="org.apache.catalina.realm.LockOutRealm">

        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase"/>
      </Realm>

      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
          <!-- 定義用于接收客戶端請求并進行相應處理的主機或虛擬主機;
          name,定義虛擬主機的名字;
          appBase,指定虛擬主機的目錄,可以指定絕對路徑,也可以指定相對于<CATALINA_HOME>的相對路徑;
          unpackWARs,在啟用此WebApp時是否對WAR格式的歸檔文件先進行展開;
          autoDeploy,在Tomcat處于運行狀態時放置于appBase目錄下的應用程序文件是否自動進行部署;
          alias,指定虛擬主機的別名,可以指定多個別名。 -->
          <Context path="/bbs"
            docBase="/web/threads/bbs"
            reloadable="true">
         </Context>
            <!-- Context在某些意義上類似于apache中的路徑別名,一個Context定義用于標識Tomcat實例中的一個Web應用程序;
            path,指定訪問該Web應用的URL(相對于此Web服務器根路徑)入口,如果為"",則表示為此Webapp的根路徑;
            docBase,指定Web應用的存放位置;
            reloadable,是否允許重新加載此context相關的Web應用程序相關的類; -->

        <Valve className="org.apache.catalina.authenticator.SingleSignOn" />

        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log" suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />
      </Host>
    </Engine>
  </Service>
</Server>

web.xml基于Java Servlet規范,可被用于每一個Java servlet容器,通常有兩個存放位置,$CATALINA_BASE/conf和每個Web應用程序(通常是WEB-INF/web.xml)。Tomcat在deploy一個應用程序時(包括重啟或重新載入),它首先讀取conf/web.xml,而后讀取WEB-INF/web.xml。

tomcat-user.xml用于實現對Tomcat資源的訪問控制,如manager-gui,admin-gui。

<role rolename="manager-gui" />
<role rolename="admin-gui" />
<user username="tomcat" password="tomcat" roles="manager-gui,admin-gui" />

3、配置Apache通過mod_proxy模塊與Tomcat連接的詳細過程;

配置:

apache主機:
    hostname: node4.magedu.com 
    ip:192.168.71.130
tomcat主機:
    hostname: node3.magedu.com
    ip:192.168.71.133

前提:

apache主機:
    # httpd -M | grep proxy
    proxy_module (shared)
    proxy_ajp_module (shared)
    proxy_balancer_module (shared)
    proxy_http_module (shared)

apache與tomcat的http連接器進行整合:

禁用中心主機

vim /etc/httpd/conf/httpd.conf
#DocumentRoot "/var/www/html"//-->注釋掉該項

創建虛擬主機

vim /etc/httpd/conf.d/proxy_mod.http.conf
<VirtualHost *:80>
    ServerName node3.magedu.com
    ProxyVia On
    ProxyRequests Off
    ProxyPreserveHost On
    <Proxy *>
        Require all granted
    </Proxy>
    ProxyPass / http://192.168.71.133:8080/
    ProxyPassReverse / http://192.168.71.133:8080/
    <Location />
        Require all granted
    </Location>
</VirtualHost>

apache與tomcat的ajp連接器進行整合:

vim /etc/httpd/conf.d/proxy_mod.ajp.conf
<VirtualHost *:80>
    ServerName node3.magedu.com
    ProxyVia On
    ProxyRequests Off
    ProxyPreserveHost On
    <Proxy *>
        Require all granted
    </Proxy>
    ProxyPass / http://192.168.71.133:8009/
    ProxyPassReverse / http://192.168.71.133:8009/
    <Location />
        Require all granted
    </Location>
</VirtualHost>

相關指令詳解:

ProxyPreserveHost {On|Off}:如果啟用此功能,代理會將用戶請求報文中的Host:行發送給后端的服務器,而不再使用ProxyPass指定的服務器地址。如果想在反向代理中支持虛擬主機,則需要開啟此項,否則就無需打開此功能。

ProxyVia  {On|Off|Full|Block}:用于控制在http首部是否使用Via:,主要用于在多級代理中控制代理請求的流向。默認為Off,即不啟用此功能;On表示每個請求和響應報文均添加Via:;Full表示每個Via:行都會添加當前apache服務器的版本號信息;Block表示每個代理請求報文中的Via:都會被移除。

ProxyRequests {On|Off}:是否開啟apache正向代理的功能;啟用此項時為了代理http協議必須啟用mod_proxy_http模塊。同時,如果為apache設置了ProxyPass,則必須將ProxyRequests設置為Off。

ProxyPass  [path]  !|url  [key=value key=value ...]]:將后端服務器某URL與當前服務器的某虛擬路徑關聯起來作為提供服務的路徑,path為當前服務器上的某虛擬路徑,url為后端服務器上某URL路徑。使用此指令時必須將ProxyRequests的值設置為Off。需要注意的是,如果path以“/”結尾,則對應的url也必須以“/”結尾,反之亦然。

另外,mod_proxy模塊在httpd 2.1的版本之后支持與后端服務器的連接池功能,連接在按需創建在可以保存至連接池中以備進一步使用。連接池大小或其它設定可以通過在ProxyPass中使用key=value的方式定義。常用的key如下所示:
◇ min:連接池的最小容量,此值與實際連接個數無關,僅表示連接池最小要初始化的空間大小。
◇ max:連接池的最大容量,每個MPM都有自己獨立的容量;都值與MPM本身有關,如Prefork的總是為1,而其它的則取決于ThreadsPerChild指令的值。
◇ loadfactor:用于負載均衡集群配置中,定義對應后端服務器的權重,取值范圍為1-100。
◇ retry:當apache將請求發送至后端服務器得到錯誤響應時等待多長時間以后再重試。單位是秒鐘。

4、配置基于mod_jk的負載均衡;

配置

apache主機:
    node4.magedu.com 192.168.71.130
TomcatA主機:
    node3.magedu.com 192.168.71.133
TomcatB主機:
    node5.magedu.com 192.168.71.128

前提:編譯mod_jk時需用到apxs,所以預先安裝httpd-devel,之后編譯安裝mod_jk。

apache主機:
    # yum install -y httpd-devel
    # whereis apxs
    /usr/bin/apxs
    # tar xf tomcat-connectors-1.2.40-src.tar.gz 
    # cd tomcat-connectors-1.2.40-src/native/
    # ./configure --with-apxs=/usr/bin/apxs 
    # make && make install
TomcatA主機:
    # vim server.xml
    <Engine name="Catalina" defaultHost="localhost" jvmRoute="TomcatA">
TomcatB主機:
    # vim server.xml
    <Engine name="Catalina" defaultHost="localhost" jvmRoute="TomcatB">

配置基于mod_jk的負載均衡

# vim /etc/httpd/conf.d/http-jk.conf
LoadModule jk_module modules/mod_jk.so
JkWorkersFile /etc/httpd/conf.d/workers.properties
JkLogFile logs/mod_jk.log
JkLogLevel debug
JkMount */ lbcluster1
JkMount /status/ stat1

# vim /etc/httpd/conf.d/workers.properties
worker.list=lbcluster1,stat1
worker.TomcatA.type=ajp13
worker.TomcatA.host=192.168.71.133
worker.TomcatA.port=8009
worker.TomcatA.lbfactor=1
worker.TomcatB.type=ajp13
worker.TomcatB.host=192.168.71.128
worker.TomcatB.port=8009
worker.TomcatB.lbfactor=1
worker.lbcluster1.type=lb
worker.lbcluster1.sticky_session=0
worker.lbcluster1.balance_workers=TomcatA,TomcatB
worker.stat1.type=status

啟動服務,進行測試成功!

5、配置Tomcat集群,能夠實現用戶的session會話保持。

為node3和node5節點配置使用deltamanager:

將以下內容復制到server.xml中的Host組件中,主要修改的處為Receiver的address,若主機配置有多個ip,在默認auto情況下會報錯,最好將其修改為服務監聽的ip。

    <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
             channelSendOptions="8">

      <Manager className="org.apache.catalina.ha.session.DeltaManager"
               expireSessionsOnShutdown="false"
               notifyListenersOnReplication="true"/>

      <Channel className="org.apache.catalina.tribes.group.GroupChannel">
        <Membership className="org.apache.catalina.tribes.membership.McastService"
                    address="228.0.1.14"
                    port="45564"
                    frequency="500"
                    dropTime="3000"/>
        <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                  address="192.168.71.133"
                  port="4000"
                  autoBind="100"
                  selectorTimeout="5000"
                  maxThreads="6"/>

        <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
          <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
        </Sender>
        <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
        <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor"/>
      </Channel>

      <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
             filter=""/>
      <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>

      <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
                tempDir="/tmp/war-temp/"
                deployDir="/tmp/war-deploy/"
                watchDir="/tmp/war-listen/"
                watchEnabled="false"/>

      <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
    </Cluster>

為需要使用Session Cluster的WebApp開啟Session Distribution的功能:

在此WebApp的WEB-INF目錄下的web.xml添加
    <distributable/>

兩點注意:

  1. 應根據Tomcat的版本選擇對應的配置,在試驗中失敗了幾次,配置文件檢查時出現Error,主要是由于試驗時的Tomcat版本是8.5,而配置文件段使用的是Tomcat8.0的;

  2. 在為使用Session Cluster的WebApp開啟Session Distribution的功能時,添加到的配置文件非WebApp的web.xml,導致不能實現會話保持。

原創文章,作者:Jeason,如若轉載,請注明出處:http://www.www58058.com/62234

(0)
JeasonJeason
上一篇 2016-12-05
下一篇 2016-12-05

相關推薦

  • 第四周作業

    1、復制/etc/skel目錄為/home/tuser1,要求/home/tuser1及其內部文件的屬組和其它用戶均沒有任何訪問權限。                 使用到命令chmod &nbsp…

    Linux干貨 2017-02-02
  • http

    練習:分別使用CentOS 7和CentOS 6實現以下任務 一、配置三個基于名稱的虛擬主機          (a) discuzX          (b) wordpress  &nb…

    Linux干貨 2016-10-09
  • 用戶和組的簡介

     在第二周的學習中,關于用戶和組是一個難點,也是重點,本篇博客則是對用戶和組的簡單闡述,如有錯誤或不足還請各位大牛指出,在此謝過! 1、用戶 # 1.1用戶的定義      通過前面對Linux 多用戶的理解,我們明白Linux 是真正意義上的多用戶操作系統,所以我們能在Linux系統中建若干用戶(…

    Linux干貨 2017-07-22
  • HAProxy實戰(一)

    實驗目的 測試基于haproxy的反代和負載均衡配置 測試keepalived高可用haproxy的效果 實驗要點 (1) 動靜分離discuzx,動靜都要基于負載均衡實現;(2) 進一步測試在haproxy和后端主機之間添加varnish緩存;(3) 給出拓撲設計;(4) haproxy的設定要求: (a) 啟動stats;(b) 自定義403、502和5…

    Linux干貨 2017-02-13
  • linux網絡管理

    什么是計算機網絡     計算機網絡是指將不同地理位置上,具有獨立功能的計算機和網絡設備通過通信鏈路連接起來,通過操作系統,網絡管理軟件,和網絡通信協議的共同組合下的計算機系統團體,實現資源共享,信息傳遞的網絡。計算機網絡的組成部分有各種微小大型計算機,網橋,交換機,路由器,傳輸介質等網絡設備,相應的軟件系統,相應的通…

    Linux干貨 2016-09-05
  • Linux下which、locate、find 命令查找文件

    在Linux下我們經常要查找某個文件,但是又不記得文件位置,可以使用一些命令來搜索,目前接觸到的文件命令有以下幾個 which 查看可執行文件的位置 locate 基于數據庫查找文件位置 find 實時搜索文件 1、 Which   語法:which 可執行二進制文件名稱   Which是通過PATH環境變量查找文件的,在PATH 指定的…

    2017-08-14
欧美性久久久久