Linux實戰教學筆記47:JAVA企業級應用服務器之TOMCAT實戰

第一章 Tomcat簡介

  • Tomcat是Apache軟件基金會(Apache Software Foundation)的Jakarta項目中的一個核心項目,由Apache,Sun和其餘一些公司及我的共同開發而成。
  • Tomcat服務器是一個免費的開放源代碼的Web應用服務器,屬於輕量級應用服務器,在中小型系統和併發訪問用戶不是不少的場合下被廣泛使用,是開發和調試JSP程序的首選。
  • Tomcat和Nginx,APache(httpd),lighttpd等Web服務器同樣,具備處理HTML頁面的功能,另外它仍是一個Servlet和JSP容器,獨立的Servlet容器是Tomcat的默認模式。不過,Tomcat處理靜態HTML的能力不如Nginx/Apache服務器。

對比php軟件,區別?php

目前Tomcat最新版本爲9.0。Java容器還有resin,weblogic等。css

第二章 Tomcat安裝

2.1 軟件準備

JDK下載:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.htmlhtml

Tomcat下載:http://tomcat.apache.org/java

2.2 部署java環境jdk

#jdk的解壓安裝
[root@localhost ~]# tar xf jdk-8u60-linux-x64.tar.gz -C /usr/local/
[root@localhost ~]# ln -s /usr/local/jdk1.8.0_60 /usr/local/jdk

#配置java環境變量
[root@localhost ~]# sed -i.ori '$a export JAVA_HOME=/usr/local/jdk\nexport PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH\nexport CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar' /etc/profile
[root@localhost ~]# tail -3 /etc/profile
export JAVA_HOME=/usr/local/jdk
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
export CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar

#讓java環境變量馬上生效
[root@localhost ~]# source /etc/profile

#檢查java環境安裝狀況
[root@localhost ~]# which java
/usr/local/jdk/bin/java
[root@localhost ~]# java -version       #出現如下信息表示部署成功
java version "1.8.0_60"
Java(TM) SE Runtime Environment (build 1.8.0_60-b27)
Java HotSpot(TM) 64-Bit Server VM (build 25.60-b23, mixed mode)

關於上面那個sed命令的說明:
sed -i.ori :-i表示對文件自己操做,.ori表示修改的同時備份源文件
$a :$表示文件內容的最後一行,a表示在下面進行數據插入
\n :表示插入數據時換行linux

2.3 安裝Tomcat

#解壓安裝Tomcat
[root@localhost ~]# tar xf apache-tomcat-8.0.27.tar.gz -C /usr/local/
[root@localhost ~]# ln -s /usr/local/apache-tomcat-8.0.27/ /usr/local/tomcat

#配置Tomcat環境變量
[root@localhost ~]# echo 'export TOMCAT_HOME=/usr/local/tomcat' >> /etc/profile
[root@localhost ~]# source /etc/profile

#對jdk及Tomcat安裝目錄遞歸受權root
[root@localhost ~]# chown -R root.root /usr/local/jdk/ /usr/local/tomcat/

#檢查環境變量配置狀況
[root@localhost ~]# tail -4 /etc/profile
export JAVA_HOME=/usr/local/jdk
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
export CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar
export TOMCAT_HOME=/usr/local/tomcat

2.4 Tomcat目錄介紹

[root@localhost tomcat]# cd /usr/local/tomcat/
[root@localhost tomcat]# tree -L 1
.
├── bin         #用以啓動,關閉Tomcat或者其餘功能的腳本(.bat文件和.sh文件)
├── conf        #用以配置Tomcat的XML及DTD文件
├── lib         #存放web應用能訪問的JAR包
├── LICENSE
├── logs        #Catalina和其餘Web應用程序的日誌文件
├── NOTICE
├── RELEASE-NOTES
├── RUNNING.txt
├── temp        #臨時文件
├── webapps     #Web應用程序根目錄
└── work        #用以產生有JSP編譯出的Servlet的.java和.class文件

7 directories, 4 files

[root@localhost tomcat]# cd webapps/
[root@localhost webapps]# ll
total 20
drwxr-xr-x. 14 root root 4096 Oct 24 09:07 docs     #tomcat幫助文檔
drwxr-xr-x.  6 root root 4096 Oct 24 09:07 examples #web應用實例
drwxr-xr-x.  5 root root 4096 Oct 24 09:07 host-manager #管理
drwxr-xr-x.  5 root root 4096 Oct 24 09:07 manager      #管理
drwxr-xr-x.  3 root root 4096 Oct 24 09:07 ROOT         #默認網站根目錄

2.5 啓動Tomcat

啓動程序:/usr/local/tomcat/bin/startup.sh
關閉程序:/usr/local/tomcat/bin/shutdown.shnginx

