tomcat

  • 編程語言:

    • 硬件級:微碼編程,匯編語言
    • 系統級:C,C++,…
    • 應用級:Java, PHP, Python, Ruby, Perl, C#, …
  • 程序:指令+數據

    • 過程式編程:以指令為中心,數據服務于代碼;
    • 對象式編程:以數據為中心,指令服務于數據;

java

  • Java代碼的運行:
    *.java(source code) –> javac –> *.class(bytecode)
    jvm:class loader,加載程序的類文件,及程序的類文件依賴到的其它的類文件而后運行; 整個運行表現為一個jvm進程;

  • java技術體系

    • Java編程語言
    • Java Class文件格式
    • Java API
    • Java VM

      • class loader
      • 執行引擎
    • JVM運行時區域:

      • 方法區:線程共享; 用于存儲被JVM加載的class信息、常量、靜態變量、方法等;
      • 堆:是jvm所管理的內存中占用空間最大的一部分;也是GC管理的主要區域;存儲對象;
      • Java棧:線程私有,存儲 線程自己的局部變量;
      • PC寄存器:線程私有的內存空間,程序的指令指針;
      • 本地方法棧
  • 安裝JDK

    • 了解當前的java環境:
      ~]# java -version

    • OpenJDK:

      • java-VERSION-openjdk:
        The OpenJDK runtime environment.
      • java-VERSION-openjdk-headless:
        The OpenJDK runtime environment without audio and video support.
      • java-VERSION-openjdk-devel:
        The OpenJDK development tools.

        注意:多版本并存時,可使用 alternatives命令設定默認使用的版本;

    • Oracle JDK:

      • 安裝相應版本的rpm包;jdk-VERSION-OS-ARCH.rpm

        示例:jdk-1.8.0_25-linux-x64.rpm

        注意:安裝完成后,要配置JAVA_HOME環境變量,指向java的安裝路徑;

        OpenJDK:
          JAVA_HOME=/usr
        Oracle JDK:
          JAVA_HOME=/usr/java/jdk_VERSION
        
        示例:
          /etc/profile.d/java.sh
          export JAVA_HOME=/usr/java/latest
          export PATH=$JAVA_HOME/bin:$PATH
  • Java 2 EE:

    • Servlet:

      • 類庫;web app;
      • Servlet container, Servlet Engine
    • JSP: Java Server Page

      <html>
        <title>TITLE</title>
        <body>
            <h1>...</h1>
            <%
                ... java code...
            %>
        </body>
      </html>
    • jsp文件的實現過程:index.jsp –> (jasper) –> index.java –> (javac) –> index.class –> jvm(engine)

      注意:基于jasper將靜態輸出的數據轉為java代碼進行輸出,結果為servlet規范的代碼;

    • JSP Container:JSP + Servlet Container

      • 商業實現:
        WebSphere, WebLogic, Oc4j, Glassfish, Geronimo, JOnAS, JBoss, …
      • 開源實現:
        Tomcat, Jetty, Resin, …
        Tomcat: Java 2 EE技術體系的不完整實現;

