20171106 Tomcat(一)

  • Java語言介紹
  • Java EE和Tomcat
  • Tomcat的主要配置
  • Tomcat的管理工具
  • Tomcat的反向代理

一、Java語言介紹

(一)Java的特征

  • 面向對象
  • write once, run anywhere:一次編譯,任何處運行
  • jdk:包含類庫(API)、開發工具(javac)、JVM

(二)Java的三個方向

  • JAVA SE:標準版
  • JAVA EE:企業版,可以視為JAVA SE增加一些企業級功能模塊
  • JAVA ME:移動版

(三)jdk與openjdk

  • 2006年Sun開源了jdk,建立了openjdk組織
  • openjdk與jdk接口兼容,可以按照需求選擇
  • 當前有openjdk 1.6, 1.7, 1.8版本,對應oracle jdk的相應版本

(四)Java代碼的運行

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

(五)java技術體系

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

(六)JVM運行時區域

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

(七)jdk的安裝

(1)openjdk的安裝
  • java-VERSION-openjdk:核心包
  • java-VERSION-openjdk-headless:運行時環境包
  • java-VERSION-openjdk-devel:開發包
yum install java-1.8.0-openjdk-devel
java -version     // 查看當前java環境
(2)oracle jdk的安裝
rpm -ivh jdk-8u151-linux-x64.rpm
vim /etc/profile.d/java.sh
export JAVA_HOME=/usr/java/latest
export PATH=$JAVA_HOME/bin:$PATH
. /etc/profile.d/java.sh 
java -version

二、Java EE和Tomcat

(一)Java EE中的關鍵模塊

  • Servlet:Java編寫的服務器端程序,主要功能在于交互式地瀏覽和修改數據,生成動態Web內容

    • servlet container:容器,提供servlet功能的服務器
    • servlet engine:實現具體功能的servlet實例
  • JSP:Java Server Pages,是一種實現普通靜態HTML 和動態 HTML 混合編碼的技術;

    • 特點:借助內容和外觀的分離,頁面制作中不同性質的任務可以方便地分開:由頁面設計者進行 HTML設計,同時留出供 Servlet 程序員插入動態內容的空間
    <html>
    <title>TITLE</title>
    <body>
    <h1>...</h1>
    <%
    ... java code...          // 插入動態內容,實現前端與后端的分離
    %>
    </body>
    </html>
    
  • jsp與servlet的轉換關系:
    .jsp -->jasper--> .java --> javac --> .class --> jvm

    • 基于jasper將靜態輸出的數據轉為java代碼進行輸出,結果為servlet規范的代碼
    • javac工具將servlet代碼編譯為類文件,再把類文件加載到jvm中運行
    • jsp的作用在于解決servlet處理html時的復雜性,將前端與后端的工作分離。運行時通過jasper將jsp翻譯為標準的java源代碼,再按照標準的java代碼運行過程工作。

(二)Tomcat

  • Tomcat是一個servlet container,實現了Java EE中servlet, jsp部分,故其只是Java EE的部分實現
  • Tomcat是由Sun開發的Java Web Server(Java EE的最早實現)與ASF開發的JServ項目合并后產生的
  • 當前的Tomcat項目是在Tomcat 4.0(代號:Catalina)的基礎上不斷完善發展起來的,故Tomcat中很多地方仍舊能夠看到單詞catalina的痕跡

(三)Java EE的實現簡介

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

(四)Tomcat的安裝

(1)yum安裝
yum install tomcat tomcat-docs-webapp tomcat-admin-webapps tomcat-webapps
systemctl start tomcat
(2)官網下載二進制壓縮包,解壓縮安裝
tar xf apache-tomcat-7.0.82.tar.gz -C /usr/local/
cd /usr/local/
ln -sv apache-tomcat-7.0.82/ tomcat
useradd tomcat
setfacl -R -m u:tomcat:rwx ./tomcat/
vim /etc/profile.d/tomcat.sh
  export CATALINA_BASE=/usr/local/tomcat
  export PATH=$CATALINA_BASE/bin:$PATH
. /etc/profile.d/tomcat.sh 
. catalina.sh start     // tomcat由java編寫,使用腳本運行將tomcat運行在jvm中

(五)Tomcat的程序環境

(1)tomcat的目錄結構

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

(2)catalina.sh --help