[root@localhost webapps]# /usr/local/tomcat/bin/startup.sh  #程序啓動
Using CATALINA_BASE:   /usr/local/tomcat    #檢查環境變量CATALINA_BASE
Using CATALINA_HOME:   /usr/local/tomcat    #檢查環境變量CATALINA_HOME
Using CATALINA_TMPDIR: /usr/local/tomcat/temp   #檢查環境變量CATALINA_TMPDIR
Using JRE_HOME:        /usr/local/jdk   #檢查環境變量JRE_HOME
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.
[root@localhost webapps]# netstat -antup | grep java
tcp        0      0 :::8080                     :::*                        LISTEN      1352/java           
tcp        0      0 ::ffff:127.0.0.1:8005       :::*                        LISTEN      1352/java           
tcp        0      0 :::8009                     :::*                        LISTEN      1352/java

2.6 訪問網站

網址:10.0.0.134:8080(訪問時請注意關閉iptables)c++

QQ20171024-132634@2x.png-292.7kB

#查看Tomcat的日誌
[root@localhost webapps]# cd /usr/local/tomcat/logs/
[root@localhost logs]# ls
catalina.2017-10-24.log      localhost.2017-10-24.log
catalina.out                 localhost_access_log.2017-10-24.txt
host-manager.2017-10-24.log  manager.2017-10-24.log
[root@localhost logs]# cat catalina.out 
24-Oct-2017 09:20:13.718 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version:        Apache Tomcat/8.0.27
24-Oct-2017 09:20:13.720 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server built:          Sep 28 2015 08:17:25 UTC
24-Oct-2017 09:20:13.723 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server number:         8.0.27.0
24-Oct-2017 09:20:13.723 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Name:               Linux
24-Oct-2017 09:20:13.723 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Version:            2.6.32-431.el6.x86_64
24-Oct-2017 09:20:13.723 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Architecture:          amd64
24-Oct-2017 09:20:13.724 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Java Home:             /usr/local/jdk1.8.0_60/jre
24-Oct-2017 09:20:13.724 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Version:           1.8.0_60-b27
24-Oct-2017 09:20:13.724 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Vendor:            Oracle Corporation
24-Oct-2017 09:20:13.725 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_BASE:         /usr/local/apache-tomcat-8.0.27
24-Oct-2017 09:20:13.725 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_HOME:         /usr/local/apache-tomcat-8.0.27
24-Oct-2017 09:20:13.725 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties

第三章 Tomcat的配置文件

3.1 Tomcat配置文件

[root@localhost logs]# cd /usr/local/tomcat/conf/
[root@localhost conf]# ll -h
total 216K
drwxr-xr-x. 3 root root 4.0K Oct 24 09:20 Catalina
-rw-------. 1 root root  13K Sep 28  2015 catalina.policy
-rw-------. 1 root root 7.0K Sep 28  2015 catalina.properties
-rw-------. 1 root root 1.6K Sep 28  2015 context.xml
-rw-------. 1 root root 3.4K Sep 28  2015 logging.properties
-rw-------. 1 root root 6.4K Sep 28  2015 server.xml    #主配置文件
-rw-------. 1 root root 1.8K Sep 28  2015 tomcat-users.xml  #Tomcat管理用戶配置文件
-rw-------. 1 root root 1.9K Sep 28  2015 tomcat-users.xsd
-rw-------. 1 root root 164K Sep 28  2015 web.xml

3.2 Tomcat管理

測試功能,生產環境不要用:
Tomcat管理功能用於對Tomcat自身以及部署在Tomcat上的應用進行管理的Web應用。在默認狀況下是處於禁用狀態的。若是須要開啓這個功能,就須要配置管理用戶,即配置前面說過的tomcat-users.xml。web

#找到配置文件的第38行
[root@localhost conf]# cat -n /usr/local/tomcat/conf/tomcat-users.xml | sed -n '38p'
    38  </tomcat-users>
    
#在38行上加入以下三行代碼
[root@localhost conf]# tail -4 /usr/local/tomcat/conf/tomcat-users.xml
<role rolename="manager-gui"/>      #加入此行
<role rolename="admin-gui"/>        #加入此行
<user username="tomcat" password="tomcat" roles="manager-gui,admin-gui"/>    #加入此行
</tomcat-users>

#重啓tomcat服務
[root@localhost conf]# /usr/local/tomcat/bin/shutdown.sh 
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr/local/jdk
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
[root@localhost conf]# /usr/local/tomcat/bin/startup.sh 
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr/local/jdk
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.

在瀏覽器裏輸入http://10.0.0.134:8080/manager/status進行TOMCAT管理頁面數據庫

登錄驗證信息:帳號:tomcat 密碼:tomcatapache

QQ20171024-140247@2x.png-200kB

