Tomcat

Tomcat相關概念

官網:http://tomcat.apache.org/javascript

Tomcat 是由 Apache 開發的一個 Servlet 容器,實現了對 Servlet 和 JSP(Java Server Pages動態頁面設計) 的支持,並提供了做爲Web服務器的一些特有功能,如Tomcat管理和控制平臺、安全域管理和Tomcat閥等。Tomcat 服務器是一個免費的開放源代碼的Web 應用服務器,運行jsp和servlet,使用HTTP與客戶端(一般是瀏覽器)進行通訊。Tomcat 是一個小型的輕量級應用服務器,在中小型系統和併發訪問用戶不是不少的場合下被廣泛使用,是開發和調試JSP 程序的首選,由於Tomcat 技術先進、性能穩定,成爲目前比較流行的Web 應用服務器。Tomcat是應用(java)服務器,它只是一個servlet容器,是Apache的擴展,但它是獨立運行的。css

JDK:java工具箱
JRE:java運行時環境
JVM:C語言研發,java虛擬機
ajp:AJP13是定向包協議,httpd支持此協議,nginx不支持
jsp:java server page
jasper:負責將.jsp 轉換爲 .java
applet:Applet或Java小應用程序是一種在Web環境下,運行於客戶端的Java程序組件
servlet:全稱Java Servlet, 是用Java編寫的服務器端程序,其主要功能在於交互式地瀏覽和修改數據,
生成動態Web內容,將.java轉換成字節碼

tomcat和apache的區別

apache:側重於http server 
tomcat:側重於servlet引擎,若是以standalone方式運行,功能上與apache等效 , 支持JSP,但對靜態網頁不太理想; 
apache是web服務器,tomcat是應用(java)服務器,它只是一個servlet(jsp也翻譯成servlet)容器,能夠認爲是apache的擴展,可是能夠獨立於apache運行。 
換句話說,apache是一輛卡車,上面能夠裝一些東西如html等。可是不能裝水,要裝水必需要有容器(桶),而這個桶也能夠不放在卡車上。html

編程語言:

硬件級:微碼編程,彙編語言
系統級:C,C++,…
應用級:Java, PHP, Python, Ruby, Perl, C#, …前端

程序:指令+數據
過程式編程:以指令爲中心,數據服務於代碼;
對象式編程:以數據爲中心,指令服務於數據;
對象,方法(method)java

Tomcat的安裝

Tomcat是使用Java語言編寫的程序,其運行的代碼也是Java編寫的,因此實現tomcat的應用須要在Java的虛擬機上運行。因此須要安裝另外一個軟件:JDKnode

安裝的方式分爲兩種:yum直接安裝。下載最新版的rmp包來安裝。linux

1 .yum安裝的詳細 步驟:nginx

#yum install java-1.8.0-openjdk-devel  #安裝jdk.;openjdk是開源的軟件,不是oracle公司的jdk;相似於MySQL和mariad之間的關係。
# yum install tomcat tomcat-webapps tomcat-admin-webapps tomcat-docs-webapp #安裝tomcat及相關應用
#systemctl start tomcat  #開啓tomcat服務
在瀏覽器上訪問:http://192.168.130.11:8080/ #服務起來後就會看到tomcat的文檔頁面,由於安裝時安裝了文檔tomcat-docs-webapp
# java -version  #查看java版本信息
# tomcat version  #查看tomcat版本信息

啓動服務:git

# systemctl start tomcat
# ss -tnl
LISTEN      0      1        ::ffff:127.0.0.1:8005  #管理端口,建議關閉
LISTEN      0      100        :::8009              #AJP協議默認監聽端口
LISTEN      0      100        :::8080              #HTTP協議默認監聽端口

tomcat的目錄結構:github

配置文件目錄:/etc/tomcat/
主配置文件:server.xml
webapps存放位置:/var/lib/tomcat/webapps/
環境配置文件:/etc/sysconfig/tomcat

2 .官網下載包安裝:

JDK下載的官網
下載地址:http://www.oracle.com/technetwork/java/javase/downloads/
# rpm -ivh jdk-8u25-linux-x64.rpm  #解包
# ll /usr/java/  #默認安裝路徑
lrwxrwxrwx 1 root root  16 Jul 17 19:46 default -> /usr/java/latest 
drwxr-xr-x 9 root root 268 Jul 17 19:46 jdk1.8.0_25
lrwxrwxrwx 1 root root  21 Jul 17 19:46 latest -> /usr/java/jdk1.8.0_25
# vim /etc/profile.d/java.sh  #將java環境變量加入系統環境變量
export JAVA_HOME=/usr/java/latest
export PATH=$JAVA_HOME/bin:$PATH
# . /etc/profile.d/java.sh  讓配置文件生效
安裝tomcat:
官方下載地址:
#wget 局域網下載
# yum install lftp # lftp
172.20.0.1/pub #共享資源裏下載 cd ok, cwd=/pub lftp 172.20.0.1:/pub> cd Sources/7.x86_64/tomcat/ cd ok, cwd=/pub/Sources/7.x86_64/tomcat lftp 172.20.0.1:/pub/Sources/7.x86_64/tomcat> ls -rw-r--r-- 1 0 0 8968516 Nov 10 2017 apache-tomcat-7.0.78.tar.gz -rw-r--r-- 1 0 0 9584807 Jun 20 20:26 apache-tomcat-8.5.32.tar.gz -rw-r--r-- 1 0 0 64283906 Nov 10 2017 javaee-bbs-1.3.zip -rw-r--r-- 1 0 0 21588975 Nov 10 2017 solo-2.2.0.war lftp 172.20.0.1:/pub/Sources/7.x86_64/tomcat> mget apache-tomcat-8.5.32.tar.gz 9584807 bytes transferred lftp 172.20.0.1:/pub/Sources/7.x86_64/tomcat> bye # ls anaconda-ks.cfg hellodb_innodb.sql original-ks.cfg test ansible mariadb.sh Pictures vcl.load apache-tomcat-8.5.32.tar.gz media Public Videos Desktop Music Python-2.7.8.tgz Documents ~None seq.sh Downloads numgen.sh Templates # tar xf apache-tomcat-8.5.32.tar.gz -C /usr/local/ # cd /usr/local/ # ls apache-tomcat-8.5.32 etc include lib64 sbin src bin games lib libexec share # ln -sv apache-tomcat-8.5.32 tomcat #建立同名的軟鏈接 ‘tomcat’ -> ‘apache-tomcat-8.5.32’ # ll total 0 lrwxrwxrwx 1 root root 20 Jul 18 14:19 tomcat -> apache-tomcat-8.5.32 # cd tomcat/ # pwd /usr/local/tomcat #useradd tomcat #建立tomcat用戶做爲運行tomcat程序的用戶 #chown -R :tomcat ./* #改變tomcat文件夾下的文件屬組 #chown -R tomcat logs/ temp/ work/ #將這三個文件的全部者改成tomcat全部 #chmod g+rw logs/ #chmod g+rw logs/* #給tomcat的 日誌文件添加組的讀和執行的權限,當在切換到tomcat用戶時能夠開啓tomcat服務 #chmod g+rx conf/ #chmod g+rx conf/* #給tomcat的配置文件添加組的讀和執行的權限,當在切換到tomcat用戶時能夠開啓tomcat服務 #vim /etc/profile.d/tomcat.sh #建立文件將tomcat的程序加入到環境變量當中去,環境變量不用寫絕對路徑 export CATALINA_BASE=/usr/local/tomcat export PATH=$CATALINA_BASE/bin/:$PATH #. /etc/profile.d/tomcat.sh #讓此配置文件生效 /usr/local/tomcat/bin下有個啓動tomcat的腳本:catalina.sh #catalina.sh start #啓動tomcat服務 #catalina.sh stop #中止服務 #catalina.sh –help #能夠查看其餘的命令 或者切換到tomcat用戶 在開啓服務,這樣比較安全。 #su -tomcat #catalina.sh start (啓動服務)http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/v8.5.32/bin/apache-tomcat-8.5.32.tar.gz
# ls -1 /usr/local/tomcat/
bin:腳本及啓動時用到的類
conf:配置文件目錄
lib:庫文件,Java類庫,jar
logs:日誌文件目錄
temp:臨時文件目錄
webapps:webapp的默認目錄
work:工做目錄
# catalina.sh --help
commands:
  debug             #調試模式啓動
  jpda start        #jpda的debug模式啓動
  run               #前臺啓動
  start             #後臺啓動
  stop              #關閉
  stop n            #n秒後關閉
  stop -force       #強制關閉
  stop n -force     #n秒後強制關閉
  configtest        #測試配置文件語法
  version           #查看相關版本信息
# 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/8.5.32
Server built:   Jun 20 2018 19:50:35 UTC
Server number:  8.5.32.0
OS Name:        Linux
OS Version:     3.10.0-862.el7.x86_64
Architecture:   amd64
JVM Version:    1.8.0_25-b17
JVM Vendor:     Oracle Corporation