Tomcat

  • 安裝Tomcat:

    • Base Repo:

      tomcat, tomcat-lib, tomcat-admin-webapps, tomcat-webapps, tomcat-docs-webapp
    • Tomcat binary release

      # tar xf apache-tomcat-VERSION.tar.gz  -C /usr/local/
      # cd /usr/local
      # ln -sv apache-tomcat-VERSION  tomcat
      
      /etc/profile.d/tomcat.sh 
        export CATALINA_BASE=/usr/local/tomcat
        export PATH=$CATALINA_BASE/bin:$PATH
      
      . /etc/profile.d/tomcat.sh
  • tomcat程序環境:

    • 解壓安裝tomcat

      tomcat的目錄結構
        bin:腳本,及啟動時用到的類;
        conf:配置文件目錄;
        lib:庫文件,Java類庫,jar;
        logs:日志文件目錄;
        temp:臨時文件目錄;
        webapps:webapp的默認目錄;
        work:工作目錄;
      • /tomcat/bin/catalina.sh

        ~]# catalina.sh --help
          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?
    • rpm包安裝的程序環境:

      • 配置文件目錄:/etc/tomcat

        • 主配置文件:server.xml
      • webapps存放位置:/var/lib/tomcat/webapps/

        examples
          manager
          host-manager
          docs
      • Unit File:tomcat.service
      • 環境配置文件:/etc/sysconfig/tomcat
    • tomcat的配置文件構成:

      • server.xml:主配置文件;
      • web.xml:每個webapp只有“部署”后才能被訪問,它的部署方式通常由web.xml進行定義,其存放位置為WEB-INF/目錄中;此文件為所有的webapps提供默認部署相關的配置;
      • context.xml:每個webapp都可以專用的配置文件,它通常由專用的配置文件context.xml來定義,其存放位置為WEB-INF/目錄中;此文件為所有的webapps提供默認配置;
      • tomcat-users.xml:用戶認證的賬號和密碼文件;
      • catalina.policy:當使用-security選項啟動tomcat時,用于為tomcat設置安全策略;
      • catalina.properties:Java屬性的定義文件,用于設定類加載器路徑,以及一些與JVM調優相關參數;
      • logging.properties:日志系統相關的配置;
    • Tomcat的核心組件:server.xml

      <Server>
                ...
            </Server>
            ...
            <Server>
                <Service>
                    ...
                </Service>
                ...
                <Service>
                    <connector/>
                    <connector/>
                    ...
                    <Engine>
                        <Host>
                            <Context/>
                            <Context/>
                            ...
                        </Host>
                        <Host>
                            ...
                        </Host>
                        ...
                    </Engine>
                </Service>
            </Server>
      • 每一個組件都由一個Java“類”實現,這些組件大體可分為以下幾個類型:
        頂級組件:Server
        服務類組件:Service
        連接器組件:http, https, ajp(apache jserv protocol)
        容器類:Engine, Host, Context
        被嵌套類:valve, logger, realm, loader, manager, …
        集群類組件:listener, cluster, …
    • JSP WebAPP的組織結構

      /: webapps的根目錄
        index.jsp:主頁;
        WEB-INF/:當前webapp的私有資源路徑;通常用于存儲當前webapp的web.xml和context.xml配置文件;
        META-INF/:類似于WEB-INF/;
        classes/:類文件,當前webapp所提供的類;
        lib/:類文件,當前webapp所提供的類,被打包為jar格式;
    • webapp歸檔格式:

      • .war:webapp
        .jar:EJB的類打包文件;
        .rar:資源適配器類打包文件;
        .ear:企業級webapp;
  • 部署(deploy)webapp的相關操作:

    • deploy:將webapp的源文件放置于目標目錄(網頁程序文件存放目錄),配置tomcat服務器能夠基于web.xml和context.xml文件中定義的路徑來訪問此webapp;將其特有的類和依賴的類通過class loader裝載至JVM;

      • 自動部署:auto deploy
        手動部署:

        • 冷部署:把webapp復制到指定的位置,而后才啟動tomcat;
        • 熱部署:在不停止tomcat的前提下進行部署;
          部署工具:manager、ant腳本、tcd(tomcat client deployer)等;
    • undeploy:反部署,停止webapp,并從tomcat實例上卸載webapp;
    • start:啟動處于停止狀態的webapp;
    • stop:停止webapp,不再向用戶提供服務;其類依然在jvm上;
    • redeploy:重新部署;
  • 手動提供一測試類應用,并冷部署:
    ~]# mkidr -pv /usr/local/tomcat/webapps/test/{classes,lib,WEB-INF}
    創建文件/usr/local/tomcat/webapps/test/index.jsp

    <%@ page language="java" %>
      <%@ page import="java.util.*" %>
      <html>
          <head>
              <title>Test Page</title>
          </head>
          <body>
              <% out.println("hello world");
              %>
          </body>
      </html>
  • tomcat的兩個管理應用:

    • manager
      host-manager
  • tomcat的常用組件配置:

    • Server:代表tomcat instance,即表現出的一個java進程;監聽在8005端口,只接收“SHUTDOWN”。各server監聽的端口不能相同,因此,在同一物理主機啟動多個實例時,需要修改其監聽端口為不同的端口;

    • Service:用于實現將一個或多個connector組件關聯至一個engine組件;

    • Connector組件:

      • 負責接收請求,常見的有三類http/https/ajp;

      • 進入tomcat的請求可分為兩類:

        1. standalone : 請求來自于客戶端瀏覽器;
        2. 由其它的web server反代:來自前端的反代服務器;

          nginx --> http connector --> tomcat 
           httpd(proxy_http_module) --> http connector --> tomcat
           httpd(proxy_ajp_module) --> ajp connector --> tomcat 
           httpd(mod_jk) --> ajp connector --> tomcat
      • 屬性:

        port="8080" 
          protocol="HTTP/1.1"
          connectionTimeout="20000"
        
          address:監聽的IP地址;默認為本機所有可用地址;
          maxThreads:最大并發連接數,默認為200;
          enableLookups:是否啟用DNS查詢功能;
          acceptCount:等待隊列的最大長度;
          secure:
          sslProtocol:
    • Engine組件:Servlet實例,即servlet引擎,其內部可以一個或多個host組件來定義站點; 通常需要通過defaultHost來定義默認的虛擬主機;

      • 屬性:

        name=
          defaultHost="localhost"
          jvmRoute=
    • Host組件:位于engine內部用于接收請求并進行相應處理的主機或虛擬主機,

      示例:

      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
      </Host>
      • 常用屬性說明:

        1. appBase:此Host的webapps的默認存放目錄,指存放非歸檔的web應用程序的目錄或歸檔的WAR文件目錄路徑;可以使用基于$CATALINA_BASE變量所定義的路徑的相對路徑;
        2. autoDeploy:在Tomcat處于運行狀態時,將某webapp放置于appBase所定義的目錄中時,是否自動將其部署至tomcat;
        • 示例:

          <Host name="tc1.magedu.com" appBase="/appdata/webapps" unpackWARs="true" autoDeploy="true">
          </Host>
          
          ~]# mkdir -pv /appdata/webapps
          ~]# mkdir -pv /appdata/webapps/ROOT/{lib,classes,WEB-INF}
          提供一個測試頁即可;
    • Context組件:

      • 示例:

        <Context path=”/PATH” docBase=”/PATH/TO/SOMEDIR” reloadable=””/>

    • Valve組件:

      <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" />
      • Valve存在多種類型:

        • 定義訪問日志:org.apache.catalina.valves.AccessLogValve
        • 定義訪問控制:org.apache.catalina.valves.RemoteAddrValve

          <Valve className=”org.apache.catalina.valves.RemoteAddrValve” deny=”172\.16\.100\.67″/>

    • 綜合示例:

      <Host name="node1.magedu.com" appBase="/web/apps" unpackWARs="true" autoDeploy="true">
            <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
                prefix="node1_access" suffix=".log"
                pattern="%h %l %u %t &quot;%r&quot; %s %b" />
            <Context path="/test" docBase="test" reloadable="">
                <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
                prefix="node1_test_access_" suffix=".log"
                pattern="%h %l %u %t &quot;%r&quot; %s %b" />
            </Context>
        </Host>