3.3 Tomcat主配置文件Server.xml詳解

3.3.1 Server.xml組件類別

  • 頂級組件:位於整個配置的頂層,如server。
  • 容器類組件:能夠包含其餘組件的組件,如service,engine,host,context
  • 鏈接器組件:鏈接用戶請求至tomcat,如connector。
  • 被嵌套類組件:位於一個容器當中,不能包含其餘組件,如Valve,logger。
<server>
     <service>
     <connector />
     <engine>
     <host>
     <context></context>
     </host>
     <host>
     <context></context>
     </host>
     </engine>
     </service>
</server>

3.3.2 組件詳解

  • engine:核心容器組件,catalina引擎,負責經過connector接收用戶請求,並處理請求,將請求轉至對應的虛擬主機host。
  • host:相似於httpd中的虛擬主機,通常而言支持基於FQDN的虛擬主機。
  • context:定義一個應用程序,是一個最內層的容器類組件(不能再嵌套)。配置context的主要目的指定對應對的webapp的根目錄,相似於httpd的alias,其還能爲webapp指定額外的屬性,如部署方式等。
  • connector:接收用戶請求,相似於httpd的listen配置監聽端口。
  • service(服務):將connector關聯至engine,所以一個service內部能夠有多個connector,但只能又一個引擎engine。service內部有兩個connector,一個engine。所以,通常狀況下一個server內部只有一個service,一個service內部只有一個engine,但一個service內部能夠有多個connector。
  • server:表示一個運行於JVM中的tomcat實例。
    Valve:閥門,攔截請求並在將其轉至對應的webapp前進行某種處理操做,能夠用於任何容器中,好比記錄日誌(access log valve),基於IP作訪問控制(remote address filer valve)。
  • logger:日誌記錄器,用於記錄組件內部的狀態信息,能夠用於除context外的任何容器中。
  • realm:能夠用於任意容器類的組件中,關聯一個用戶認證庫,實現認證和受權。能夠關聯的認證庫有兩種:UserDatabaseRealm,MemoryRealm和JDBCRealm。
  • UserDatabaseRealm:使用JNDI自定義的用戶認證庫。
  • MemoryRealm:認證信息定義在tomcat-users.xml中。
  • JDBCRealm:認證信息定義在數據庫中,並經過JDBC鏈接至數據庫中查找認證用戶。

3.3.3 配置文件註釋

<?xml version='1.0' encoding='utf-8'?>
<!--
<Server>元素表明整個容器,是Tomcat實例的頂層元素.由org.apache.catalina.Server接口來定義.它包含一個<Service>元素.而且它不能作爲任何元素的子元素.
    port指定Tomcat監聽shutdown命令端口.終止服務器運行時,必須在Tomcat服務器所在的機器上發出shutdown命令.該屬性是必須的.
    shutdown指定終止Tomcat服務器運行時,發給Tomcat服務器的shutdown監聽端口的字符串.該屬性必須設置
-->
<Server port="8005" shutdown="SHUTDOWN">
  <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
  <GlobalNamingResources>
    <Resource name="UserDatabase" auth="Container"
              type="org.apache.catalina.UserDatabase"
              description="User database that can be updated and saved"
              factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
              pathname="conf/tomcat-users.xml" />
  </GlobalNamingResources>
  <!--service服務組件-->
  <Service name="Catalina">
    <!--
    connector:接收用戶請求,相似於httpd的listen配置監聽端口.
        port指定服務器端要建立的端口號,並在這個端口監聽來自客戶端的請求。
        address:指定鏈接器監聽的地址,默認爲全部地址(即0.0.0.0)
        protocol鏈接器使用的協議,支持HTTP和AJP。AJP(Apache Jserv Protocol)專用於tomcat與apache創建通訊的, 在httpd反向代理用戶請求至tomcat時使用(可見Nginx反向代理時不可用AJP協議)。
        minProcessors服務器啓動時建立的處理請求的線程數
        maxProcessors最大能夠建立的處理請求的線程數
        enableLookups若是爲true,則能夠經過調用request.getRemoteHost()進行DNS查詢來獲得遠程客戶端的實際主機名,若爲false則不進行DNS查詢,而是返回其ip地址
        redirectPort指定服務器正在處理http請求時收到了一個SSL傳輸請求後重定向的端口號
        acceptCount指定當全部可使用的處理請求的線程數都被使用時,能夠放處處理隊列中的請求數,超過這個數的請求將不予處理
        connectionTimeout指定超時的時間數(以毫秒爲單位)
    -->
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
    <!--engine,核心容器組件,catalina引擎,負責經過connector接收用戶請求,並處理請求,將請求轉至對應的虛擬主機host
        defaultHost指定缺省的處理請求的主機名,它至少與其中的一個host元素的name屬性值是同樣的
    -->
    <Engine name="Catalina" defaultHost="localhost">
      <!--Realm表示存放用戶名,密碼及role的數據庫-->
      <Realm className="org.apache.catalina.realm.LockOutRealm">
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase"/>
      </Realm>
      <!--
      host表示一個虛擬主機
        name指定主機名
        appBase應用程序基本目錄,即存放應用程序的目錄.通常爲appBase="webapps" ,相對於CATALINA_HOME而言的,也能夠寫絕對路徑。
        unpackWARs若是爲true,則tomcat會自動將WAR文件解壓,不然不解壓,直接從WAR文件中運行應用程序
        autoDeploy:在tomcat啓動時,是否自動部署。
        xmlValidation:是否啓動xml的校驗功能,通常xmlValidation="false"。
        xmlNamespaceAware:檢測名稱空間,通常xmlNamespaceAware="false"。
      -->
      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
        <!--
        Context表示一個web應用程序,一般爲WAR文件
            docBase應用程序的路徑或者是WAR文件存放的路徑,也可使用相對路徑,起始路徑爲此Context所屬Host中appBase定義的路徑。
            path表示此web應用程序的url的前綴,這樣請求的url爲http://localhost:8080/path/****
            reloadable這個屬性很是重要,若是爲true,則tomcat會自動檢測應用程序的/WEB-INF/lib 和/WEB-INF/classes目錄的變化,自動裝載新的應用程序,能夠在不重啓tomcat的狀況下改變應用程序
        -->
        <Context path="" docBase="" debug=""/>
        <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" />
      </Host>
    </Engine>
  </Service>
