11月3日 tomcat

1、tomcat的安裝環(huán)境

tomcat使用java語言來編寫,tomcat和php一樣都是用來處理動態(tài)程序的(也可以解析靜態(tài)資源),tomcat可以處理.jsp或者.do結(jié)尾的動態(tài)文件,處理時并不是tomcat本身去處理,而是交給后端的jvm來處理,也就是java虛擬機來處理,處理之前先裝入tomcat的類文件,然后由jvm來處理,所以安裝tomcat必須先安裝JDK(Java Development Kit),java開發(fā)工具箱在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官方網(wǎng)站上下載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/   ---發(fā)現(xiàn)有很多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     ---發(fā)現(xiàn)java環(huán)境已經(jīng)準備好了,定義完P(guān)ATH變量,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并不是一個二進制的程序,而是一個腳本文件,通過腳本文件調(diào)用java程序,
/etc/tomcat   ---配置文件目錄
/etc/tomcat/server.xml   ---主配置文件
/etc/tomcat/tomcat-users.xml   ---用戶認證的賬號和密碼文件;角色(role),用戶(User),此文件在tomcat啟動時被裝入內(nèi)存
/usr/share/tomcat/webapps    ---webapp的默認根目錄
service tomcat start
[root@centos6 tomcat]#ps -aux    ---我們發(fā)現(xiàn)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))
監(jiān)聽的端口有三個:8080為http協(xié)議的接口,8009為ajp協(xié)議的接口,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    ---發(fā)現(xiàn)tomcat實例被關(guān)閉了,所以這個管理端口監(jiān)聽在本地的8005,這樣比較安全,不然誰telnet到這個端口都可以關(guān)閉tomcat,不過一般這個端最好不要監(jiān)聽,這樣更安全
如何進行安全設(shè)置
vim /etc/tomcat/server.xml
 <Server port="8005" shutdown="SHUTDOWN">