manager、host-manager和docs

依賴包:

  • tomcat-webapps
  • tomcat-admin-webapps
  • tomcat-docs-webapp

一、配置:manager管理webapps應用程序

# vim /etc/tomcat/tomcat-users.xml #添加
<role rolename="manager-gui"/>
<user username="admin" password="admin" roles="manager-gui"/>
# systemctl restart tomcat
訪問:http://192.168.130.8:8080/manager/進入管理頁面

二、配置:host-manager管理虛擬主機

# vim /etc/tomcat/tomcat-users.xml  #添加
<role rolename="admin-gui"/> 
<role rolename="manager-gui"/>
<user username="admin" password="admin" roles="manager-gui,admin-gui"/>
 # systemctl restart tomcat
訪問:http://192.168.130.8:8080/host-manager/進入管理頁面

三、docs獲取離線文檔

訪問:http://192.168.130.8:8080/docs/

Tomcat的配置參數

  • server.xml:主配置文件
  • web.xml:每一個webapp只有「部署」後才能被訪問,它的部署方式一般由web.xml進行定義,其存放位置爲WEB-INF/目錄中;此文件爲全部的webapps提供默認部署相關的配置
  • context.xml:每一個webapp均可以專用的配置文件,它一般由專用的配置文件context.xml來定義,其存放位置爲WEB-INF/目錄中;此文件爲全部的webapps提供默認配置
  • tomcat-users.xml:用戶認證的帳號和密碼文件
  • catalina.policy:當使用-security選項啓動tomcat時,用於爲tomcat設置安全策略
  • catalina.properties:Java屬性的定義文件,用於設定類加載器路徑,以及一些與JVM調優相關參數
  • logging.properties:日誌系統相關的配置

一、tomcat的核心組件:server.xml

配置文件框架:

<Server>
    <Service>
        <connector/>
        <Engine>
            <Host>
                <Context>
                    <Valve/>
                </Context/>
            </Host>
        </Engine>
    </Service>
</Server>

每個組件都由一個Java「類」實現,這些組件大致可分爲如下幾個類型:

頂級組件:Server
服務類組件:Service
鏈接器組件:http, https, ajp(apache jserv protocol)
容器類:Engine, Host, Context
被嵌套類:valve, logger, realm, loader, manager, ...
集羣類組件:listener, cluster, ...

二、Tomcat的經常使用組件配置:

  • Server:表明tomcat instance,即表現出的一個java進程;監聽在8005端口,只接收「SHUTDOWN」。各server監聽的端口不能相同,所以,在同一物理主機啓動多個實例時,須要修改其監聽端口爲不一樣的端口;
  • Service:用於實現將一個或多個connector組件關聯至一個engine組件;
  • Connector組件:負責接收請求,常見的有三類http/https/ajp;
port="8080" 監聽的端口
protocol="HTTP/1.1" 協議
connectionTimeout="20000" 鏈接超時時間,單位ms,2秒
address:監聽的IP地址;默認爲本機全部可用地址;
maxThreads:最大併發鏈接數,默認爲200;
enableLookups:是否啓用DNS查詢功能;
acceptCount:等待隊列的最大長度;
secure:安全相關;
sslProtocol:加密傳輸相關;

  Engine組件:Servlet實例,即servlet引擎,其內部能夠一個或多個host組件來定義站點; 一般須要經過defaultHost屬性來定義默認的虛擬主機;

name=
defaultHost="localhost"
jvmRoute=

  Host組件:位於engine內部用於接收請求並進行相應處理的主機或虛擬主機

<Host name="localhost"  appBase="webapps"
      unpackWARs="true" autoDeploy="true">
</Host>
appBase:此Host的webapps的默認存放目錄,指存放非歸檔的web應用程序的目錄或歸檔的WAR文件目錄路徑;可使用基於$CATALINA_BASE變量所定義的路徑的相對路徑;
autoDeploy:在Tomcat處於運行狀態時,將某webapp放置於appBase所定義的目錄中時,是否自動將其部署至tomcat;

  Context組件:至關於nginx中的alias的功能

<Context path="/PATH" docBase="/PATH/TO/SOMEDIR" reloadable=""/>
path:url路徑
docBase:網頁文件目錄路徑
  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 &quot;%r&quot; %s %b" />
定義訪問控制:org.apache.catalina.valves.RemoteAddrValve
<Valve className="org.apache.catalina.valves.RemoteAddrValve" deny="172\.16\.100\.67"/>