</Server>

第四章 WEB站點部署

上線的代碼有兩種方式,第一種方式是直接將程序目錄放在webapps目錄下面,這種方式同窗們已經明白了,就很少說了。第二種方式是使用開發工具將程序打包成war包,而後上傳到webapps目錄下面。下面讓咱們見識一下這種方式。

4.1 使用war包部署web站點

#部署war包
[root@localhost ~]# ls -l memtest.war 
-rw-r--r--. 1 root root 643 Oct 24 13:39 memtest.war    #同窗們將此war包拷貝到Linux虛擬機中
[root@localhost ~]# cp memtest.war /usr/local/tomcat/webapps/
[root@localhost ~]# ls /usr/local/tomcat/webapps/
docs  examples  host-manager  manager  memtest.war  ROOT

#重啓tomcat服務
[root@localhost ~]# /usr/local/tomcat/bin/startup.sh 
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr/local/jdk
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.
[root@localhost ~]# netstat -antup | grep java
tcp        0      0 :::8080                     :::*                        LISTEN      1972/java           
tcp        0      0 ::ffff:127.0.0.1:8005       :::*                        LISTEN      1972/java           
tcp        0      0 :::8009                     :::*                        LISTEN      1972/java           

#查看war包的解壓縮狀況
[root@localhost webapps]# ls /usr/local/tomcat/webapps/
docs  examples  host-manager  manager  memtest  memtest.war  ROOT   #war包已經被解壓出來了

用瀏覽器訪問:http://10.0.0.134:8080/memtest/meminfo.jsp以下:

QQ20171024-233837@2x.png-78.8kB

4.2 自定義默認網站目錄

上面訪問的網址爲:http://10.0.0.134:8080/memtest/meminfo.jsp
如今我想訪問格式爲:http://10.0.0.134:8080/meminfo.jsp

方法一:

將meminfo.jsp或其餘程序放在tomcat/webapps/ROOT目錄下便可。由於默認網站根目錄爲tomcat/webapps/ROOT

方法二:

[root@tomcat ~]# vim /application/tomcat/conf/server.xml
      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
         <Context path="" docBase="/usr/local/tomcat/webapps/memtest" debug="0" reloadable="false" crossContext="true"/>      #在虛擬主機這裏添加一行代碼限定web站點的根目錄路徑
[root@tomcat ~]# /application/tomcat/bin/shutdown.sh
[root@tomcat ~]# /application/tomcat/bin/startup.sh

第五章 Tomcat多實例及集羣架構

5.1 Tomcat多實例

5.1.1 複製Tomcat目錄

[root@localhost ~]# cd /usr/local/
[root@localhost local]# ls
apache-tomcat-8.0.27  etc    include  jdk1.8.0_60  lib64    sbin   src
bin                   games  jdk      lib          libexec  share  tomcat
[root@localhost local]# cp -a apache-tomcat-8.0.27 tomcat8_1
[root@localhost local]# cp -a apache-tomcat-8.0.27 tomcat8_2

5.1.2 修改多實例配置文件

#建立多實例的網頁根目錄
[root@localhost local]# mkdir -p /data/www/www/ROOT

