Tomcat的使用

編程語言:
硬件級:微碼編程,彙編語言
系統級:C,C++,...
應用級:Java, PHP, Python, Ruby, Perl, C#, ...
Python: PVM
Standard Library
Web Framework:Django, Flask, ...
Java:JVM,JDK
bash:bash explainer
...

程序:指令+數據
    過程式編程:以指令爲中心,數據服務於代碼;
    對象式編程:以數據爲中心,指令服務於數據;
        對象,方法(method)

Java:
    Sun, Green Project, Oak,  James Gosling;
    1995:Java 1.0, Write once, Run Anywhere;
    1996:JDK(Java Development Kit),包含類庫(API)、開發工具(javac)、JVM(SUN Classic VM)  
        JDK 1.0,  Applet, AWT
    1997:JDK 1.1
    1998: JDK  1.2
        Sun分拆Java技術爲三個方向:
            J2SE:Standard Edition
            J2EE:Enterprise Edition
            J2ME:Mobile Edition

        代表性技術:EJB,java plugin, Swing, JIT(Just In Time,即時編譯)

    2000:JDK 1.3
        HotSpot VM
    2002:JDK 1.4

    2006:Sun開源了Java技術,GPL,建立一個稱爲OpenJDK組織;
        Java 2 SE, Java 2 EE, Java 2 ME

    2011:JDK 1.7
    2014:JDK 1.8
    2016:JDK 1.9

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

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.

        CentOS 7:
            VERSION:1.6.0, 1.7.0, 1.8.0
            yum install java-1.8.0-openjdk-devel    安裝jdk
        注意:多版本並存時,可使用 alternatives命令設定默認使用的版本;在base源中有
        yum list all|grep openjdk:查看openjdk
    Oracle JDK:
        安裝相應版本的rpm包;
            jdk-VERSION-OS-ARCH.rpm
            例如:jdk-1.8.0_25-linux-x64.rpm(到官網下載) 
            rpm -ivh jdk-1.8.0_25-linux-x64.rpm
        注意:安裝完成後,要配置JAVA_HOME環境變量,指向java的安裝路徑;
            OpenJDK:
                JAVA_HOME=/usr
            Oracle JDK:
                JAVA_HOME=/usr/java/jdk_VERSION

vim /etc/profile.d/java.sh
export JAVA_HOME=/usr/java/latest
export PATH=$JAVA_HOME/bin:$PATH
source /etc/profile.d/java.sh 使得配置生效

Java 2 EE:
    CGI: Common Gateway Interface

    Servlet:
        類庫;web app;
        Servlet container, Servlet Engine

    JSP: Java Server Page
        類庫:
        <html>
            <title>TITLE</title>
            <body>
                <h1>...</h1>
                <%
                    ... java code...
                %>
            </body>
        </html>

        .jsp -->jasper--> .java --> javac --> .class --> jvm 

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

    JSP Container:
        JSP + Servlet Container

        Java Web Server:JWS
        ASF:JServ

            O'Reilly

            Tomcat 3.x
            Tomcat 4.x
                Catalina

            http://tomcat.apache.org/

        商業實現:
            WebSphere, WebLogic, Oc4j, Glassfish, Geronimo, JOnAS, JBoss, ...
        開源實現:
            Tomcat, Jetty, Resin, ...

        Tomcat: Java 2 EE技術體系的不完整實現; 

    安裝Tomcat:
        Base Repo:
            tomcat, tomcat-lib, tomcat-admin-webapps, tomcat-webapps, tomcat-docs-      