三、組件配置示例:

  配置示例:Host組件

[root@node1 ~]# vim /etc/tomcat/server.xml
<Host>
  ...
  <Host name="www.a.com" appBase="/web/apps" 
unpackWARs="true" autoDeploy="true"/> </Engine># mkdir -pv /web/apps/ROOT/# vim /web/apps/ROOT/index.jsp <%@ page language="java" %> <html> <head><title>TomcatA</title></head> <body> <h1><font color="red">TomcatA.a.com</font></h1> <table align="centre" border="1"> <tr> <td>Session ID</td> <% session.setAttribute("a.com","a.com"); %> <td><%= session.getId() %></td> </tr> <tr> <td>Created on</td> <td><%= session.getCreationTime() %></td> </tr> </table> </body> </html># systemctl restart tomcat 測試訪問:在centos圖形界面上
#vim /etc/hosts
192.168.130.11   www.a.com
在圖形界面的瀏覽器上:http:
//www.a.com:8080/

  配置示例:Context組件(至關於apache的別名做用)

# vim /etc/tomcat/server.xml
<Engine>
  ...
    <Host name="www.a.com" appBase="/web/apps" unpackWARs="true" autoDeploy="true">
      <Context path="/testapp" docBase="/web/testapp" reloadable=""/>
    </Host>
</Engine># systemctl restart tomcat
# mkdir -pv /web/testapp/ROOT
# vim /web/testapp/index.jsp
...
測試訪問:在centos圖形界面上
#vim /etc/hosts
192.168.130.11   www.a.com
在圖形界面的瀏覽器上:http://www.a.com:8080/testapp/

  配置示例:Valve組件

# vim /etc/tomcat/server.xml
<Host name="www.a.com" appBase="/web/apps" unpackWARs="true" autoDeploy="true">
  <Context path="/testapp" docBase="/web/testapp" reloadable="">
    <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
      prefix="a_test_access_" suffix=".log"
      pattern="%h %l %u %t &quot;%r&quot; %s %b" />
  </Context>
</Host>
[root@node1 ~]# systemctl restart tomcat
[root@node1 ~]# tail /var/log/tomcat/www_test_access_2018-07-19.log
192.168.130.8 - - [17/Jul/2018:22:59:30 +0800] "GET /testapp/ HTTP/1.1" 200 334

四、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

deploy:將webapp的源文件放置於目標目錄(網頁程序文件存放目錄),配置tomcat服務器可以基於web.xml和
context.xml文件中定義的路徑來訪問此webapp;將其特有的類和依賴的類經過class loader裝載至JVM; undeploy:反部署,中止webapp,並從tomcat實例上卸載webapp; start:啓動處於中止狀態的webapp; stop:中止webapp,再也不向用戶提供服務;其類依然在jvm上; redeploy:從新部署; 部署可分爲自動部署和手動部署;手動部署又有冷部署和熱部署: 冷部署:把webapp複製到指定的位置,然後才啓動tomcat; 熱部署:在不中止tomcat的前提下進行部署;部署工具備manager、ant腳本、tcd(tomcat client
deployer)等;

示例:手動提供測試類應用,並冷部署

[root@node1 ~]# mkdir -pv /var/lib/tomcat/webapps/test/{classes,lib,WEB-INF}
[root@node1 ~]# 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>
訪問:http://192.168.130.11:8080/test/
hello world % %

實驗:用nginx將服務反代到後臺tomcat的服務器上去

將全部服務都反代到後臺tomcat服務器

1 、 在調度器nginx上的配置:

#yum install nginx   #安裝服務
#vim /etc/nginx/conf.d/test.conf   #配置代理服務器的配置文件
server {
  listen 80 default_server;
  server_name www.a.com;
  root /usr/share/nginx/html;
  location / {
  proxy_pass http://192.168.130.11:8080;
  }
}
#nginx #啓動服務

二、在後臺服務器tomcat上配置

#yum install java-1.8.0-openjdk-devel  #安裝jdk
# yum install tomcat tomcat-webapps tomcat-admin-webapps tomcat-docs-webapp #安裝to
mcat及相關應用 #systemctl start tomcat #啓動服務 #ss
-ntl #查看對應端口

3 、在測試的機器上:

#vim/etc/hosts
192.168.130.11 www.aa.com  #此IP地址爲nginx反代服務器tomcat的地址
訪問:在此機器上圖形界面覽器上打開網頁:http://www.a.com:8080

實驗:實現tomcat的負載均衡(使用nginx做爲反代服務器)