#將網頁程序拷貝到,多實例根目錄ROOT下
[root@localhost local]# cp /usr/local/tomcat/webapps/memtest/meminfo.jsp /data/www/www/ROOT/

#修改多實例配置文件的如下三行
[root@localhost local]# cat -n /usr/local/tomcat/conf/server.xml | sed -n '22p;69p;123p'
    22  <Server port="8005" shutdown="SHUTDOWN">    #管理端口及中止命令
    69      <Connector port="8080" protocol="HTTP/1.1"  #對外提供服務的端口
   123        <Host name="localhost"  appBase="webapps" #網站域名及網頁根目錄路徑
 
#修改第一個多實例配置文件
[root@localhost local]# sed -i '22s#8005#8011#;69s#8080#8081#;123s#appBase=".*"#appBase="/data/www/www"#' /usr/local/tomcat8_1/conf/server.xml 
[root@localhost local]# sed -n '22p;69p;123p' /usr/local/tomcat8_1/conf/server.xml
<Server port="8011" shutdown="SHUTDOWN">
    <Connector port="8081" protocol="HTTP/1.1"
      <Host name="localhost"  appBase="/data/www/www"

#修改第二個多實例配置文件
[root@localhost local]# sed -i '22s#8005#8012#;69s#8080#8082#;123s#appBase=".*"#appBase="/data/www/www"#' /usr/local/tomcat8_2/conf/server.xml 
[root@localhost local]# sed -n '22p;69p;123p' /usr/local/tomcat8_2/conf/server.xml
<Server port="8012" shutdown="SHUTDOWN">
    <Connector port="8082" protocol="HTTP/1.1"
      <Host name="localhost"  appBase="/data/www/www"

5.1.3 啓動多實例

#啓動多實例服務
[root@localhost ~]# /usr/local/tomcat8_1/bin/startup.sh 
Using CATALINA_BASE:   /usr/local/tomcat8_1
Using CATALINA_HOME:   /usr/local/tomcat8_1
Using CATALINA_TMPDIR: /usr/local/tomcat8_1/temp
Using JRE_HOME:        /usr/local/jdk
Using CLASSPATH:       /usr/local/tomcat8_1/bin/bootstrap.jar:/usr/local/tomcat8_1/bin/tomcat-juli.jar
Tomcat started.
[root@localhost ~]# /usr/local/tomcat8_2/bin/startup.sh 
Using CATALINA_BASE:   /usr/local/tomcat8_2
Using CATALINA_HOME:   /usr/local/tomcat8_2
Using CATALINA_TMPDIR: /usr/local/tomcat8_2/temp
Using JRE_HOME:        /usr/local/jdk
Using CLASSPATH:       /usr/local/tomcat8_2/bin/bootstrap.jar:/usr/local/tomcat8_2/bin/tomcat-juli.jar
Tomcat started.

#查看多實例進程啓動狀況
[root@localhost ~]# netstat -antup | grep java
tcp        0      0 ::ffff:127.0.0.1:8011       :::*                        LISTEN      2295/java           
tcp        0      0 ::ffff:127.0.0.1:8012       :::*                        LISTEN      2321/java           
tcp        0      0 :::8080                     :::*                        LISTEN      2031/java              
tcp        0      0 :::8081                     :::*                        LISTEN      2295/java           
tcp        0      0 :::8082                     :::*                        LISTEN      2321/java           
tcp        0      0 ::ffff:127.0.0.1:8005       :::*                        LISTEN      2031/java           
tcp        0      0 :::8009                     :::*                        LISTEN      2031/java

瀏覽器能夠分別訪問http://10.0.0.134:8081/meminfo.jsp和http://10.0.0.134:8082/meminfo.jsp

5.2 Tomcat集羣

使用nginx+Tomcat反向代理集羣

5.2.1 安裝nginx

[root@localhost ~]# yum -y install pcre-devel openssl-devel
[root@localhost ~]# wget -q http://nginx.org/download/nginx-1.10.2.tar.gz
[root@localhost ~]# useradd -s /sbin/nologin -M nginx
[root@localhost ~]# tar xf nginx-1.10.2.tar.gz -C /usr/src/
[root@localhost ~]# cd /usr/src/nginx-1.10.2/
[root@localhost nginx-1.10.2]# ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
[root@localhost nginx-1.10.2]# make && make install

5.2.2 修改nginx配置文件以下

#建立配置文件模版
[root@localhost nginx]# egrep -v "#|^$" /usr/local/nginx/conf/nginx.conf.default > /usr/local/nginx/conf/nginx.conf

#修改配置文件內容以下:
[root@localhost nginx]# cat /usr/local/nginx/conf/nginx.conf
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    upstream web_pools {
        server 127.0.0.1:8081;
        server 127.0.0.1:8082;
    }
    server {
        listen       80;
        server_name  localhost;
        location / {
            root   html;
            index  index.jsp index.html index.htm;
            proxy_pass http://web_pools;
        }
    }
}

