- 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 "%r" %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 "%r" %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協議轉發