把上面的改成port=-1,就表示關(guān)閉端口
或者openssl rand -hex 10 生成一個隨機數(shù)來當shuntdown,這樣別人就不知道該怎么關(guān)閉了
http://172.18.21.106:8080/   ---訪問http協(xié)議的接口可以看到web站點
2、Tomcat binary release
在官方網(wǎng)站上下載
http://tomcat.apache.org/
tomcat是屬于apache旗下的產(chǎn)品
這里下載的是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時最好以普通用戶的身份運行,所以創(chuàng)建一個tomcat用戶
[root@centos7 tomcat]#chown -R root:tomcat ./*   ---修改tomcat目錄下的文件的所有者和所屬組,這里只修改所屬組為tomcat是因為怕tomcat賬號被別人盜用后,登陸此賬號后修改tomcat內(nèi)的二進制程序文件
[root@centos7 tomcat]#chown -R tomcat ./{logs,temp,work,webapps,conf}   ---將這些目錄的所有者修改為tomcat,因為在執(zhí)行tomcat時有可能要修改這些目錄
內(nèi)的文件
[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    ---利用這個命令來啟動和關(guān)閉tomcat
[tomcat@centos7 ~]$catalina.sh --help    
[tomcat@centos7 ~]$ss -nlt    ---發(fā)現(xiàn)端口已經(jīng)打開
[tomcat@centos7 ~]$ps -aux   ---發(fā)現(xiàn)是以tomcat的身份在運行,如果用root用戶去開啟tomcat會發(fā)現(xiàn)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,即表現(xiàn)出的一個java進程;監(jiān)聽在8005端口,只接收“SHUTDOWN”。各server監(jiān)聽的端口不能相同,因此,在同一物理主機啟動多個實例及多個java進程時,需要修改其監(jiān)聽端口為不同的端口;
  • service:用于實現(xiàn)將一個或多個connector組件關(guān)聯(lián)至一個engine組件;
  • Connector組件:負責接收請求,連接內(nèi)部的Engine,常見的有三類http/https/ajp;
    進入tomcat的請求可分為兩類:
    (1) standalone : 請求直接來自于客戶端瀏覽器;
    (2) 由其它的web server反代:來自前端的反代服務(wù)器;
    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:監(jiān)聽的IP地址;默認為本機所有可用地址;
    maxThreads:最大并發(fā)連接數(shù),默認為200;
    enableLookups:是否啟用DNS查詢功能;
    acceptCount:等待隊列的最大長度;
    secure="TRUE" 后面兩個屬性是啟用https的配置,一般tomcat不會使用https,而不是在前段的反代上設(shè)置,因為tomcat本身運行起來已經(jīng)很慢了,加上https就更慢了
    sslProtocol:ssl協(xié)議類型
  • Engine組件:Servlet實例,即servlet引擎,其內(nèi)部可以一個或多個host組件來定義站點; 通常需要通過defaultHost來定義默認的虛擬主機;
  • Host組件:位于engine內(nèi)部用于接收請求并進行相應(yīng)處理的主機或虛擬主機
 <Host name="localhost"  appBase="webapps"
        unpackWARs="true" autoDeploy="true">
</Host>
appBase:設(shè)置默認網(wǎng)頁文件的存放路徑,也就是根目錄,相當于httpd的document root
unpackWARs:如果我們拿到的一個程序是.war格式的,把它放到網(wǎng)頁文件存放的目錄下會自動展開
autoDeploy:是否啟動自動部署功能
  • Context組件:用來定義一個獨立的應(yīng)用,也就是你訪問哪個uri時訪問的是哪個目錄,相當于http里的別名
    示例:
    <Context path="/PATH" docBase="/PATH/TO/SOMEDIR" reloadable=""/>
  • Valve組件:
    Valve存在多種類型:
    定義訪問日志:org.apache.catalina.valves.AccessLogValve
    定義訪問控制:org.apache.catalina.valves.RemoteAddrValve
Paste_Image.png

webapp歸檔格式:
.war:webapp; ---一般生產(chǎn)中用到的都是這種格式的打包好的程序文件,只要把它扔到網(wǎng)頁程序文件存放的目錄下就會自動展開這個文件,不用解壓包
.jar:EJB的類打包文件(類庫);
.rar:資源適配器類打包文件;
.ear:企業(yè)級webapp;
JSP WebAPP的組織結(jié)構(gòu):
/: 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/ 可以看到根目錄結(jié)構(gòu)

4、部署(deploy)webapp的相關(guān)操作

  • deploy:將webapp的源文件放置于目標目錄(網(wǎng)頁程序文件存放目錄),配置tomcat服務(wù)器能夠基于web.xml和context.xml文件中定義的路徑來訪問此webapp;將其特有的類和依賴的類通過class loader裝載至JVM;
  • 部署有兩種方式:
    自動部署:auto deploy
    手動部署:
    冷部署:把webapp復制到指定的位置,而后才啟動tomcat;
    熱部署:在不停止tomcat的前提下進行部署;
    部署工具:manager、ant腳本、tcd(tomcat client deployer)等;
    undeploy:拆除(反部署),停止webapp,并從tomcat實例上卸載webapp;
    start:啟動處于停止狀態(tài)的webapp;
    stop:停止webapp,不再向用戶提供服務(wù);其類依然在jvm上;
    redeploy:重新部署;
    示例:冷部署一個test程序
mkdir /app/test/{WEB-INF} -pv   ---模仿根目錄的結(jié)構(gòu)創(chuàng)建一個測試的程序目錄
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    ---冷部署要先停止服務(wù)
cp -r /app/test/ /usr/share/tomcat/webapps/   ---把這個寫好的動態(tài)程序放到網(wǎng)站的根目錄下
service tomcat start
測試
http://172.18.21.106:8080/test/   發(fā)現(xiàn)hello world 部署成功

5、tomcat配置

示例1虛擬主機

vim /etc/tomcat/server.xml 
 <Host name="node1.magedu.com"  appBase="/app/website1" ---網(wǎng)站的根目錄
            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

總結(jié):/app/website1為網(wǎng)站的根目錄,在根目錄下創(chuàng)建一個ROOT目錄,把程序文件放到這個目錄下,在網(wǎng)頁上輸入http://node1.magedu.com:8080/就可以自動找到這個程序,如果根目錄下創(chuàng)建的不是ROOT目錄,而是別的目錄,比如test目錄,訪問網(wǎng)站的時候就要輸入http://node1.magedu.com:8080/test,就像我們輸入http://172.18.21.106:8080/,會自動訪問默認虛擬主機的/usr/share/tomcat/appwebs/ROOT目錄的程序文件,也就是網(wǎng)站的默認主頁面,是一個湯姆貓
示例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圖形界面設(shè)置

QQ截圖20171104152040.png

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   ---創(chuàng)建一個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

在圖形界面進行如下設(shè)置

Paste_Image.png

點擊Deploy

QQ截圖20171104154310.png

發(fā)現(xiàn)熱部署成功,點擊myapp就可以訪問網(wǎng)頁內(nèi)容了
進入Server Status

QQ截圖20171104155601.png

2、Host Manager配置

vim /etc/tomcat/tomcat-users.xml ---定義一個角色和登錄的用戶名和密碼
<role rolename="admin-gui"/> 
<user username="tomcat" password="magedu" roles="admin-gui"/>
service tomcat restart

可以在此圖形界面下添加一個虛擬主機

Paste_Image.png

注意:通過上述圖形界面進行熱部署或者添加虛擬主機都是在內(nèi)存中的,重啟主機后都會失效。

7、實現(xiàn)LNT動靜分離

這里nginx和tomcat在同一個主機,使用nginx反向代理至tomcat

1、安裝并啟動tomcat
2、安裝nginx并配置
vim /etc/nginx/nginx.conf
在server段增加如下內(nèi)容
root         /usr/local/tomcat/webapps/ROOT;    ---表示訪問靜態(tài)文件就訪問nginx的這個目錄,此目錄是tomcat默認根目錄,此tomcat不是yum安裝的,是通過二進制安裝的,所以默認根目錄路徑和yum安裝的不同
 index index.jsp;
        location ~* \.(jsp|do)$ {   ---訪問的是jsp或者do結(jié)尾的動態(tài)文件就調(diào)度到后端主機tomcat
        proxy_pass http://127.0.0.1:8080;
        }
nginx -t
nginx  ----啟動服務(wù)
測試
http://172.18.21.107/    ---這里直接訪問80端口就可以了看到tomcat默認主頁面了

8、實現(xiàn)LAT

這里httpd和tomcat在同一個主機,使用httpd反向代理至tomcat

1、安裝并啟動tomcat
2、安裝httpd服務(wù)
[root@centos7 conf]#httpd -M |grep "proxy"  ---查看模塊是否已經(jīng)加載,如果沒有加載,要在配置文件中加載這些模塊
 proxy_module (shared)
 proxy_ajp_module (shared)    ---表示方向代理時后端服務(wù)器是aip協(xié)議
 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協(xié)議
 proxy_scgi_module (shared)
 proxy_wstunnel_module (shared)
3、與后端tomcat使用http協(xié)議連接時配置
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  ---關(guān)閉正向代理,不加可以
        proxyvia on    ---在后端服務(wù)器響應(yīng)給客戶端的響應(yīng)報文中增加一個首部via,via的值為當前代理服務(wù)器的主機名,加不加都可以
        proxypreservehost on  ---表示客戶端訪問的時候保留請求報文中的主機頭,比如訪問的是www.magedu.com,如果不保留主機頭,網(wǎng)絡(luò)中的主機是通過ip地址通訊的,到服務(wù)器后并不知道你要訪問的是哪個虛擬主機,加上這一條就會在情況報文中保留這個主機頭,可以訪問后端固定的虛擬主機。不加也可以
        proxypass "/" "http://127.0.0.1:8080/"  
        proxypassreverse "/" "http://127.0.0.1:8080/"   ---表示客戶端重新發(fā)起請求后,比如url重定向時,對于這些重新發(fā)起的請求反向代理至哪
</virtualhost>
httpd -t
systemctl start httpd
測試:http://172.18.21.107/
4、與后tomcat連接時使用的ajp協(xié)議時的配置
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/
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容