#檢測語法並啓動nginx
[root@localhost nginx]# /usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@localhost nginx]# /usr/local/nginx/sbin/nginx
[root@localhost nginx]# netstat -antup | grep nginx
tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      4833/nginx

同窗們自行測試負載均衡效果

5.3 使用Tomcat安裝Jpress

JPress,一個wordpress的java代替版本,使用JFinal開發。須要maven支持

[root@localhost ~]# tar xf apache-maven-3.3.9-bin.tar.gz -C /usr/local/
[root@localhost ~]# ln -s /usr/local/apache-maven-3.3.9 /usr/local/maven
[root@localhost ~]# tail -2 /etc/profile
export MAVEN_HOME=/usr/local/maven
export PATH="$MAVEN_HOME/bin:$PATH"
[root@localhost ~]# source /etc/profile
[root@localhost ~]# mvn -version        #出現這個表示成功
Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-10T11:41:47-05:00)
Maven home: /usr/local/maven
Java version: 1.8.0_60, vendor: Oracle Corporation
Java home: /usr/local/jdk1.8.0_60/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "2.6.32-431.el6.x86_64", arch: "amd64", family: "unix"

將 jpress-web-newest.war包放到Tomcat網站根目錄下

#將war包放到網站根目錄下
[root@localhost ~]# ls -l jpress-web-newest.war 
-rw-r--r--. 1 root root 20797013 Oct 24 17:04 jpress-web-newest.war
[root@localhost ~]# mv jpress-web-newest.war /data/www/www/ROOT/

#解壓war包
[root@localhost ~]# which jar
/usr/local/jdk/bin/jar
[root@localhost ~]# cd /data/www/www/ROOT/
[root@localhost ROOT]# jar xf jpress-web-newest.war     #jar是war包的解壓命令
[root@localhost ROOT]# ls
jpress-web-newest.war  META-INF    static     WEB-INF
meminfo.jsp            robots.txt  templates

用瀏覽器訪問:http://10.0.0.134/install進入jpress安裝嚮導

QQ20171026-211253@2x.png-245.3kB

特別提示:

  • 雖然,Tomcat已經打開了自動解壓縮war包的功能,可是細心的同窗會發現我並無重啓Tomcat服務,所以,war包並無被自動解壓縮。故,咱們須要經過jar命令進行解壓縮,命令的參數和tar是同樣的。
  • 接下來咱們就須要爲jpress安裝數據庫了,以後的全部流程和閱讀材料LNMP的章節徹底同樣。所以,我這裏就不繼續操做了。

第六章 Tomcat安全優化和性能優化

6.1 安全優化

最重要的優化爲以下4項,但並不止這四種

  • 降權啓動
  • telnet管理端口保護
  • ajp鏈接端口保護
  • 禁用管理端

具體操做以下:

(1)降權啓動(同nginx優化部分的監牢模式)

降權的原則就是利用普通用戶來啓動Tomcat
(1)將Tomcat程序目錄拷貝到普通用戶家目錄下
(2)修改家目錄下程序的配置文件(啓動端口,檢測端口等),並從新指定網頁根目錄路徑。
(3)遞歸受權拷貝後的Tomcat程序的屬主屬組爲普通用戶。
(4)用su命令切換爲普通用戶,啓動Tomcat進程
(5)此時Tomcat進程的權限爲普通用戶權限
(6)若是利用/etc/rc.local文件配置普通用戶程序的開機啓動,那麼須要利用su -c臨時切換身份啓動。具體可參考linux基礎教案裏的用戶管理部分

(2)telnet管理端口保護

[root@localhost ~]# sed -n '22p' /usr/local/tomcat/conf/server.xml
<Server port="8005" shutdown="SHUTDOWN">    #表示經過8005端口來接受SHUTDOWN,用來中止Tomcat進程。默認的方式是很是危險的。須要進行修改
[root@localhost ~]# netstat -antup | grep java
tcp        0      0 ::ffff:127.0.0.1:8011       :::*                        LISTEN      2295/java           #本地8011端口接收SHUTDOWN命令
tcp        0      0 ::ffff:127.0.0.1:8012       :::*                        LISTEN      2321/java           #本地8012端口接收SHUTDOWN命令
tcp        0      0 :::8080                     :::*                        LISTEN      2031/java           
tcp        0      0 :::8081                     :::*                        LISTEN      2295/java           
tcp        0      0 :::8082                     :::*                        LISTEN      2321/java           
tcp        0      0 ::ffff:127.0.0.1:8005       :::*                        LISTEN      2031/java           #本地8005端口接收SHUTDOWN命令
tcp        0      0 :::8009                     :::*                        LISTEN      2031/java

