1、tomcat的安裝環境
tomcat使用java語言來編寫,tomcat和php一樣都是用來處理動態程序的(也可以解析靜態資源),tomcat可以處理.jsp或者.do結尾的動態文件,處理時并不是tomcat本身去處理,而是交給后端的jvm來處理,也就是java虛擬機來處理,處理之前先裝入tomcat的類文件,然后由jvm來處理,所以安裝tomcat必須先安裝JDK(Java Development Kit),java開發工具箱在java虛擬機之上,安裝了JDK就相當于安裝java虛擬機,JDK有兩種開源的軟件可以安裝,OpenJDK和Oracle JDK
1、OpenJDK的安裝
yum install java-1.8.0-openjdk-devel.x86_64
確定JDK是否安裝可以使用如下命令
[root@centos6 ~]#java -version
openjdk version "1.8.0_121" ---可以看到版本,說明安裝成功
OpenJDK Runtime Environment (build 1.8.0_121-b13)
OpenJDK 64-Bit Server VM (build 25.121-b13, mixed mode)
2、Oracle JDK的安裝
在oracle官方網站上下載jdk-8u151-linux-x64.rpm
http://www.oracle.com/technetwork/java/javase/downloads/index.html
[root@centos7 app]#rpm -ivh jdk-8u151-linux-x64.rpm
[root@centos7 latest]#cd /usr/java/
[root@centos7 java]#ll ---有兩個軟鏈接文件,一個指向的是默認的,一個指向的是最新的,這里只有一個版本,如果有多個版本這兩個軟鏈接會分別指向不同的版本
total 0
lrwxrwxrwx 1 root root 16 Nov 3 21:01 default -> /usr/java/latest
drwxr-xr-x 9 root root 268 Nov 3 21:01 jdk1.8.0_151
lrwxrwxrwx 1 root root 22 Nov 3 21:01 latest -> /usr/java/jdk1.8.0_151
[root@centos7 java]#cd latest/
[root@centos7 latest]#ls
bin db javafx-src.zip lib man release THIRDPARTYLICENSEREADME-JAVAFX.txt
COPYRIGHT include jre LICENSE README.html src.zip THIRDPARTYLICENSEREADME.txt
[root@centos7 latest]#cd bin/ ---發現有很多java程序文件,因為不在PATH變量里,所以最好定義PATH變量
[root@centos7 bin]#ls
appletviewer jar javadoc javapackager jconsole jhat jmc jsadebugd jvisualvm pack200 rmiregistry tnameserv xjc
ControlPanel jarsigner javafxpackager java-rmi.cgi jcontrol jinfo jmc.ini jstack keytool policytool schemagen unpack200
extcheck java javah javaws jdb jjs jps jstat native2ascii rmic serialver wsgen
idlj javac javap jcmd jdeps jmap jrunscript jstatd orbd rmid servertool wsimport
[root@centos7 latest]#vim /etc/profile.d/java.sh
PATH=/usr/java/latest/bin/:$PATH
[root@centos7 latest]#. /etc/profile.d/java.sh ---生效
[root@centos7 latest]#java -version ---發現java環境已經準備好了,定義完PATH變量,java虛擬機就會自動開啟
java version "1.8.0_151"
Java(TM) SE Runtime Environment (build 1.8.0_151-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.151-b12, mixed mode)
2、安裝tomcat
安裝tomca也有兩種方法,一種是base倉庫,另外一種就是到官方站點下載,這里在上面準備好的OpenJDK上用base倉庫安裝,在Oracle JDK上安裝編譯好的二進制包
1、Base Repo:
[root@centos6 ~]#yum install tomcat tomcat-admin-webapps tomcat-docs-webapp tomcat-webapps
[root@centos6 tomcat]#rpm -q tomcat ---查看版本
tomcat-7.0.73-1.el6.noarch
[root@centos6 tomcat]#cat /usr/sbin/tomcat ---可以看到tomcat并不是一個二進制的程序,而是一個腳本文件,通過腳本文件調用java程序,
/etc/tomcat ---配置文件目錄
/etc/tomcat/server.xml ---主配置文件
/etc/tomcat/tomcat-users.xml ---用戶認證的賬號和密碼文件;角色(role),用戶(User),此文件在tomcat啟動時被裝入內存
/usr/share/tomcat/webapps ---webapp的默認根目錄
service tomcat start
[root@centos6 tomcat]#ps -aux ---我們發現tomcat啟動的是一個java虛擬機程序
tomcat 5990 15.1 9.8 2938264 98592 ? Sl 03:29 0:06 /usr/lib/jvm/j
[root@centos6 tomcat]#jps -v ---可以看到啟動過程,先裝載tomcat的類文件完成自舉,然后運行java虛擬機程序,所以tamcat真正運行的是一個java程序
5990 Bootstrap -Dcatalina.base=/usr/share/tomcat -Dcatalina.home=/usr/share/tomcat -Djava.endorsed.dirs= -Djava.io.tmpdir=/var/cache/tomcat/temp -Djava.util.logging.config.file=/usr/share/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
6056 Jps -Dapplication.home=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.121-1.b13.el6.x86_64 -Xms8m
[root@centos6 tomcat]#ss -nltp ---從這也可以看到運行的是java進程
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 1 ::ffff:127.0.0.1:8005 :::* users:(("java",5990,52))
LISTEN 0 100 :::8009 :::* users:(("java",5990,48))
LISTEN 0 100 :::8080 :::* users:(("java",5990,47))
監聽的端口有三個:8080為http協議的接口,8009為ajp協議的接口,8005為管理接口
[root@centos6 tomcat]#telnet 127.0.0.1 8005
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
SHUTDOWN
Connection closed by foreign host.
[root@centos6 tomcat]#ss -nlt ---發現tomcat實例被關閉了,所以這個管理端口監聽在本地的8005,這樣比較安全,不然誰telnet到這個端口都可以關閉tomcat,不過一般這個端最好不要監聽,這樣更安全
如何進行安全設置
vim /etc/tomcat/server.xml
<Server port="8005" shutdown="SHUTDOWN">
把上面的改成port=-1,就表示關閉端口
或者openssl rand -hex 10 生成一個隨機數來當shuntdown,這樣別人就不知道該怎么關閉了
http://172.18.21.106:8080/ ---訪問http協議的接口可以看到web站點
2、Tomcat binary release
在官方網站上下載
http://tomcat.apache.org/
tomcat是屬于apache旗下的產品
這里下載的是apache-tomcat-7.0.82.tar
[root@centos7 app]#tar -xvf apache-tomcat-7.0.82.tar.gz -C /usr/local
[root@centos7 local]#ln -s apache-tomcat-7.0.82/ tomcat
[root@centos7 local]#cd tomcat
[root@centos7 tomcat]#useradd tomcat ---運行tomcat時最好以普通用戶的身份運行,所以創建一個tomcat用戶
[root@centos7 tomcat]#chown -R root:tomcat ./* ---修改tomcat目錄下的文件的所有者和所屬組,這里只修改所屬組為tomcat是因為怕tomcat賬號被別人盜用后,登陸此賬號后修改tomcat內的二進制程序文件
[root@centos7 tomcat]#chown -R tomcat ./{logs,temp,work,webapps,conf} ---將這些目錄的所有者修改為tomcat,因為在執行tomcat時有可能要修改這些目錄
內的文件
[root@centos7 tomcat]#vim /etc/profile.d/tomcat.sh
PATH=/usr/local/tomcat/bin/:$PATH
[root@centos7 tomcat]#. /etc/profile.d/tomcat.sh
[root@centos7 tomcat]#su - tomcat
[tomcat@centos7 ~]$catalina.sh start ---利用這個命令來啟動和關閉tomcat
[tomcat@centos7 ~]$catalina.sh --help
[tomcat@centos7 ~]$ss -nlt ---發現端口已經打開
[tomcat@centos7 ~]$ps -aux ---發現是以tomcat的身份在運行,如果用root用戶去開啟tomcat會發現tomcat是以root的身份在運行
[root@centos7 tomcat]#catalina.sh version
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/java/latest
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Server version: Apache Tomcat/7.0.82 ---可以看到tomcat的版本
Server built: Sep 29 2017 12:23:15 UTC
Server number: 7.0.82.0
OS Name: Linux
OS Version: 3.10.0-514.el7.x86_64
Architecture: amd64
JVM Version: 1.8.0_151-b12 ---java虛擬機的版本
JVM Vendor: Oracle Corporation
3、tomcat的常用組件配置
- Server:代表tomcat instance,即表現出的一個java進程;監聽在8005端口,只接收“SHUTDOWN”。各server監聽的端口不能相同,因此,在同一物理主機啟動多個實例及多個java進程時,需要修改其監聽端口為不同的端口;
- service:用于實現將一個或多個connector組件關聯至一個engine組件;
- Connector組件:負責接收請求,連接內部的Engine,常見的有三類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
屬性:
port="8080"
protocol="HTTP/1.1"
connectionTimeout="20000"
address:監聽的IP地址;默認為本機所有可用地址;
maxThreads:最大并發連接數,默認為200;
enableLookups:是否啟用DNS查詢功能;
acceptCount:等待隊列的最大長度;
secure="TRUE" 后面兩個屬性是啟用https的配置,一般tomcat不會使用https,而不是在前段的反代上設置,因為tomcat本身運行起來已經很慢了,加上https就更慢了
sslProtocol:ssl協議類型 - Engine組件:Servlet實例,即servlet引擎,其內部可以一個或多個host組件來定義站點; 通常需要通過defaultHost來定義默認的虛擬主機;
- Host組件:位于engine內部用于接收請求并進行相應處理的主機或虛擬主機
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
</Host>
appBase:設置默認網頁文件的存放路徑,也就是根目錄,相當于httpd的document root
unpackWARs:如果我們拿到的一個程序是.war格式的,把它放到網頁文件存放的目錄下會自動展開
autoDeploy:是否啟動自動部署功能
- Context組件:用來定義一個獨立的應用,也就是你訪問哪個uri時訪問的是哪個目錄,相當于http里的別名
示例:
<Context path="/PATH" docBase="/PATH/TO/SOMEDIR" reloadable=""/> - Valve組件:
Valve存在多種類型:
定義訪問日志:org.apache.catalina.valves.AccessLogValve
定義訪問控制:org.apache.catalina.valves.RemoteAddrValve
webapp歸檔格式:
.war:webapp; ---一般生產中用到的都是這種格式的打包好的程序文件,只要把它扔到網頁程序文件存放的目錄下就會自動展開這個文件,不用解壓包
.jar:EJB的類打包文件(類庫);
.rar:資源適配器類打包文件;
.ear:企業級webapp;
JSP WebAPP的組織結構:
/: webapps的根目錄
index.jsp:主頁;
...
WEB-INF/:當前webapp的私有資源路徑;通常用于存儲當前webapp的web.xml和context.xml配置文件;
META-INF/:類似于WEB-INF/;
classes/:類文件,當前webapp所提供的類;
lib/:類文件,當前webapp所提供的類,被打包為jar格式;
tree /usr/share/tomcat/webapps/ 可以看到根目錄結構
4、部署(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:重新部署;
示例:冷部署一個test程序
mkdir /app/test/{WEB-INF} -pv ---模仿根目錄的結構創建一個測試的程序目錄
cd /app/test/
vim 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 stop ---冷部署要先停止服務
cp -r /app/test/ /usr/share/tomcat/webapps/ ---把這個寫好的動態程序放到網站的根目錄下
service tomcat start
測試
http://172.18.21.106:8080/test/ 發現hello world 部署成功
5、tomcat配置
示例1虛擬主機
vim /etc/tomcat/server.xml
<Host name="node1.magedu.com" appBase="/app/website1" ---網站的根目錄
unpackWARs="true" autoDeploy="true">
</Host>
mkdir -pv /app/website1/ROOT/{WEB-INF,META-INF,classes,lib}
vim /app/website1/ROOT/index.jsp
<%@ page language="java" %>
<%@ page import="java.util.*" %>
<html>
<head>
<title>Test Page</title>
</head>
<body>
<% out.println("hello node1.magedu.com");
%>
</body>
</html>
service tomcat restart
在客戶端測試
vim /etc/hosts ---修改hosts文件保證能夠解析主機名
[root@redhat7 ~]#elinks -dump http://node1.magedu.com:8080/
hello node1.magedu.com
總結:/app/website1為網站的根目錄,在根目錄下創建一個ROOT目錄,把程序文件放到這個目錄下,在網頁上輸入http://node1.magedu.com:8080/就可以自動找到這個程序,如果根目錄下創建的不是ROOT目錄,而是別的目錄,比如test目錄,訪問網站的時候就要輸入http://node1.magedu.com:8080/test,就像我們輸入http://172.18.21.106:8080/,會自動訪問默認虛擬主機的/usr/share/tomcat/appwebs/ROOT目錄的程序文件,也就是網站的默認主頁面,是一個湯姆貓
示例2Context組件
vim /etc/tomcat/server.xml
<Host name="node1.magedu.com" appBase="/app/website1"
unpackWARs="true" autoDeploy="true">
<Context path="/testapp" docBase="/app/website2" reloadable="true"/> ---表示當你訪問的uri是testapp的時候,訪問的目錄是/app/website2,相當于http里面的別名, reloadable是否重新裝載
</Host>
[root@centos6 app]#cd /app/website2
[root@centos6 website2]#ls
index.jsp WEB-INF
測試
elinks -dump http://node1.magedu.com:8080/testapp
hello node1.magedu.com app
示例3定義訪問日志
vim /etc/tomcat/server.xml
<Host name="node1.magedu.com" appBase="/app/website1"
unpackWARs="true" autoDeploy="true">
<Context path="/testapp" docBase="/app/website2" reloadable="tr
ue"/>
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="node1_access_log." suffix=".log" ---prefix表示日志文件名以什么為前綴 suffix表示日志文件名以什么為后綴
pattern="%h %l %u %t "%r" %s %b" /> ---表示日志文件的格式
</Host>
service tomcat restart
測試
[root@redhat7 ~]#elinks -dump http://node1.magedu.com:8080/testapp
hello node1.magedu.com app
cat /var/log/tomcat/node1_access_log.2017-11-04.log
示例4 定義訪問控制
<Host name="node1.magedu.com" appBase="/app/website1"
unpackWARs="true" autoDeploy="true">
<Context path="/testapp" docBase="/app/website2" reloadable="true"/>
<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" allow="172\.18\.21\.7"/> ---表示只允許172.18.21.7訪問,如果允許多個ip地址中間用分號隔開,也可以使用deny表示拒絕
</Host>
6、manager圖形界面設置
1、Manager App配置
vim /etc/tomcat/tomcat-users.xml ---啟用一個角色,并定義登錄的用戶名和密碼,用這個賬號可以登錄到上圖中的上面兩個,Host Manager還要重新啟用角色和定義登錄用戶名和密碼
<role rolename="manager-gui"/>
<user username="tomcate" password="magedu" roles="manager-gui"/>
service tomcat restart
然后點擊上圖中的Manager App就可以進入到圖形界面
利用圖形界面進行熱部署
[root@centos6 app]#cp -r test/ /app/website3 ---創建一個websit3的目錄
[root@centos6 app]#ls
test website1 website2 website3
[root@centos6 app]#cd website3
[root@centos6 website3]#ls ---里面有index.jsp文件
classes index.jsp lib META-INF WEB-INF
在圖形界面進行如下設置
點擊Deploy
發現熱部署成功,點擊myapp就可以訪問網頁內容了
進入Server Status
2、Host Manager配置
vim /etc/tomcat/tomcat-users.xml ---定義一個角色和登錄的用戶名和密碼
<role rolename="admin-gui"/>
<user username="tomcat" password="magedu" roles="admin-gui"/>
service tomcat restart
可以在此圖形界面下添加一個虛擬主機
注意:通過上述圖形界面進行熱部署或者添加虛擬主機都是在內存中的,重啟主機后都會失效。
7、實現LNT動靜分離
這里nginx和tomcat在同一個主機,使用nginx反向代理至tomcat
1、安裝并啟動tomcat
2、安裝nginx并配置
vim /etc/nginx/nginx.conf
在server段增加如下內容
root /usr/local/tomcat/webapps/ROOT; ---表示訪問靜態文件就訪問nginx的這個目錄,此目錄是tomcat默認根目錄,此tomcat不是yum安裝的,是通過二進制安裝的,所以默認根目錄路徑和yum安裝的不同
index index.jsp;
location ~* \.(jsp|do)$ { ---訪問的是jsp或者do結尾的動態文件就調度到后端主機tomcat
proxy_pass http://127.0.0.1:8080;
}
nginx -t
nginx ----啟動服務
測試
http://172.18.21.107/ ---這里直接訪問80端口就可以了看到tomcat默認主頁面了
8、實現LAT
這里httpd和tomcat在同一個主機,使用httpd反向代理至tomcat
1、安裝并啟動tomcat
2、安裝httpd服務
[root@centos7 conf]#httpd -M |grep "proxy" ---查看模塊是否已經加載,如果沒有加載,要在配置文件中加載這些模塊
proxy_module (shared)
proxy_ajp_module (shared) ---表示方向代理時后端服務器是aip協議
proxy_balancer_module (shared)
proxy_connect_module (shared)
proxy_express_module (shared)
proxy_fcgi_module (shared)
proxy_fdpass_module (shared)
proxy_ftp_module (shared)
proxy_http_module (shared) ----表示方向代理時后端主機時http協議
proxy_scgi_module (shared)
proxy_wstunnel_module (shared)
3、與后端tomcat使用http協議連接時配置
vim /etc/httpd/conf.d/vhost.conf
<virtualhost *:80>
servername node2.magedu.com
documentroot "/usr/local/tomcat/webapps/ROOT"
<directory "usr/local/tomcat/webapps/ROOT">
require all granted
</directory>
proxyrequests off ---關閉正向代理,不加可以
proxyvia on ---在后端服務器響應給客戶端的響應報文中增加一個首部via,via的值為當前代理服務器的主機名,加不加都可以
proxypreservehost on ---表示客戶端訪問的時候保留請求報文中的主機頭,比如訪問的是www.magedu.com,如果不保留主機頭,網絡中的主機是通過ip地址通訊的,到服務器后并不知道你要訪問的是哪個虛擬主機,加上這一條就會在情況報文中保留這個主機頭,可以訪問后端固定的虛擬主機。不加也可以
proxypass "/" "http://127.0.0.1:8080/"
proxypassreverse "/" "http://127.0.0.1:8080/" ---表示客戶端重新發起請求后,比如url重定向時,對于這些重新發起的請求反向代理至哪
</virtualhost>
httpd -t
systemctl start httpd
測試:http://172.18.21.107/
4、與后tomcat連接時使用的ajp協議時的配置
vim /etc/httpd/conf.d/vhost.conf
<virtualhost *:80>
servername node2.magedu.com
documentroot "/usr/local/tomcat/webapps/ROOT"
<directory "usr/local/tomcat/webapps/ROOT">
require all granted
</directory>
proxyrequests off
proxyvia on
proxypreservehost on
proxypass "/" "ajp://127.0.0.1:8009/"
proxypassreverse "/" "ajp://127.0.0.1:8009/"
</virtualhost>
httpd -t
systemctl reload httpd
測試:http://172.18.21.107/