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

 
  1. #jdk的解壓安裝
  2. [root@localhost ~]# tar xf jdk-8u60-linux-x64.tar.gz -C /usr/local/
  3. [root@localhost ~]# ln -s /usr/local/jdk1.8.0_60 /usr/local/jdk
  4. #配置java環境變量
  5. [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
  6. [root@localhost ~]# tail -3 /etc/profile
  7. export JAVA_HOME=/usr/local/jdk
  8. export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
  9. export CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar
  10. #讓java環境變量馬上生效
  11. [root@localhost ~]# source /etc/profile
  12. #檢查java環境安裝狀況
  13. [root@localhost ~]# which java
  14. /usr/local/jdk/bin/java
  15. [root@localhost ~]# java -version #出現如下信息表示部署成功
  16. java version "1.8.0_60"
  17. Java(TM) SE Runtime Environment (build 1.8.0_60-b27)
  18. Java HotSpot(TM) 64-Bit Server VM (build 25.60-b23, mixed mode)

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

 

2.3 安裝Tomcat

 
  1. #解壓安裝Tomcat
  2. [root@localhost ~]# tar xf apache-tomcat-8.0.27.tar.gz -C /usr/local/
  3. [root@localhost ~]# ln -s /usr/local/apache-tomcat-8.0.27/ /usr/local/tomcat
  4. #配置Tomcat環境變量
  5. [root@localhost ~]# echo 'export TOMCAT_HOME=/usr/local/tomcat' >> /etc/profile
  6. [root@localhost ~]# source /etc/profile
  7. #對jdk及Tomcat安裝目錄遞歸受權root
  8. [root@localhost ~]# chown -R root.root /usr/local/jdk/ /usr/local/tomcat/
  9. #檢查環境變量配置狀況
  10. [root@localhost ~]# tail -4 /etc/profile
  11. export JAVA_HOME=/usr/local/jdk
  12. export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
  13. export CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar
  14. export TOMCAT_HOME=/usr/local/tomcat
 

2.4 Tomcat目錄介紹

 
  1. [root@localhost tomcat]# cd /usr/local/tomcat/
  2. [root@localhost tomcat]# tree -L 1
  3. .
  4. ├── bin #用以啓動,關閉Tomcat或者其餘功能的腳本(.bat文件和.sh文件)
  5. ├── conf #用以配置Tomcat的XML及DTD文件
  6. ├── lib #存放web應用能訪問的JAR包
  7. ├── LICENSE
  8. ├── logs #Catalina和其餘Web應用程序的日誌文件
  9. ├── NOTICE
  10. ├── RELEASE-NOTES
  11. ├── RUNNING.txt
  12. ├── temp #臨時文件
  13. ├── webapps #Web應用程序根目錄
  14. └── work #用以產生有JSP編譯出的Servlet的.java和.class文件
  15. 7 directories, 4 files
  16. [root@localhost tomcat]# cd webapps/
  17. [root@localhost webapps]# ll
  18. total 20
  19. drwxr-xr-x. 14 root root 4096 Oct 24 09:07 docs #tomcat幫助文檔
  20. drwxr-xr-x. 6 root root 4096 Oct 24 09:07 examples #web應用實例
  21. drwxr-xr-x. 5 root root 4096 Oct 24 09:07 host-manager #管理
  22. drwxr-xr-x. 5 root root 4096 Oct 24 09:07 manager #管理
  23. 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

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

2.6 訪問網站

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

QQ20171024-132634@2x.png-292.7kB

 
  1. #查看Tomcat的日誌
  2. [root@localhost webapps]# cd /usr/local/tomcat/logs/
  3. [root@localhost logs]# ls
  4. catalina.2017-10-24.log localhost.2017-10-24.log
  5. catalina.out localhost_access_log.2017-10-24.txt
  6. host-manager.2017-10-24.log manager.2017-10-24.log
  7. [root@localhost logs]# cat catalina.out
  8. 24-Oct-2017 09:20:13.718 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version: Apache Tomcat/8.0.27
  9. 24-Oct-2017 09:20:13.720 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server built: Sep 28 2015 08:17:25 UTC
  10. 24-Oct-2017 09:20:13.723 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server number: 8.0.27.0
  11. 24-Oct-2017 09:20:13.723 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Name: Linux
  12. 24-Oct-2017 09:20:13.723 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Version: 2.6.32-431.el6.x86_64
  13. 24-Oct-2017 09:20:13.723 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Architecture: amd64
  14. 24-Oct-2017 09:20:13.724 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Java Home: /usr/local/jdk1.8.0_60/jre
  15. 24-Oct-2017 09:20:13.724 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Version: 1.8.0_60-b27
  16. 24-Oct-2017 09:20:13.724 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Vendor: Oracle Corporation
  17. 24-Oct-2017 09:20:13.725 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_BASE: /usr/local/apache-tomcat-8.0.27
  18. 24-Oct-2017 09:20:13.725 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_HOME: /usr/local/apache-tomcat-8.0.27
  19. 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配置文件

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

3.2 Tomcat管理

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

 
  1. #找到配置文件的第38行
  2. [root@localhost conf]# cat -n /usr/local/tomcat/conf/tomcat-users.xml | sed -n '38p'
  3. 38 </tomcat-users>
  4. #在38行上加入以下三行代碼
  5. [root@localhost conf]# tail -4 /usr/local/tomcat/conf/tomcat-users.xml
  6. <role rolename="manager-gui"/> #加入此行
  7. <role rolename="admin-gui"/> #加入此行
  8. <user username="tomcat" password="tomcat" roles="manager-gui,admin-gui"/> #加入此行
  9. </tomcat-users>
  10. #重啓tomcat服務
  11. [root@localhost conf]# /usr/local/tomcat/bin/shutdown.sh
  12. Using CATALINA_BASE: /usr/local/tomcat
  13. Using CATALINA_HOME: /usr/local/tomcat
  14. Using CATALINA_TMPDIR: /usr/local/tomcat/temp
  15. Using JRE_HOME: /usr/local/jdk
  16. Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
  17. [root@localhost conf]# /usr/local/tomcat/bin/startup.sh
  18. Using CATALINA_BASE: /usr/local/tomcat
  19. Using CATALINA_HOME: /usr/local/tomcat
  20. Using CATALINA_TMPDIR: /usr/local/tomcat/temp
  21. Using JRE_HOME: /usr/local/jdk
  22. Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
  23. 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。
 
  1. <server>
  2. <service>
  3. <connector />
  4. <engine>
  5. <host>
  6. <context></context>
  7. </host>
  8. <host>
  9. <context></context>
  10. </host>
  11. </engine>
  12. </service>
  13. </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 配置文件註釋

 
  1. <?xml version='1.0' encoding='utf-8'?>
  2. <!--
  3. <Server>元素表明整個容器,是Tomcat實例的頂層元素.由org.apache.catalina.Server接口來定義.它包含一個<Service>元素.而且它不能作爲任何元素的子元素.
  4. port指定Tomcat監聽shutdown命令端口.終止服務器運行時,必須在Tomcat服務器所在的機器上發出shutdown命令.該屬性是必須的.
  5. shutdown指定終止Tomcat服務器運行時,發給Tomcat服務器的shutdown監聽端口的字符串.該屬性必須設置
  6. -->
  7. <Server port="8005" shutdown="SHUTDOWN">
  8. <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
  9. <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
  10. <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
  11. <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
  12. <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
  13. <GlobalNamingResources>
  14. <Resource name="UserDatabase" auth="Container"
  15. type="org.apache.catalina.UserDatabase"
  16. description="User database that can be updated and saved"
  17. factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
  18. pathname="conf/tomcat-users.xml" />
  19. </GlobalNamingResources>
  20. <!--service服務組件-->
  21. <Service name="Catalina">
  22. <!--
  23. connector:接收用戶請求,相似於httpd的listen配置監聽端口.
  24. port指定服務器端要建立的端口號,並在這個端口監聽來自客戶端的請求。
  25. address:指定鏈接器監聽的地址,默認爲全部地址(即0.0.0.0)
  26. protocol鏈接器使用的協議,支持HTTP和AJP。AJP(Apache Jserv Protocol)專用於tomcat與apache創建通訊的, 在httpd反向代理用戶請求至tomcat時使用(可見Nginx反向代理時不可用AJP協議)。
  27. minProcessors服務器啓動時建立的處理請求的線程數
  28. maxProcessors最大能夠建立的處理請求的線程數
  29. enableLookups若是爲true,則能夠經過調用request.getRemoteHost()進行DNS查詢來獲得遠程客戶端的實際主機名,若爲false則不進行DNS查詢,而是返回其ip地址
  30. redirectPort指定服務器正在處理http請求時收到了一個SSL傳輸請求後重定向的端口號
  31. acceptCount指定當全部可使用的處理請求的線程數都被使用時,能夠放處處理隊列中的請求數,超過這個數的請求將不予處理
  32. connectionTimeout指定超時的時間數(以毫秒爲單位)
  33. -->
  34. <Connector port="8080" protocol="HTTP/1.1"
  35. connectionTimeout="20000"
  36. redirectPort="8443" />
  37. <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
  38. <!--engine,核心容器組件,catalina引擎,負責經過connector接收用戶請求,並處理請求,將請求轉至對應的虛擬主機host
  39. defaultHost指定缺省的處理請求的主機名,它至少與其中的一個host元素的name屬性值是同樣的
  40. -->
  41. <Engine name="Catalina" defaultHost="localhost">
  42. <!--Realm表示存放用戶名,密碼及role的數據庫-->
  43. <Realm className="org.apache.catalina.realm.LockOutRealm">
  44. <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
  45. resourceName="UserDatabase"/>
  46. </Realm>
  47. <!--
  48. host表示一個虛擬主機
  49. name指定主機名
  50. appBase應用程序基本目錄,即存放應用程序的目錄.通常爲appBase="webapps" ,相對於CATALINA_HOME而言的,也能夠寫絕對路徑。
  51. unpackWARs若是爲true,則tomcat會自動將WAR文件解壓,不然不解壓,直接從WAR文件中運行應用程序
  52. autoDeploy:在tomcat啓動時,是否自動部署。
  53. xmlValidation:是否啓動xml的校驗功能,通常xmlValidation="false"。
  54. xmlNamespaceAware:檢測名稱空間,通常xmlNamespaceAware="false"。
  55. -->
  56. <Host name="localhost" appBase="webapps"
  57. unpackWARs="true" autoDeploy="true">
  58. <!--
  59. Context表示一個web應用程序,一般爲WAR文件
  60. docBase應用程序的路徑或者是WAR文件存放的路徑,也可使用相對路徑,起始路徑爲此Context所屬Host中appBase定義的路徑。
  61. path表示此web應用程序的url的前綴,這樣請求的url爲http://localhost:8080/path/****
  62. reloadable這個屬性很是重要,若是爲true,則tomcat會自動檢測應用程序的/WEB-INF/lib 和/WEB-INF/classes目錄的變化,自動裝載新的應用程序,能夠在不重啓tomcat的狀況下改變應用程序
  63. -->
  64. <Context path="" docBase="" debug=""/>
  65. <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
  66. prefix="localhost_access_log" suffix=".txt"
  67. pattern="%h %l %u %t &quot;%r&quot; %s %b" />
  68. </Host>
  69. </Engine>
  70. </Service>
  71. </Server>
 

第四章 WEB站點部署

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

 

4.1 使用war包部署web站點

 
  1. #部署war包
  2. [root@localhost ~]# ls -l memtest.war
  3. -rw-r--r--. 1 root root 643 Oct 24 13:39 memtest.war #同窗們將此war包拷貝到Linux虛擬機中
  4. [root@localhost ~]# cp memtest.war /usr/local/tomcat/webapps/
  5. [root@localhost ~]# ls /usr/local/tomcat/webapps/
  6. docs examples host-manager manager memtest.war ROOT
  7. #重啓tomcat服務
  8. [root@localhost ~]# /usr/local/tomcat/bin/startup.sh
  9. Using CATALINA_BASE: /usr/local/tomcat
  10. Using CATALINA_HOME: /usr/local/tomcat
  11. Using CATALINA_TMPDIR: /usr/local/tomcat/temp
  12. Using JRE_HOME: /usr/local/jdk
  13. Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
  14. Tomcat started.
  15. [root@localhost ~]# netstat -antup | grep java
  16. tcp 0 0 :::8080 :::* LISTEN 1972/java
  17. tcp 0 0 ::ffff:127.0.0.1:8005 :::* LISTEN 1972/java
  18. tcp 0 0 :::8009 :::* LISTEN 1972/java
  19. #查看war包的解壓縮狀況
  20. [root@localhost webapps]# ls /usr/local/tomcat/webapps/
  21. 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

方法二:

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

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

 

5.1 Tomcat多實例

 

5.1.1 複製Tomcat目錄

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

5.1.2 修改多實例配置文件

 
  1. #建立多實例的網頁根目錄
  2. [root@localhost local]# mkdir -p /data/www/www/ROOT
  3. #將網頁程序拷貝到,多實例根目錄ROOT下
  4. [root@localhost local]# cp /usr/local/tomcat/webapps/memtest/meminfo.jsp /data/www/www/ROOT/
  5. #修改多實例配置文件的如下三行
  6. [root@localhost local]# cat -n /usr/local/tomcat/conf/server.xml | sed -n '22p;69p;123p'
  7. 22 <Server port="8005" shutdown="SHUTDOWN"> #管理端口及中止命令
  8. 69 <Connector port="8080" protocol="HTTP/1.1" #對外提供服務的端口
  9. 123 <Host name="localhost" appBase="webapps" #網站域名及網頁根目錄路徑
  10. #修改第一個多實例配置文件
  11. [root@localhost local]# sed -i '22s#8005#8011#;69s#8080#8081#;123s#appBase=".*"#appBase="/data/www/www"#' /usr/local/tomcat8_1/conf/server.xml
  12. [root@localhost local]# sed -n '22p;69p;123p' /usr/local/tomcat8_1/conf/server.xml
  13. <Server port="8011" shutdown="SHUTDOWN">
  14. <Connector port="8081" protocol="HTTP/1.1"
  15. <Host name="localhost" appBase="/data/www/www"
  16. #修改第二個多實例配置文件
  17. [root@localhost local]# sed -i '22s#8005#8012#;69s#8080#8082#;123s#appBase=".*"#appBase="/data/www/www"#' /usr/local/tomcat8_2/conf/server.xml
  18. [root@localhost local]# sed -n '22p;69p;123p' /usr/local/tomcat8_2/conf/server.xml
  19. <Server port="8012" shutdown="SHUTDOWN">
  20. <Connector port="8082" protocol="HTTP/1.1"
  21. <Host name="localhost" appBase="/data/www/www"
 

5.1.3 啓動多實例

 
  1. #啓動多實例服務
  2. [root@localhost ~]# /usr/local/tomcat8_1/bin/startup.sh
  3. Using CATALINA_BASE: /usr/local/tomcat8_1
  4. Using CATALINA_HOME: /usr/local/tomcat8_1
  5. Using CATALINA_TMPDIR: /usr/local/tomcat8_1/temp
  6. Using JRE_HOME: /usr/local/jdk
  7. Using CLASSPATH: /usr/local/tomcat8_1/bin/bootstrap.jar:/usr/local/tomcat8_1/bin/tomcat-juli.jar
  8. Tomcat started.
  9. [root@localhost ~]# /usr/local/tomcat8_2/bin/startup.sh
  10. Using CATALINA_BASE: /usr/local/tomcat8_2
  11. Using CATALINA_HOME: /usr/local/tomcat8_2
  12. Using CATALINA_TMPDIR: /usr/local/tomcat8_2/temp
  13. Using JRE_HOME: /usr/local/jdk
  14. Using CLASSPATH: /usr/local/tomcat8_2/bin/bootstrap.jar:/usr/local/tomcat8_2/bin/tomcat-juli.jar
  15. Tomcat started.
  16. #查看多實例進程啓動狀況
  17. [root@localhost ~]# netstat -antup | grep java
  18. tcp 0 0 ::ffff:127.0.0.1:8011 :::* LISTEN 2295/java
  19. tcp 0 0 ::ffff:127.0.0.1:8012 :::* LISTEN 2321/java
  20. tcp 0 0 :::8080 :::* LISTEN 2031/java
  21. tcp 0 0 :::8081 :::* LISTEN 2295/java
  22. tcp 0 0 :::8082 :::* LISTEN 2321/java
  23. tcp 0 0 ::ffff:127.0.0.1:8005 :::* LISTEN 2031/java
  24. tcp 0 0 :::8009 :::* LISTEN 2031/java

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

 

5.2 Tomcat集羣

使用nginx+Tomcat反向代理集羣

 

5.2.1 安裝nginx

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

5.2.2 修改nginx配置文件以下

 
  1. #建立配置文件模版
  2. [root@localhost nginx]# egrep -v "#|^$" /usr/local/nginx/conf/nginx.conf.default > /usr/local/nginx/conf/nginx.conf
  3. #修改配置文件內容以下:
  4. [root@localhost nginx]# cat /usr/local/nginx/conf/nginx.conf
  5. worker_processes 1;
  6. events {
  7. worker_connections 1024;
  8. }
  9. http {
  10. include mime.types;
  11. default_type application/octet-stream;
  12. sendfile on;
  13. keepalive_timeout 65;
  14. upstream web_pools {
  15. server 127.0.0.1:8081;
  16. server 127.0.0.1:8082;
  17. }
  18. server {
  19. listen 80;
  20. server_name localhost;
  21. location / {
  22. root html;
  23. index index.jsp index.html index.htm;
  24. proxy_pass http://web_pools;
  25. }
  26. }
  27. }
  28. #檢測語法並啓動nginx
  29. [root@localhost nginx]# /usr/local/nginx/sbin/nginx -t
  30. nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
  31. nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
  32. [root@localhost nginx]# /usr/local/nginx/sbin/nginx
  33. [root@localhost nginx]# netstat -antup | grep nginx
  34. tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 4833/nginx

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

 

5.3 使用Tomcat安裝Jpress

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

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

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

 
  1. #將war包放到網站根目錄下
  2. [root@localhost ~]# ls -l jpress-web-newest.war
  3. -rw-r--r--. 1 root root 20797013 Oct 24 17:04 jpress-web-newest.war
  4. [root@localhost ~]# mv jpress-web-newest.war /data/www/www/ROOT/
  5. #解壓war包
  6. [root@localhost ~]# which jar
  7. /usr/local/jdk/bin/jar
  8. [root@localhost ~]# cd /data/www/www/ROOT/
  9. [root@localhost ROOT]# jar xf jpress-web-newest.war #jar是war包的解壓命令
  10. [root@localhost ROOT]# ls
  11. jpress-web-newest.war META-INF static WEB-INF
  12. 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管理端口保護

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

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

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

(3)ajp鏈接端口保護

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

(4)禁用管理端

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

 
  1. [root@localhost ~]# cd /usr/local/tomcat/webapps/
  2. [root@localhost webapps]# ls
  3. docs examples host-manager manager memtest memtest.war ROOT #有不少多餘的東西,只留下ROOT目錄,其餘都刪掉或者mv移走
  4. [root@localhost webapps]# ls ROOT/ #不少多餘的東西,所以清空本目錄,或者都移走
  5. asf-logo.png bg-button.png bg-nav-item.png bg-upper.png favicon.ico meminfo.jsp tomcat.css tomcat.png tomcat.svg
  6. 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性能,所以關閉。

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

6.2.2 jvm調優

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

 
  1. #優化catalina.sh初始化腳本。在catalina.sh初始化腳本中添加如下代碼:
  2. #catalina.sh的路徑爲:/usr/local/tomcat/bin/catalina.sh
  3. #此行優化代碼須要加在腳本的最開始,聲明位置。不要放在後邊
  4. 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"
  5. #代碼說明:
  6. server:必定要做爲第一個參數,在多個CPU時性能佳
  7. -Xms:初始堆內存Heap大小,使用的最小內存,cpu性能高時此值應設的大一些
  8. -Xmx:初始堆內存heap最大值,使用的最大內存
  9. 上面兩個值是分配JVM的最小和最大內存,取決於硬件物理內存的大小,建議均設爲物理內存的一半。
  10. -XX:PermSize:設定內存的永久保存區域
  11. -XX:MaxPermSize:設定最大內存的永久保存區域
  12. -XX:MaxNewSize:
  13. -Xss 15120 這使得JBoss每增長一個線程(thread)就會當即消耗15M內存,而最佳值應該是128K,默認值好像是512k.
  14. +XX:AggressiveHeap 會使得 Xms沒有意義。這個參數讓jvm忽略Xmx參數,瘋狂地吃完一個G物理內存,再吃盡一個Gswap
  15. -Xss:每一個線程的Stack大小
  16. -verbose:gc 現實垃圾收集信息
  17. -Xloggc:gc.log 指定垃圾收集日誌文件
  18. -Xmnyoung generationheap大小,通常設置爲Xmx34分之一
  19. -XX:+UseParNewGC :縮短minor收集的時間
  20. -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 #過濾出有問題的線程的堆棧信息,找出問題代碼塊

實際操做演示:

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

相關文章
相關標籤/搜索