Tomcat默認經過8005端口來接收SHUTDOWN這個字符串來關閉Tomcat進程,但這是很是危險的,所以須要修改端口號來防禦。不然,經過telnet命令便可強行關閉Tomcat進程

#利用Telnet來關閉Tomcat進程
[root@localhost ~]# telnet 127.0.0.1 8005   #經過telnet鏈接本地8005端口
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
SHUTDOWN        #發送SHUTDOWN字符串
Connection closed by foreign host.
[root@localhost ~]# netstat -antup | grep java      #能夠發現8005端口和8080端口的Tomcat進程沒了
tcp        0      0 ::ffff:127.0.0.1:8011       :::*                        LISTEN      2295/java           
tcp        0      0 ::ffff:127.0.0.1:8012       :::*                        LISTEN      2321/java           
tcp        0      0 :::8081                     :::*                        LISTEN      2295/java           
tcp        0      0 :::8082                     :::*                        LISTEN      2321/java           
[root@localhost ~]#

(3)ajp鏈接端口保護

[root@localhost ~]# sed -n '91p' /usr/local/tomcat/conf/server.xml
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />    #這是AJP協議打開的端口,咱們並不須要開啓這個端口,所以註釋掉本行

(4)禁用管理端

Tomcat默認在安裝完成後的網頁目錄裏有不少多餘的目錄,刪除全部不須要用到的目錄,並清空ROOT網頁默認根目錄下的全部東西,規避可能的代碼漏洞

[root@localhost ~]# cd /usr/local/tomcat/webapps/
[root@localhost webapps]# ls
docs  examples  host-manager  manager  memtest  memtest.war  ROOT   #有不少多餘的東西,只留下ROOT目錄,其餘都刪掉或者mv移走
[root@localhost webapps]# ls ROOT/  #不少多餘的東西,所以清空本目錄,或者都移走
asf-logo.png       bg-button.png  bg-nav-item.png  bg-upper.png  favicon.ico  meminfo.jsp        tomcat.css  tomcat.png        tomcat.svg
asf-logo-wide.gif  bg-middle.png  bg-nav.png       build.xml     index.jsp    RELEASE-NOTES.txt  tomcat.gif  tomcat-power.gif  WEB-INF

6.2 性能優化

6.2.1 屏蔽DNS查詢 enableLookups="false"

DNS查詢很是消耗時間,若是開啓會影響Tomcat性能,所以關閉。

#默認沒有,需添加配置文件以下代碼段,在Connector標籤位置。表示禁止DNS查詢
    <Connector  port="8081" protocol="HTTP/1.1"
               connectionTimeout="6000" enableLookups="false" acceptCount="800"
               redirectPort="8443" />

6.2.2 jvm調優

Tomcat最吃內存,只要內存足夠,這隻貓就跑的很快。
若是系統資源有限,那就須要進行調優,提升資源使用率。

#優化catalina.sh初始化腳本。在catalina.sh初始化腳本中添加如下代碼:
#catalina.sh的路徑爲:/usr/local/tomcat/bin/catalina.sh
#此行優化代碼須要加在腳本的最開始,聲明位置。不要放在後邊

JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms1024m -Xmx1024m -XX:NewSize=512m -XX:MaxNewSize=512m -XX:PermSize=512m -XX:MaxPermSize=512m"


#代碼說明:
server:必定要做爲第一個參數,在多個CPU時性能佳
-Xms:初始堆內存Heap大小,使用的最小內存,cpu性能高時此值應設的大一些
-Xmx:初始堆內存heap最大值,使用的最大內存
上面兩個值是分配JVM的最小和最大內存,取決於硬件物理內存的大小,建議均設爲物理內存的一半。
-XX:PermSize:設定內存的永久保存區域
-XX:MaxPermSize:設定最大內存的永久保存區域
-XX:MaxNewSize:
-Xss 15120 這使得JBoss每增長一個線程(thread)就會當即消耗15M內存,而最佳值應該是128K,默認值好像是512k.
+XX:AggressiveHeap 會使得 Xms沒有意義。這個參數讓jvm忽略Xmx參數,瘋狂地吃完一個G物理內存,再吃盡一個G的swap。
-Xss:每一個線程的Stack大小
-verbose:gc 現實垃圾收集信息
-Xloggc:gc.log 指定垃圾收集日誌文件
-Xmn:young generation的heap大小,通常設置爲Xmx的三、4分之一
-XX:+UseParNewGC :縮短minor收集的時間
-XX:+UseConcMarkSweepGC :縮短major收集的時間

JVM的調優比較複雜,對於初學的同窗們來講掌握這些就足夠了。若是想要更詳細的理解JVM如何調優,那麼請參考網友文章:http://www.cnblogs.com/xingzc/p/5756119.html