1 .在nginx服務器上

#yum install nginx   #安裝服務包
#vim /etc/nginx/nginx.conf
upstream www {
server 192.168.60.20:8080;
server 192.168.60.21:8080;
}   #添加後端tomcat服務器的IP地址
#vim /etc/nginx/conf.d/test.conf
server {
  listen 80 default_server;
  server_name www.aa.com;
  root /usr/share/nginx/html;
  location / {
  proxy_pass http://www;
   }
}        #默認的是輪詢的調度算法
#nginx -s reload   #從新加載配置文件
#nginx   #開啓服務

2 、在後臺tomcatA服務器上

#yum install java-1.8.0-openjdk-devel
#yum install java-1.8.0-openjdk tomacat tomcat-docs-webapp tomcat-webapps
#cd   /usr/share/tomcat/webapps/ROOT/
刪除原有的index.jsp的文件
#vim insex.jsp   #新建測試文件
<%@ page language="java" %>
<html>
    <head><title>TomcatA</title></head>
    <body>
        <h1><font color="red">TomcatA.magedu.com</font></h1>
        <table align="centre" border="1">
            <tr>
                <td>Session ID</td>
            <% session.setAttribute("magedu.com","magedu.com"); %>
                <td><%= session.getId() %></td>
            </tr>
            <tr>
                <td>Created on</td>
                <td><%= session.getCreationTime() %></td>
            </tr>
        </table>
    </body>
</html>
#systemctl restart tomcat

三、在後臺tomcatB服務器上

#yum install java-1.8.0-openjdk-devel
#yum install java-1.8.0-openjdk tomacat tomcat-docs-webapp tomcat-webapps
#cd   /usr/share/tomcat/webapps/ROOT/
刪除原有的index.jsp的文件
#vim insex.jsp   #新建測試文件
<%@ page language="java" %>
<html>
    <head><title>TomcatA</title></head>
    <body>
        <h1><font color="red">TomcatB.magedu.com</font></h1>
        <table align="centre" border="1">
            <tr>
                <td>Session ID</td>
            <% session.setAttribute("magedu.com","magedu.com"); %>
                <td><%= session.getId() %></td>
            </tr>
            <tr>
                <td>Created on</td>
                <td><%= session.getCreationTime() %></td>
            </tr>
        </table>
    </body>
</html>
#systemctl restart tomcat

四、訪問:http://192.168.130.10(nginx的IP)

實驗:單個主機的調度(使用httpd做反代服務器)

[root@tomcat ~]# httpd -M |grep proxy
 proxy_module (shared) #代理模塊
 proxy_ajp_module (shared) #適配ajp協議客戶端
 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)

配置Tomcat:

#yum install java-1.8.0-openjdk-devel
#yum install java-1.8.0-openjdk tomacat tomcat-docs-webapp tomcat-webapps
#cd /usr/share/tomcat/webapps/ROOT/
刪除原有的index.jsp的文件
#vim insex.jsp   #新建測試文件
<%@ page language="java" %>
<html>
    <head><title>TomcatA</title></head>
    <body>
        <h1><font color="red">TomcatA.magedu.com</font></h1>
        <table align="centre" border="1">
            <tr>
                <td>Session ID</td>
            <% session.setAttribute("magedu.com","magedu.com"); %>
                <td><%= session.getId() %></td>
            </tr>
            <tr>
                <td>Created on</td>
                <td><%= session.getCreationTime() %></td>
            </tr>
        </table>
    </body>
</html>
#systemctl restart tomcat

配置httpd:

# vim /etc/httpd/conf.d/http-tomcat.conf
<VirtualHost *:80>
    ServerName www.a.com
    ProxyRequests Off  #關閉正向代理
    ProxyVia On
    ProxyPreserveHost On  #將請求頭HOST發送給後端主機
    <Proxy *>
        Require all granted
    </Proxy>
     ProxyPass / http://192.168.130.11:8080/
    <Location />
        Require all granted
    </Location>
</VirtualHost>
[root@tomcat ~]# systemctl start httpd

訪問:   

http://192.168.130.10

Tomcat的會話集羣  