run:前臺模式啟動
run -security:帶安全管理的前臺模式啟動
start:后臺模式啟動
start -security:帶安全管理的后臺模式啟動
stop:關閉
stop n:等待n秒后關閉
stop -force:強行關閉
stop n -force:等待n秒后,強行關閉
configtest:檢查配置
version:查詢版本

(3)rpm包安裝的程序環境
  • 配置文件目錄:/etc/tomcat
  • 主配置文件:server.xml
  • webapps存放位置:/var/lib/tomcat/webapps/
    examples
    manager
    host-manager
    docs
  • Unit File:tomcat.service
  • 環境配置文件:/etc/sysconfig/tomcat

三、Tomcat的主要配置

(一)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, ...
    集群類組件:listener, cluster, ...

(三)JSP WebAPP的組織結構

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的相關操作

  • 部署步驟:

    • 將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

  • 實驗1:實現一個最簡單的webapp部署操作

mkdir -pv /var/lib/tomcat/webapps/test/{WEB-INF,classes,lib}
vim /var/lib/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>
service tomcat restart

登錄http:// 192.168.136.229:8080/test,成功顯示預期結果

使用tree命令查看/var/cache/tomcat/work/Catalina/localhost/test目錄下的結構,可以看到index.jsp文件先通過jasper轉化為.java源碼文件,繼而通過javac編譯為.class類文件并被送入jvm中執行

(六)tomcat的常用組件配置

(1)Server組件:
  • 代表tomcat instance,即表現出的一個java進程
  • 監聽在8005端口,只接收“SHUTDOWN”——建議將監聽端口設為-1,取消shutdown功能
  • 各server監聽的端口不能相同,因此,在同一物理主機啟動多個實例時,需要修改其監聽端口為不同的端口
(2)Service組件:
  • 用于實現將一個或多個connector組件關聯至一個engine組件
(3)Connector組件:
  • 負責接收請求,常見的有三類http/https/ajp(apache jserv protocol)

  • 進入tomcat的請求可分為兩類:
    (1) standalone : 請求來自于客戶端瀏覽器
    (2) 由其它的web server反代:來自前端的反代服務器
    nginx --> http connector --> tomcat
    httpd(proxy_http_module) --> http connector --> tomcat
    httpd(proxy_ajp_module) --> ajp connector --> tomcat

  • 屬性:

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

  • 屬性:
    name
    defaultHost
    jvmRoute:與基于cookie的session sticky有關

(5)Host組件:
  • 位于engine內部用于接收請求并進行相應處理的主機或虛擬主機,示例:

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

  • 實驗2:實現在非默認webapps部署目錄存放webapp文件

vim /etc/tomcat/server.xml     // 創建虛擬主機
<Host name="test.hellopeiyang.com"  appBase="/app/webapps" unpackWARs="true" autoDeploy="true"/>

mkdir -pv /app/webapps/ROOT/{WEB-INF,lib,classes}
vim /app/webapps/ROOT/index.jsp
<%@ page language="java" %>
<%@ page import="java.util.*" %>
<html>
        <head>
        <title>Test Page</title>
        </head>
        <body>
        <% out.println("hellopeiyang test page");
        %>
        </body>
</html>
service tomcat restart
(6)Context組件:
  • 實現別名的功能:如下,當url為/PATH時,自動尋找磁盤上/PATH/TO/SOMEDIR的文件
    <Context path="/PATH" docBase="/PATH/TO/SOMEDIR" reloadable=""/>

  • 實驗3:在實驗2的基礎上,實現使用context組件

cp -r /app/webapps/ROOT/ /app/data/

vim /etc/tomcat/server.xml
<Host name="test.hellopeiyang.com"  appBase="/app/webapps" unpackWARs="true" autoDeploy="true">
        <Context path="/testpage" docBase="/app/data" reloadable="" />
</Host>

vim /app/data/index.jsp
<%@ page language="java" %>
<%@ page import="java.util.*" %>
<html>
        <head>
        <title>Test Page</title>
        </head>
        <body>
        <% out.println("hellopeiyang another test page");
        %>
        </body>
</html>

service tomcat restart
(7)Valve組件:
  • 定義訪問日志:org.apache.catalina.valves.AccessLogValve
<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" />
  • 定義訪問控制:org.apache.catalina.valves.RemoteAddrValve