webapp
yum install tomcat tomcat-lib tomcat-admin-webapps tomcat-webapps tomcat-docs-
webapp 安裝tomcat
https://tomcat.apache.org 官方下載地址
Tomcat binary release:
wget http://mirrors.hust.edu.cn/apache/tomcat/tomcat-8/v8.5.31/bin/apache-
tomcat-8.5.31.tar.gz;
tar xf apache-tomcat-VERSION.tar.gz -C /usr/local/
cd /usr/local
ln -sv apache-tomcat-VERSION tomcat
useradd -r tomcat -s /sbin/nologin
chown -R tomcat:tomcat /usr/local/tomcat/*
su - tomcat
tomcat需要運行在jvm虛擬機上,但是jvm也要啓動,這就需要自舉了
/etc/profile.d/tomcat.sh
export CATALINA_BASE=/usr/local/tomcat
export PATH=$CATALINA_BASE/bin:$PATH
tomcat程序環境:

    tomcat的目錄結構
        bin:腳本,及啓動時用到的類;
        conf:配置文件目錄;
        lib:庫文件,Java類庫,jar;
        logs:日誌文件目錄;
        temp:臨時文件目錄;
        webapps:webapp的默認目錄;
        work:工作目錄,存放編譯後的字節碼文件;

    實驗:實現manager-gui界面的管理

cd /etc/tomcat/
vim tomcat-users.xml
<user username="tomcat" password="123789" roles="manager-gui"/>
<role rolename="manager-gui"/>
systemctl restart tomcat 重啓
在訪問默認頁面時可以點擊Manager-App進行服務程序的控制

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:
    使用java語言編寫:

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

    Tomcat的核心組件:server.xml
        <Server>
            <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, ...

valve:過濾
realm:認證
集羣類組件:listener, cluster, ...

    JSP WebAPP的組織結構:
        /: webapps的根目錄
            index.jsp, index.html:主頁;
            ...
            WEB-INF/:當前webapp的私有資源路徑;通常用於存儲當前webapp的web.xml和context.xml配置文件;
            META-INF/:類似於WEB-INF/;
            classes/:類文件,當前webapp所提供的類;
            lib/:類文件,當前webapp所提供的類,被打包爲jar格式;

            DocumentRooot /webdata/htdocs/
                /images/

                http://www.ilinux.io/images/

    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:重新部署;
    例子:

vim tomcat-users.xml 編輯用戶授權文件,授權管理界面給tomcat用戶
<role rolename="admin-gui"/>
<user username="tomcat" password="123789" roles="manager-gui,admin-gui"/>
<role rolename="manager-gui"/>
http://172.18.62.61:8080/ 訪問地址
點擊Manager App按鈕,輸入用戶名和密碼,進入資源部署管理界面
在管理界面進行如下配置:
Context Path (required): /myapps
WAR or Directory URL: /data/webapps/test
點擊deploy按鈕進行發佈
點擊 Host Manager按鈕,配置虛擬主機
Name: localhost.localdomain
App base: /data/webapps
將 /data/webapps下的目錄改名爲ROOT
curl http://localhost.localdomain:8080/ 進行訪問

手動提供一測試類應用,並冷部署:
    # 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監聽的端口不能相同,因此,在同一物理主機啓動多個實例時,需要修改其監聽端口爲不同的端口; 
        port="-1",  #禁用此端口,防止他人用SHUTDOWN指令意外關閉(telnet連接時)
        shutdown="RANDOM_CHARCTER"
    Catalina:是tomcat代碼的名稱;
    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內置模塊
                httpd(mod_jk) --> ajp connector --> tomcat  mod_jk是早先外置的模塊
                ajp是二進制傳輸的,比較高效
        屬性:
            port="8080" 
            protocol="HTTP/1.1"
            connectionTimeout="20000"   單位爲毫秒

            address:監聽的IP地址;默認爲本機所有可用地址;
            maxThreads:最大併發連接數,默認爲200;
            enableLookups:是否啓用DNS查詢功能;
            acceptCount:等待隊列的最大長度;  訪問超出最大併發連接數就等待
            secure:
            sslProtocol:    建議使用tls1.2以上的版本

    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=""/>

    綜合示例:
        <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=""> #當test不在默認目錄下

· 時進行訪問;
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="node1_testaccess" suffix=".log"
pattern="%h %l %u %t "%r" %s %b" />
</Context>
</Host>

    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"/>

實驗:nginx作爲反向代理,對動態頁面轉給tomcat,靜態頁面則自己解析,響應給客戶端
nginx和tomcat在一臺主機上
yum install nginx
cd /etc/nginx/
vim nginx.conf
root /data/webapps/ROOT; 公共資源,靜態與動態都有;
index index.jsp index.html
location ~* .(jsp|do)$ {
proxy_pass http://server1.localhost:8080;
}
nginx 啓動服務
測試:
http://172.18.62.61/index.jsp
http://172.18.62.61/

LNMT:Linux Nginx MySQL Tomcat 
    Client (http) --> nginx (reverse proxy)(http) --> tomcat  (http connector)

    location / {
        proxy_pass http://tc1.magedu.com:8080;
    }

    location ~* \.(jsp|do)$ {
        proxy_pass http://tc1.magedu.com:8080;
    }

LAMT:Linux Apache(httpd) MySQL Tomcat 
    httpd的代理模塊:
        proxy_module
        proxy_http_module:適配http協議客戶端;
        proxy_ajp_module:適配ajp協議客戶端;

    Client (http) --> httpd (proxy_http_module)(http) --> tomcat  (http connector)
    Client (http) --> httpd (proxy_ajp_module)(ajp) --> tomcat  (ajp connector)
    Client (http) --> httpd (mod_jk)(ajp) --> tomcat  (ajp connector)

    proxy_http_module代理配置示例:    只實現了動態內容的調度
        <VirtualHost *:80>
            ServerName      tc1.magedu.com
            ProxyRequests Off   關閉正向代理,以使用反向代理
            ProxyVia        On  添加代理首部
            ProxyPreserveHost On    保留代理主機的域名地址
            <Proxy *>
                Require all granted
            </Proxy>
            ProxyPass / http://tc1.magedu.com:8080/
            ProxyPa***everse / http://tc1.magedu.com:8080/ 
            <Location />
                Require all granted
            </Location>
        </VirtualHost>

        location /test/ {
            proxy_pass http://172.16.0.76:8080/;
        }   #nginx的配置

    proxy_ajp_module代理配置示例:
        <VirtualHost *:80>
            ServerName      tc1.magedu.com
            ProxyRequests Off
            ProxyVia        On
            ProxyPreserveHost On
            <Proxy *>
                Require all granted
            </Proxy>
                ProxyPass / ajp://tc1.magedu.com:8009/ 
                ProxyPa***everse / ajp://tc1.magedu.com:8009/ 
            <Location />
                Require all granted
            </Location>
        </VirtualHost>

    /data/webapps/eshop
        eshop-1.1
        eshop-1.2
        eshop-1.3
        eshop-1.4
    在 /data/webapps目錄下降各個版本放進去,然後用eshop做爲軟鏈接指向要發佈的版本

課外實踐:
    client --> nginx --> httpd --> tomcat
    proxy_http_module)(http) --> tomcat  (http connector)
    Client (http) --> httpd (proxy_ajp_module)(ajp) --> tomcat  (ajp connector)

課外練習:
    根據文檔,部署javaee-bbs或solo;

mysql是通過mysql協議進行通調用的,可以通過mysql客戶端軟件進行調用mysql的API接口;程
序員也可以通過加載類庫直接調用函數訪問mysql的API接口;
tomcat是java的,java程序連接數據庫要用到一個封裝好類庫的客戶端庫專門連接mysql服務器,
可以到mysql官網進行下載,下載好直接放到/usr/share/java/tomcat下即可,在程序運行時需要
mysql連接時自動調用;但是這裏不用,自帶的有
mysql連接器下載官網:https://dev.mysql.com/downloads/connector/

回顧:

jsp: java server page 
Java 2 SE --> Java 2 EE
    Tomcat:JDK + Servlet, JSP

server.xml:
    <server>
        <service>
            <connector />
            ...
            <Engine>
                <Host>
                    <Context/>
                    ...
                </Host>
                ...
            </Engine>
        </service>
    </server>

Tomcat處理的請求:
    nt:nginx->http->tomcat(http connector)
    at:httpd->http->tomcat(http connector)
        httpd->ajp->tomcat(ajp connector)

    nat, hat

會話保持:
    (1) session sticky
        source_ip
            nginx: ip_hash
            haproxy: source
            lvs: sh
        cookie:
            nginx:hash 
            haproxy: cookie
    (2) session cluster:delta session manager
    (3) session server:redis(store), memcached(cache)

Tomcat Cluster(session)
    (1) session sticky
    (2) session cluster
        tomcat delta manager
    (3) 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

    第一種方法的實現:   即httpd調度,效率低
        <proxy balancer://tcsrvs>
            BalancerMember http://172.18.100.67:8080
            BalancerMember http://172.18.100.68:8080
            ProxySet lbmethod=byrequests
        </Proxy>

        <VirtualHost *:80>
            ServerName lb.magedu.com
            ProxyVia On
            ProxyRequests Off
            ProxyPreserveHost On
            <Proxy *>
                Require all granted
            </Proxy>
            ProxyPass / balancer://tcsrvs/
            ProxyPa***everse / balancer://tcsrvs/
            <Location />
                Require all granted
            </Location>
        </VirtualHost>  

    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.    如sorry頁面
                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.

    會話粘性的實現方法:
        Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED

        <proxy balancer://tcsrvs>   #注意TomcatA就是上面ROUTEID的值
            BalancerMember http://172.18.100.67:8080 route=TomcatA loadfactor=1
            BalancerMember http://172.18.100.68:8080 route=TomcatB loadfactor=2
            ProxySet lbmethod=byrequests
            ProxySet stickysession=ROUTEID
        </Proxy>

        <VirtualHost *:80>
            ServerName lb.magedu.com
            ProxyVia On
            ProxyRequests Off
            ProxyPreserveHost On
            <Proxy *>
                Require all granted
            </Proxy>
            ProxyPass / balancer://tcsrvs/
            ProxyPa***everse / balancer://tcsrvs/
            <Location />
                Require all granted
            </Location>
        </VirtualHost>  

        啓用管理接口:
            <Location /balancer-manager>
                SetHandler balancer-manager
                ProxyPass !
                Require all granted
            </Location>             
            http://172.18.62.63/balancer-manager    瀏覽器訪問管理接口界面
            示例程序:
                演示效果,在TomcatA上某context中(如/test),提供如下頁面
                <%@ page language="java" %>
                <html>
                    <head><title>TomcatA</title></head>
                    <body>
                        <h1><font color="red">TomcatA.magedu.com</font></h1>
                        <table align="centre" border="1">
                            <tr>
                                <td>Session ID</td>
                            <% session.setAttribute("magedu.com","magedu.com"); %>
                                <td><%= session.getId() %></td>
                            </tr>
                            <tr>
                                <td>Created on</td>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章