Session:

  在計算機中,尤爲是在網絡應用中,稱爲「會話控制」。Session 對象存儲特定用戶會話所需的屬性及配置信息。這樣,當用戶在應用程序的 Web 頁之間跳轉時,存儲在 Session 對象中的變量將不會丟失,而是在整個用戶會話中一直存在下去。當用戶請求來自應用程序的 Web 頁時,若是該用戶尚未會話,則 Web 服務器將自動建立一個 Session 對象。當會話過時或被放棄後,服務器將終止該會話。

  在現今的互聯網架構中會話保持愈來愈重要,可是會話的保持卻在必定程度上依賴於提供服務的服務器上,隨着併發量的不斷提高,服務器最終會因爲負載太高而宕機,所以引入了負載均衡機制,可是負載均衡的調度會使得同一用戶的請求被調度到不一樣的主機之上,會嚴重的影響到session的保存。   

session cluster:delta session manager;會話集羣,對帶寬消耗較大,集羣規模建議3-5臺

  1. 默認多播地址:228.0.0.4
  2. 多播通訊使用的端口:45564
  3. IP廣播的方式來實現獲取主機名,主機IP地址等,不能是監聽在127.0.0.1
  4. 偵聽複製消息的TCP端口是範圍:4000-4100
  5. 必須配置集羣會話監聽器
  6. 各集羣時間必須同步

前端nginx配置:

upstream tcsrvs {
        server 192.168.130.10:80;
        server 192.168.130.11:80;
}
server {
        listen 80;
        server_name a.com;
        location / {
                proxy_pass http://tcsrvs;
        }
}

tomcat-A:

# vim /data/webapp/ROOT/index.jsp  #建測試頁面
<%@ page language="java" %>
<html>
    <head><title>TomcatA</title></head>
    <body>
        <h1><font color="red">TomcatA.magedu.com</font></h1>
        <table align="centre" border="1">
            <tr>
                <td>Session ID</td>
            <% session.setAttribute("magedu.com","magedu.com"); %>
                <td><%= session.getId() %></td>
            </tr>
            <tr>
                <td>Created on</td>
                <td><%= session.getCreationTime() %></td>
            </tr>
        </table>
    </body>
</html>
# vim /etc/tomcat/server.xml
      <Host name="node1.dongfei.tech" appBase="/data/webapp" unpackWARs="true" autoDeploy="true">
        <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
                 channelSendOptions="8">
#channelSendOptions:發送消息的信道選項,0-15
          <Manager className="org.apache.catalina.ha.session.DeltaManager"
                   expireSessionsOnShutdown="false"
                   notifyListenersOnReplication="true"/>
#Manager:定義新的會話管理器DeltaManager
#expireSessionsOnShutdown:一旦把當前Tomcat節點關閉,是否將這節點的Tomcat會話失效,false表示不失效
#notifyListenersOnReplication:如今若是要發送資源同步給其餘節點,是否通知偵聽器資源變更,必須打開
          <Channel className="org.apache.catalina.tribes.group.GroupChannel">
            <Membership className="org.apache.catalina.tribes.membership.McastService"
                        address="228.0.0.4"
                        port="45564"
                        frequency="500"
                        dropTime="3000"/>
             #McastService:多播通訊
             #address:多播通訊地址
             #port:端口
             #frequency:每隔多長時間發送一次本身的心跳信息,單位ms
             #dropTime:在3000ms內沒有收到對方的心跳信息表示已經不是集羣成員了
            <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                      address="192.168.130.10"
                      port="4000"
                      autoBind="100"
                      selectorTimeout="5000"
                      maxThreads="6"/>
             #NioReceiver:異步IO
             #address:監聽地址,須要修改成集羣成員通訊的網卡
             #port:端口,若是不指定則自動選擇4000-4100內從4000開始選擇一個沒有被佔用的端口
             #autoBind:自動綁定
             #selectorTimeout:挑選器的超時時長
             #maxThreads:最大線程數,集羣成員節點數 - 1
            <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
              <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
            </Sender>
            <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
            <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
          </Channel>
#Channel:定義多播集羣通訊信道
#Membership:定義成員關係
#Receiver:接受器
#Sender:將本身的會話資源變更同步給其餘節點
          <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
                 filter=""/>
          <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>

          <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
                    tempDir="/tmp/war-temp/"
                    deployDir="/tmp/war-deploy/"
                    watchDir="/tmp/war-listen/"
                    watchEnabled="false"/>
          <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
          <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
        </Cluster>
    <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>
# mkdir /data/webapp/ROOT/WEB-INF
# cp /etc/tomcat/web.xml /data/webapp/ROOT/WEB-INF/
# vim /data/webapp/ROOT/WEB-INF/web.xml
    <distributable/>  #添加到web-app內
# systemctl restart tomcat

tomcat-B:

# vim /data/webapp/ROOT/index.jsp  #建測試頁面
<%@ page language="java" %>
<html>
    <head><title>TomcatB</title></head>
    <body>
        <h1><font color="red">TomcatA.magedu.com</font></h1>
        <table align="centre" border="1">
            <tr>
                <td>Session ID</td>
            <% session.setAttribute("magedu.com","magedu.com"); %>
                <td><%= session.getId() %></td>
            </tr>
            <tr>
                <td>Created on</td>
                <td><%= session.getCreationTime() %></td>
            </tr>
        </table>
    </body>
</html>
# vim /etc/tomcat/server.xml
      <Host name="node2.dongfei.tech" appBase="/data/webapp" unpackWARs="true" autoDeploy="true">
        <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
                 channelSendOptions="8">
          <Manager className="org.apache.catalina.ha.session.DeltaManager"
                   expireSessionsOnShutdown="false"
                   notifyListenersOnReplication="true"/>
          <Channel className="org.apache.catalina.tribes.group.GroupChannel">
            <Membership className="org.apache.catalina.tribes.membership.McastService"
                        address="228.0.0.4"
                        port="45564"
                        frequency="500"
                        dropTime="3000"/>
            <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                      address="192.168.0.11"
                      port="4000"
                      autoBind="100"
                      selectorTimeout="5000"
                      maxThreads="6"/>
            <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
              <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
            </Sender>
            <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
            <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
          </Channel>
          <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
                 filter=""/>
          <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
          <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
                    tempDir="/tmp/war-temp/"
                    deployDir="/tmp/war-deploy/"
                    watchDir="/tmp/war-listen/"
                    watchEnabled="false"/>
          <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
          <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
        </Cluster>
    <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>
# mkdir /data/webapp/ROOT/WEB-INF
# cp /etc/tomcat/web.xml /data/webapp/ROOT/WEB-INF
# vim /data/webapp/ROOT/WEB-INF/web.xml
    <distributable/>  #添加到web-app內
# systemctl restart tomcat

訪問:

http://192.168.130.8

使用mencached保存Tomcat會話信息

memcached:

  Memcached 是一個高性能的分佈式內存對象緩存系統,用於動態Web應用以減輕數據庫負載。它經過在內存中緩存數據和對象來減小讀取數據庫的次數,從而提升動態、數據庫驅動網站的速度。Memcached基於一個存儲鍵/值對的hashmap。其守護進程(daemon )是用C寫的,可是客戶端能夠用任何語言來編寫,並經過memcached協議與守護進程通訊。這裏主要是作爲tomcat的session存儲設備。

  session server:redis(store), memcached(cache);利用會話服務器保存會話信息

mencached配置:

# yum install memcached -y
# systemctl start memcached
# ss -tnl |grep 11211
LISTEN     0      128          *:11211                    *:*
LISTEN     0      128         :::11211                   :::*

msm配置:在tomcat服務器中配置

項目地址:

https://github.com/magro/memcached-session-manager
# mkdir msm
# cd msm
# wget http://repo1.maven.org/maven2/de/javakaffee/msm/memcached-session-manager/2.3.0/memcached-session-manager-2.3.0.jar
# wget http://repo1.maven.org/maven2/de/javakaffee/msm/memcached-session-manager-tc7/2.3.0/memcached-session-manager-tc7-2.3.0.jar
# wget http://repo1.maven.org/maven2/net/spy/spymemcached/2.12.3/spymemcached-2.12.3.jar
# mkdir kryo
# cd kryo/
# wget http://repo1.maven.org/maven2/de/javakaffee/msm/msm-kryo-serializer/2.3.0/msm-kryo-serializer-2.3.0.jar
# wget http://repo1.maven.org/maven2/de/javakaffee/kryo-serializers/0.42/kryo-serializers-0.42.jar
# wget http://repo1.maven.org/maven2/com/esotericsoftware/kryo/4.0.2/kryo-4.0.2.jar
# wget http://repo1.maven.org/maven2/com/esotericsoftware/minlog/1.3.0/minlog-1.3.0.jar
# wget http://repo1.maven.org/maven2/com/esotericsoftware/reflectasm/1.11.7/reflectasm-1.11.7.jar
# wget http://repo1.maven.org/maven2/org/ow2/asm/asm/6.2/asm-6.2.jar
# wget http://repo1.maven.org/maven2/org/objenesis/objenesis/2.6/objenesis-2.6.jar
# tree msm/
msm/
├── kryo
│   ├── asm-6.2.jar
│   ├── kryo-4.0.2.jar
│   ├── kryo-serializers-0.42.jar
│   ├── minlog-1.3.0.jar
│   ├── msm-kryo-serializer-2.3.0.jar
│   ├── objenesis-2.6.jar
│   └── reflectasm-1.11.7.jar
├── memcached-session-manager-2.3.0.jar
├── memcached-session-manager-tc7-2.3.0.jar
└── spymemcached-2.12.3.jar
[root@tomcat-node-1 ~]# cp msm/*.jar /usr/share/java/tomcat/
[root@tomcat-node-1 ~]# scp msm/*.jar 192.168.130.11:/usr/share/java/tomcat/
[root@tomcat-node-1 ~]# scp msm/kryo/*.jar 192.168.130.11:/usr/share/java/tomcat/