會話保持:

  • session sticky

    • source_ip

      • nginx: ip_hash
        haproxy: source
        lvs: sh
    • cookie:

      • nginx:hash
        haproxy: cookie
  • session cluster:delta session manager
  • session server:redis(store), memcached(cache)

  • Tomcat Cluster(session)

    • session sticky
    • session cluster
      tomcat delta manager
    • session server
      memcached

    • Tomcat Cluster

      1. httpd + tomcat cluster
        httpd: mod_proxy, mod_proxy_http, mod_proxy_balancer
        tomcat cluster:http connector
      2. httpd + tomcat cluster
        httpd: mod_proxy, mod_proxy_ajp, mod_proxy_balancer
        tomcat cluster:ajp connector
      3. httpd + tomcat cluster
        httpd: mod_jk
        tomcat cluster:ajp connector
      4. nginx + tomcat cluster
    • BalancerMember:
      BalancerMember [balancerurl] url [key=value [key=value …]]

      • status:

        D: Worker is disabled and will not accept any requests.
          S: Worker is administratively stopped.
          I: Worker is in ignore-errors mode and will always be considered available.
          H: Worker is in hot-standby mode and will only be used if no other viable workers are available.
          E: Worker is in an error state.
          N: Worker is in drain mode and will only accept existing sticky sessions destined for itself and ignore all other requests.
      • loadfactor:負載因子,即權重;
      • lbmethod

        Balancer load-balance method. Select the load-balancing scheduler method to use. Either byrequests, to perform weighted request counting; bytraffic, to perform weighted traffic byte count balancing; or bybusyness, to perform pending request balancing. The default is byrequests.
      • stickysession

        Balancer sticky session name. The value is usually set to something like JSESSIONID or PHPSESSIONID, and it depends on the backend application server that support sessions. If the backend application server uses different name for cookies and url encoded id (like servlet containers) use | to separate them. The first part is for the cookie the second for the path.
          Available in Apache HTTP Server 2.4.4 and later.
    • httpd使用第三方模塊:以mod_jk為例進行說明,(mod_jk沒有rpm包得編譯安裝)

      • 安裝httpd-devel和gcc(可安裝development tools)

      • 編譯安裝模塊:
        關鍵指明httpd的apxs文件的位置,apxs是為httpd安裝第三方模塊提供的一個對接接口.
        –with-apxs

        示例:

        ~]# which apxs
          /usr/bin/apxs
          ~]# ./configure --with-apxs=/usr/bin/apxs
          make & make install
      • 使用模塊:(編輯配置文件)

        示例:

        vi /etc/httpd/conf.modules.d/mod_jk.conf
          loadModule jk_module /usr/lib64/httpd/modules/mod_jk.so
  • Tomcat Session Server (memcached)

    • 支持的session server類型:

      • memcached
        couchbase
        redis
    • memcached:
      memcached is a high-performance, distributed memory object caching system, generic in nature, but intended for use in speeding up dynamic web applications by alleviating database load.

      • 緩存服務器:

        • 緩存:cache,無持久存儲功能;
        • bypass緩存
        • k/v cache,僅支持存儲流式化數據;
        • 旁掛式緩存;
      • 特性:

        • k/v cache:僅可存儲可序列化數據;value:最大不能超過1兆;存儲項:k/v;
        • 智能性一半依賴于客戶端(調用memcached的API開發程序),一半依賴于服務端;
        • 分布式緩存:互不通信的分布式集群;
          分布式系統請求路由方法:取模法,一致性哈希算法;
        • 算法復雜度:O(1)
        • 清理過期緩存項:

          • 緩存耗盡:LRU
          • 緩存項過期:惰性清理機制
      • 安裝配置:

        • 監聽的端口:
          11211/tcp, 11211/udp

        • 主程序:/usr/bin/memcached

        • 配置文件:/etc/sysconfig/memcached
        • Unit File:/usr/lib/systemd/system/memcached.service

        • 協議格式:memcached協議

          • 文本格式
          • 二進制格式
        • 命令:

          • 統計類:stats, stats items, stats slabs, stats sizes
          • 存儲類:set, add, replace, append, prepend

            • 命令格式:<command name> <key> <flags> <exptime> <bytes> <cas unique>
          • 檢索類:get, delete, incr/decr
          • 清空:flush_all

          • 示例

            telnet> add KEY <flags> <expiretime> <bytes> \r
              telnet> VALUE
        • memcached程序的常用選項:

          -m <num>:Use <num> MB memory max to use for object storage; the default is 64 megabytes.
            -c <num>:Use <num> max simultaneous connections; the default is 1024.
            -u <username>:以指定的用戶身份來運行進程;
            -l <ip_addr>:監聽的IP地址,默認為本機所有地址;
            -p <num>:監聽的TCP端口, the default is port 11211.
            -U <num>:Listen on UDP port <num>, the default is port 11211, 0 is off.
            -M:內存耗盡時,不執行LRU清理緩存,而是拒絕存入新的緩存項,直到有多余的空間可用時為止;
            -f <factor>:增長因子;默認是1.25;
            -t <threads>:啟動的用于響應用戶請求的線程數;
        • memcached默認沒有認證機制,可借用于SASL進行認證;

          • SASL:Simple Authentication Secure Layer
        • API:

          php-pecl-memcache
          php-pecl-memcached
          python-memcached
          libmemcached
          libmemcached-devel
        • 命令行工具:
          memcached-tool SERVER:PORT COMMAND
  • Tomcat的常用優化配置:

    1. 內存空間:

      /etc/sysconfig/tomcat
           JAVA_OPTS="-server -Xms32g -Xmx32g -XX:NewSize= -XX:MaxNewSize= -XX:PermSize= -XX:MaxPermSize="
               -server:服務器模型
               -Xms:堆內存初始化大??;
               -Xmx:堆內存空間上限;
               -XX:NewSize=:新生代空間初始化大小;                    
               -XX:MaxNewSize=:新生代空間最大值;
               -XX:PermSize=:持久代空間初始化大??;
               -XX:MaxPermSize=:持久代空間最大值;
    2. 線程池設置:

      <Connector port="8080" protocol="HTTP/1.1"  connectionTimeout="20000" redirectPort="8443" />
      
      常用屬性:
       maxThreads:最大線程數;
       minSpareThreads:最小空閑線程數;
       maxSpareThreads:最大空閑線程數;
       acceptCount:等待隊列的最大長度;
       URIEncoding:URI地址編碼格式,建議使用UTF-8;
       enableLookups:是否啟用dns解析,建議禁用; 
       compression:是否啟用傳輸壓縮機制,建議“on";
       compressionMinSize:啟用壓縮傳輸的數據流最小值,單位是字節;
       compressableMimeType:定義啟用壓縮功能的MIME類型;
           text/html, text/xml, text/css, text/javascript
    3. 禁用8005端口;
      <Server port=”-1″ shutdown=”SHUTDOWN”>

    4. 隱藏版本信息:

      <Connector port="8080" protocol="HTTP/1.1"  connectionTimeout="20000" redirectPort="8443" />
      
       Server="SOME STRING"
  • JVM常用的分析工具:

    jps:用來查看運行的所有jvm進程;
      jinfo:查看進程的運行環境參數,主要是jvm命令行參數;
      jstat:對jvm應用程序的資源和性能進行實時監控;
      jstack:查看所有線程的運行狀態;
      jmap:查看jvm占用物理內存的狀態;
      jconsole
      jvisualvm
    • jps:Java virutal machine Process Status tool,

      jps [-q] [-mlvV] [<hostid>]
            -q:靜默模式;
            -v:顯示傳遞給jvm的命令行參數;
            -m:輸出傳入main方法的參數;
            -l:輸出main類或jar完全限定名稱;
            -V:顯示通過flag文件傳遞給jvm的參數;
            [<hostid>]:主機id,默認為localhost;
    • jinfo:輸出給定的java進程的所有配置信息;

      jinfo [option] <pid>
            -flags:to print VM flags
            -sysprops:to print Java system properties
            -flag <name>:to print the value of the named VM flag
    • jstack:查看指定的java進程的線程棧的相關信息;

      jstack [-l] <pid>
        jstack -F [-m] [-l] <pid>
            -l:long listings,會顯示額外的鎖信息,因此,發生死鎖時常用此選項;
            -m:混合模式,既輸出java堆棧信息,也輸出C/C++堆棧信息;
            -F:當使用“jstack -l PID"無響應,可以使用-F強制輸出信息;
    • jstat:輸出指定的java進程的統計信息
      jstat -help|-options
      jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]

      • ~]# jstat -options

        -class:class loader
        -compiler:JIT
        -gc:gc
        -gccapacity:統計堆中各代的容量
        -gccause:
        -gcmetacapacity
        -gcnew:新生代
        -gcnewcapacity
        -gcold:老年代
        -gcoldcapacity
        -gcutil
        -printcompilation
      • [<interval> [<count>]]

        • interval:時間間隔,單位是毫秒;
          count:顯示的次數;
      • -gc:

        • YGC:新生代的垃圾回收次數;
          YGCT:新生代垃圾回收消耗的時長;
          FGC:Full GC的次數;
          FGCT:Full GC消耗的時長;
          GCT:GC消耗的總時長;
    • jmap:Memory Map, 用于查看堆內存的使用狀態;

    • jhat:Java Heap Analysis Tool
      jmap [option] <pid>

      • 查看堆空間的詳細信息:
        jmap -heap <pid>

      • 查看堆內存中的對象的數目:
        jmap -histo[:live] <pid>
        live:只統計活動對象;

      • 保存堆內存數據至文件中,而后使用jvisualvm或jhat進行查看:
        jmap -dump:<dump-options> <pid>

        dump-options:
        live         dump only live objects; if not specified, all objects in the heap are dumped.
        format=b     binary format
        file=<file>  dump heap to <file>

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