<Valve className="org.apache.catalina.valves.RemoteAddrValve" deny="172\.16\.100\.67"/>
  • 實驗4:在實驗3的基礎上,使用valve組件實現定制訪問日志和訪問控制
vim /etc/tomcat/server.xml     // 位置在Host組件語句塊中
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="node1_access_log." suffix=".log"
pattern="%h %l %u %t &quot;%r&quot; %s %b" />
<Valve className="org.apache.catalina.valves.RemoteAddrValve" deny="192\.168\.136\.129"/>

service tomcat restart
tail /var/log/tomcat/node1_access_log.2017-11-07.log

日志內容存放在/var/log/tomcat/下定義名稱的日志文件中

192.168.136.129的主機無法訪問

非192.168.136.129的主機可以訪問

四、Tomcat的管理工具

(一)tomcat管理工具的使用角色(role)

  • manager-gui:允許查看圖形管理界面和服務器狀態界面
  • manager-script:允許通過文本接口管理和查看服務器狀態界面
  • manager-jmx :允許通過JMX代理管理和查看服務器狀態界面
  • manager-status:只允許查看服務器狀態界面

(二)授權用戶manager-gui角色

vim /etc/tomcat/tomcat-users.xml 
<role rolename="manager-gui"/>
<user username="hellopeiyang" password="centos" roles="manager-gui"/>

service tomcat restart

紅框中的為三個管理工具頁面的連接,從上之下依次為:服務器狀態, 管理應用,虛擬主機管理

網絡應用管理頁面

服務器狀態管理頁面

(三)授權用戶admin-gui角色

vim /etc/tomcat/tomcat-users.xml 
service tomcat restart
<role rolename="admin-gui"/>
<role rolename="manager-gui"/>
<user username="hellopeiyang" password="centos" roles="manager-gui,admin-gui"/>     // 用戶hellopeiyang同時擁有manager-gui和admin-gui角色

虛擬主機管理頁面

五、Tomcat的反向代理

(一)nginx反向代理至tomcat

  • 轉發過程:client (http) --> nginx (reverse proxy)(http) --> tomcat (http connector)
vim /etc/nginx/nginx.conf
server {
        listen       80 default_server;
        index        index.jsp index.html;
        root         /usr/share/tomcat/webapps/ROOT;
        location ~* \.(jsp|do)$  {
                proxy_pass http://127.0.0.1:8080;
        }
    }

nginx -t
nginx -s reload

直接登錄192.168.136.230,通過80端口成功訪問tomcat服務器

(二)httpd通過http協議反向代理至tomcat

  • 轉發過程:client (http) --> httpd (proxy_http_module)(http) --> tomcat (http connector)
vim /etc/httpd/conf.d/tomcat.conf
<VirtualHost *:80>
        ServerName node1.hellopeiyang.com
        ProxyRequests Off
        ProxyVia On
        ProxyPreserveHost On
        <Proxy *>
                Require all granted
        </Proxy>
        ProxyPass / http://127.0.0.1:8080/
        ProxyPassReverse / http://127.0.0.1:8080/
        <Location />
                Require all granted
        </Location>
</VirtualHost>
httpd -t
systemctl restart httpd

直接登錄192.168.136.230,通過80端口成功訪問tomcat服務器

(三)httpd通過ajp協議反向代理至tomcat

  • 轉發過程:client (http) --> httpd (proxy_ajp_module)(ajp) --> tomcat (ajp connector)
cp /etc/httpd/conf.d/tomcat.conf /etc/httpd/conf.d/ajp-tomcat.conf
mv /etc/httpd/conf.d/tomcat.conf /etc/httpd/conf.d/tomcat.conf.bak
vim /etc/httpd/conf.d/ajp-tomcat.conf 
<VirtualHost *:80>
        ServerName node1.hellopeiyang.com
        ProxyRequests Off
        ProxyVia On
        ProxyPreserveHost On
        <Proxy *>
                Require all granted
        </Proxy>
        ProxyPass / ajp://127.0.0.1:8009/
        ProxyPassReverse / ajp://127.0.0.1:8009/
        <Location />
                Require all granted
        </Location>
</VirtualHost>
systemctl restart httpd

直接登錄192.168.136.230,通過80端口成功訪問tomcat服務器。
進入Server Status管理頁面,可以看到此時ajp協議開始工作,證明現在通過ajp協議轉發

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容