tomcat-1配置:

# vim /etc/tomcat/server.xml
<Host name="node1.dongfei.tech" appBase="/data/webapp" unpackWARs="true" autoDeploy="true">
  <Context path="/" docBase="ROOT" reloadable="">
    <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
      memcachedNodes="n1:192.168.130.10:11211,n2:192.168.130.11:11211"
      failoverNodes="n2"
      requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
      transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
      />
  </Context>
  <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
         prefix="node1-dongfei-tech_access." suffix=".log"
         pattern="%h %l %u %t &quot;%r&quot; %s %b" />
</Host>
[root@tomcat-node-1 ~]# cat /data/webapp/ROOT/index.jsp
<%@ page language="java" %>
<html>
    <head><title>TomcatA</title></head>
    <body>
        <h1><font color="red">TomcatA.magedu.com</font></h1>
        <table align="centre" border="1">
            <tr>
                <td>Session ID</td>
            <% session.setAttribute("magedu.com","magedu.com"); %>
                <td><%= session.getId() %></td>
            </tr>
            <tr>
                <td>Created on</td>
                <td><%= session.getCreationTime() %></td>
            </tr>
        </table>
    </body>
</html>

tomcat-2配置:

# vim /etc/tomcat/server.xml
<Host name="node2.dongfei.tech" appBase="/data/webapp" unpackWARs="true" autoDeploy="true">
  <Context path="/" docBase="ROOT" reloadable="">
    <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
      memcachedNodes="n1:192.168.130.10:11211,n2:192.168.130.11:11211"
      failoverNodes="n2"
      requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
      transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
      />
  </Context>
  <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
         prefix="node2-dongfei-tech_access." suffix=".log"
         pattern="%h %l %u %t &quot;%r&quot; %s %b" />
</Host>
# vim  /data/webapp/ROOT/index.jsp
<%@ page language="java" %>
<html>
    <head><title>TomcatB</title></head>
    <body>
        <h1><font color="red">TomcatA.magedu.com</font></h1>
        <table align="centre" border="1">
            <tr>
                <td>Session ID</td>
            <% session.setAttribute("magedu.com","magedu.com"); %>
                <td><%= session.getId() %></td>
            </tr>
            <tr>
                <td>Created on</td>
                <td><%= session.getCreationTime() %></td>
            </tr>
        </table>
    </body>
</html>

訪問:
http://192.168.130.8

Tomcat的經常使用優化配置

/etc/sysconfig/tomcat, /etc/tomcat/tomcat.conf

內存空間:

JAVA_OPTS="-server -Xms32g -Xmx32g -XX:NewSize= -XX:MaxNewSize= "
    -server:服務器模式
    -Xms:堆內存初始化大小;
    -Xmx:堆內存空間上限;
    -XX:NewSize=:新生代空間初始化大小;                    
    -XX:MaxNewSize=:新生代空間最大值;


線程池設置:

<Connector port="8080" protocol="HTTP/1.1"  connectionTimeout="20000" redirectPort="8443" />
    maxThreads:最大線程數;
    minSpareThreads:最小空閒線程數;
    maxSpareThreads:最大空閒線程數;
    acceptCount:等待隊列的最大長度;
    URIEncoding:URI地址編碼格式,建議使用UTF-8;
    enableLookups:是否啓用dns解析,建議禁用; 
    compression:是否啓用傳輸壓縮機制,建議「on";
    compressionMinSize:啓用壓縮傳輸的數據流最小值,單位是字節;
    compressableMimeType:定義啓用壓縮功能的MIME類型;
        text/html, text/xml, text/css, text/javascript

禁用8005端口;

<Server port="-1" shutdown="SHUTDOWN">

隱藏版本信息:

<Connector port="8080" protocol="HTTP/1.1"  connectionTimeout="20000" redirectPort="8443" />
    Server="SOME STRING"