附錄1:企業案例:Linux下java/http進程高解決案例

生產環境下某臺tomcat7服務器,在剛發佈的時候一切都很正常,在運行一段時間後就出現CPU佔用很高的問題,基本上是負載一天比一天高。諸如此類問題,請排查!

問題分析:

(1)程序屬於CPU密集型,和開發溝經過,排除此類狀況
(2)程序代碼有問題,出現死循環,可能性極大

問題解決:

(1)開發那邊沒法排查代碼某個模塊有問題,從日誌上也沒法分析得出
(2)咱們能夠嘗試經過jstack命令來精肯定位出現錯誤的代碼段,從而拿給開發排查。

(1)首先查找進程高的PID號(先找到是哪一個PID號的進程致使的)

top -H

(2)查看這個進程全部系統調用(再找到是哪一個PID號的線程致使的)

strace -p 進程的PID

(3)若是是Web應用,能夠繼續打印該線程的堆棧信息(找出有問題的代碼塊)

printf "%x\n" 線程的PID --->#將有問題的線程的PID號轉換成16進制格式

jstack 進程的PID | grep 線程PID號的十六進制格式 -A 30 #過濾出有問題的線程的堆棧信息,找出問題代碼塊

實際操做演示:

[root@localhost ROOT]# pgrep -l java
2031 java       #java進程及對應PID號
2295 java
2321 java
[root@localhost ROOT]# strace -p 2031       #查看PID號爲2031的java進程的全部線程調用狀況
Process 2031 attached - interrupt to quit
futex(0x7f4cdd0e79d0, FUTEX_WAIT, 2032, NULL    #只有一個線程,線程的PID號爲2032
^C <unfinished ...>
Process 2031 detached
[root@localhost ROOT]# printf "%x\n" 2032   #將線程的PID號2032轉換成十六進制格式
7f0
[root@localhost ROOT]# jstack 2031 | grep 7f0 -A 30 #追蹤進稱號爲2031的進程的全部線程調用,從裏面過濾出16進製爲7f0的線程的代碼調用狀況
"main" #1 prio=5 os_prio=0 tid=0x00007f4cd4008800 nid=0x7f0 runnable [0x00007f4cdd0e5000]
   java.lang.Thread.State: RUNNABLE
    at java.net.PlainSocketImpl.socketAccept(Native Method)
    at java.net.AbstractPlainSocketImpl.accept(AbstractPlainSocketImpl.java:409)    #圓括號裏顯示的是(代碼類名:具體調用的代碼行號)
    at java.net.ServerSocket.implAccept(ServerSocket.java:545)
    at java.net.ServerSocket.accept(ServerSocket.java:513)
    at org.apache.catalina.core.StandardServer.await(StandardServer.java:446)
    at org.apache.catalina.startup.Catalina.await(Catalina.java:713)
    at org.apache.catalina.startup.Catalina.start(Catalina.java:659)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:351)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:485)

"VM Thread" os_prio=0 tid=0x00007f4cd406d000 nid=0x7f1 runnable 

"VM Periodic Task Thread" os_prio=0 tid=0x00007f4cd40b8800 nid=0x7f8 waiting on condition 

JNI global references: 244

附錄2:jstack命令(Java stack Trace)

(1)介紹

  • jstack用於打印出給定的java進程ID或core file或遠程調試服務的Java堆棧信息,若是是在64位機器上,須要指定選項"-J-d64",Windows的jstack使用方式只支持如下的這種方式:
    jstack [-l] pid
  • 若是java程序崩潰生成core文件,jstack工具能夠用來得到core文件的java stack和native stack的信息,從而能夠輕鬆地知道java程序是如何崩潰和在程序何處發生問題。另外,jstack工具還能夠附屬到正在運行的java程序中,看到當時運行的java程序的java stack和native stack的信息, 若是如今運行的java程序呈現hung的狀態,jstack是很是有用的。

(2)命令格式

jstack [ option ] pid
jstack [ option ] executable core
jstack [ option ] [server-id@]remote-hostname-or-IP

(3)經常使用參數說明

1)、options:

executable Java executable from which the core dump was produced.
(多是產生core dump的java可執行程序)
core 將被打印信息的core dump文件
remote-hostname-or-IP 遠程debug服務的主機名或ip
server-id 惟一id,假如一臺主機上多個遠程debug服務

2)、基本參數:

-F:當’jstack [-l] pid’沒有相應的時候強制打印棧信息 -l:長列表. 打印關於鎖的附加信息,例如屬於java.util.concurrent的ownable synchronizers列表. -m:打印java和native c/c++框架的全部棧信息. -h | -help:打印幫助信息 pid :須要被打印配置信息的java進程id,能夠用jps查詢.

相關文章
相關標籤/搜索