(1)
ss
上一篇 2017-07-03
下一篇 2017-07-04

相關推薦

  • Linux三劍客之grep使用入門指南

    Linux的grep是一個具有強大功能的文本搜索工具,正確的學習和使用,能很大程度上提高工作效率,減輕運維工作所面臨的壓力。

    2017-09-09
  • 第七周練習

    1、創建一個10G分區,并格式為ext4文件系統;   (1) 要求其block大小為2048, 預留空間百分比為2, 卷標為MYDATA, 默認掛載屬性包含acl;   ~]# mke2fs -t ext4 -b 2048 -m 2 -L…

    Linux干貨 2016-12-10
  • 磁盤管理(一)磁盤分區表類型與文件系統

    概述:本章介紹磁盤分區和文件系統,深度了解linux存儲數據所依賴到各個部分模塊。 設備文件 I/O Ports: I/O設備地址 一切皆文件: Linux為所有的設備文件都提供了統一的操作函數接口,方法是使用數據結構struct file_operations。這個數據結構中包括許多操作函數的指針,如open()、close()、read()和write(…

    Linux干貨 2016-09-01
  • N25第六周作業

    vim 是vi編輯的升級版,同樣有三種工作模式:編輯、命令和一般 模式 #:指定行號位置 #,#:指定多少行到多少行 #,+#:指定范圍,多少行開始,加#行 $:最后一行 .:當前行 .,$-1,當前行到倒數第二行 1,$:全文 %:全文 /從上往下,?:從下往上 搜索 /pattern/:從光標所在處起始向文件尾部第一次被模式所匹配到的行 s/要查找的內容…

    Linux干貨 2017-01-11
  • 第六周小練習

    詳細總結vim編輯器的使用并完成一下練習 vim編輯器的基本使用 vim模式: 1、編輯模式(命令模式) 2、輸入模式 3、末行模式  一、打開文件 vim /path/to/somefile 打開單個文件 如果文件存在為打開,否則保存退出時為新建 vim /path/to/somefile vim +# : 打開文件…

    Linux干貨 2016-12-19
  • 3.26第一篇博客

    1.安裝VNC viewer (VNC是一款遠程控制軟件,即便版本不一樣也可以互通) 安裝好后,進入界面,可以直接在上方數據欄里輸入服務器端的主機名或IP地址,即可建立連接。 二.安裝VMware (VMware是一款可以控制和管理虛擬化的IT環境 可以跑各種的操作系統) 1.首先在內網ftp://172.16.0.1/pub/tools找到VMware版本…

    2018-03-26
欧美性久久久久