項目實戰8—tomcat企業級Web應用服務器配置與會話保持


tomcat企業級Web應用服務器配置與實戰

  環境背景:公司業務經過長期發展,有了很大突破,已經實現盈利,現公司要求加強技術架構應用功能和安全性以及開始向企業應用、移動APP等領域延伸,此時原來開發web服務的php語言已經不適應新的場景,需要上java技術架構,現要求你根據公司需要,實現基於java平台的web應用服務選型、搭建、實現和應用,此時你如何選擇?

  項目實戰系列,總架構圖 http://www.cnblogs.com/along21/p/8000812.html

  本篇實戰所需的包,都存放在我的網盤中 http://pan.baidu.com/s/1c2B7BO0,需要的私聊我。

實戰一:在linux上,安裝tomcat

1、下載安裝java所需要的環境和開發工具包

(1)Java 所需要的環境和開發工具包介紹

JRE: Java Runtime Environment

JDK:Java Development Kit JRE

JRE顧名思義是java運行時環境,包含了java虛擬機,java基礎類庫。是使用java語言編寫的程序運行所需要的軟件環境,是提供給想運行java程序的用戶使用的。

JDK顧名思義是java開發工具包,是程序員使用java語言編寫java程序所需的開發工具包,是提供給程序員使用的。JDK包含了JRE,同時還包含了編譯java源碼的編譯器javac,還包含了很多java程序調試和分析的工具:jconsole,jvisualvm等工具軟件,還包含了java程序編寫所需的文檔和demo例子程序。如果你需要運行java程序,只需安裝JRE就可以了。如果你需要編寫java程序,需要安裝JDK。JRE根據不同操作系統(如:windows,linux等)和不同JRE提供商(IBM,ORACLE等)有很多版本,最常用的是Oracle公司收購SUN公司的JRE版本。

 

(2)安裝相應版本的rpm包 jdk-VERSION-OS-ARCH.rpm

yum -y localinstall jdk-8u144-linux-x64.rpm

centos7系統自帶:jdk-1.8.0_25-linux-x64.rpm

java -version 顯示java程序的版本信息

 

(3)安裝完成后,要配置JAVA_HOME環境變量

vim /etc/profile.d/java.sh

export JAVA_HOME=/usr/java/jdk1.8.0_144
export JRE_HOME=$JAVA_HOME/jre
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH

2、下載安裝tomcat

方法一:二進制安裝(推薦)

(1)從官網下載tomcat二進制安裝包 http://tomcat.apache.org/

https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/v8.5.23/bin/

 

(2)解包,設置目錄

① 解包

tar xvf apache-tomcat-8.5.11.tar.gz -C /usr/local/

② 為了方便管理,設置軟連接,若以后換版本了,可以很容易切換

ln -s /usr/local/apache-tomcat-7.0.78/ /usr/local/tomcat

 

(3)設置環境配置管理腳本

vim /etc/profile.d/tomcat.sh

export CATALINA_BASE=/usr/local/tomcat
export PATH=$CATALINA_BASE/bin:$PATH
source /etc/profile.d/tomcat.sh   執行加載環境配置

 

方法二:yum安裝

(1)安裝

yum install tomcat -y #安裝tomcat主程序
yum install -y tomcat-admin-webapps tomcat-docs-webapp tomcat-webapps  #安裝tomcat對應的頁面
mkdir /var/lib/tomcat/webapps/{ROOT,test}/{WEB-INF,META-INF,classes,lib} -pv  #創建頁面所需要的工作目錄

(2)rpm包安裝的程序環境:

配置文件目錄:/etc/tomcat

主配置文件:server.xml

webapps存放位置:/var/lib/tomcat/webapps/

examples

manager

host-manager

docs

Unit File:tomcat.service

環境配置文件:/etc/sysconfig/tomcat #調整jdk內存使用大小等初始值

 

3、啟動tomcat

(1)catalina.sh start

 

(2)測試本地8080端口是否正常監聽

curl -I 127.0.0.1:8080

通過瀏覽器訪問測試(需指定8080端口)

 

實戰二:基於tomcat布署一個開源java產品

1、去網上下載開源Java 代碼

可以去開源中國下載自己需要的https://www.oschina.net/

我已經下好一個,需要的私密我http://pan.baidu.com/s/1c2B7BO0

 

2、解包、布署和查看使用說明

① unzip zchuanzhao-jeesns-master.zip

② mv /jeesns/war/jeesns.war .../webapps 把jeesns.war移到你的tomcat的webapps 下

如果你是自動布署,會自動在/webapps 下生成jeesns目錄;若不是,可以自己unzip 解包,布署

autoDeploy="true" 是自動布署

③ cat README.md 有詳細的操作過程

 

3、同步數據到數據庫

(1)在數據庫創建一個存放的庫

MariaDB [(none)]> create database along;

(2)把數據同步到數據庫

cd /jeesns/jeesns-web/database/

mysql -uroot -p -D along < jeesns.sql

 

4、修改數據庫連接

vim /webapps/jeesns/WEB-INF/classes/jeesns.properties

修改數據庫和登錄用戶和密碼

 

5、訪問頁面,布署成功

① 登錄首頁 http://192.168.30.107:8080/jeesns

 

② 進入后台管理 http://192.168.30.107:8080/jeesns/manage/login

用戶名:admin

密碼:jeesns

③ 登錄后台成功!

這個設計的還是挺高級的!!! 大家可以嘗試一番

 

實戰三:實現LNMT,nginx代理tomcat

分析:就是由nginx 代理tomcat 來實現的

1、直接在nginx 上設置跳轉

vim /etc/nginx/nginx.conf

location / {
        proxy_pass http://192.168.30.107:8080;
}
location ~* \.(jsp|do)$ {
        proxy_pass http://192.168.30.107:8080;
}

2、訪問測試,http://192.168.30.107/

訪問80端口,能代理到8080端口

 

3、實現集群代理服務

(1)先在http 段定義

vim /etc/nginx/nginx.conf

upstream tomcat_srv {
server 192.168.30.107:8080 weight=1;
server 192.168.30.7:8080 weight=2;
} 

(2)再在server 段定義location

location / {
        proxy_pass http://tomcat_srv;
}
location ~* \.(jsp|do)$ {
        proxy_pass http://tomcat_srv;
}

(3)創建測試頁面

① 在server1 上定義一個頁面

vim 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>

② 在server2 上定義一個頁面

vim webapps/test/index.jsp

<%@ page language="java" %>
<%@ page import="java.util.*" %>
<html>
<head>
<title>Test Page</title>
        </head>
        <body>
        <% out.println("hello world2");%>
        </body>
</html>

(4)頁面訪問測試

輪詢出現

實戰四:LNMT的會話保持原理及基於ip_hash實現

1、原理:有三種類型的方法,實現會話保持的方法

(1) session sticky(貼) 基於hash 和cookie 來實現會話保持,簡單的負載均衡算法

① 基於source_ip(源地址hash)

  nginx: ip_hash 、 haproxy: source 、 lvs: sh

② 基於cookie nginx基於cookie實現,需加載cookie模塊,cookie 力度更新

  nginx:sticky 、haproxy: cookie

 

(2) session cluster:delta session manager 基於tomcat集群會話保持

分析:tomcat自身帶的機制 session cluster,基於組播的方式,一個tomcat 被用戶登錄訪問,記錄session通過組播給集群中的其他機器復制一份;那么當用戶再次訪問時,每個機器都有session 會話記錄;從而實現了會話保持

 

(3) session server:redis(store), memcached(cache) 共享存儲

分析:新建立一個存放各個tomcat session記錄的server,每台tomcat服務器都將自己的session記錄在這個服務器中,用戶再次訪問,每台tomcat 都從這個server中獲取;實現會話保持

2、簡單實現基於ip hash 實現會話保持

vim /etc/nginx/nginx.conf 只需加一條ip_hash即可

upstream tomcat_srv {

upstream tomcat_srv {
ip_hash;
server 192.168.30.107:8080 weight=1;
server 192.168.30.7:8080 weight=2;
}

3、測試

訪問頁面,一直匹配到107的server 上,沒有輪詢;會話保持成功

 

實戰四:基於tomcat會話集群實現LNMT的會話保持

原理:Tomcat集群的會話管理器,它通過將改變了會話數據同步集群中的其它節點實現會話復制。這種實現會將所有會話的改變同步給集群中的每一個節點

1、環境准備

 

機器名稱

IP配置

服務角色

備注

nginx

192.168.30.107

代理服務器

開啟代理功能

tomcat-srv1

192.168.30.106

web服務

配置集群會話

tomcat-srv2

192.168.30.7

web服務

配置集群會話

2、配置nginx代理

vim /etc/nginx/nginx.conf

upstream tomcat_srv {    #在http 段配置
server 192.168.30.106:8080 weight=1;
server 192.168.30.7:8080 weight=2;
}

location / {    #在server 段配置
        proxy_pass http://tomcat_srv;
}
location ~* \.(jsp|do)$ {
        proxy_pass http://tomcat_srv;
}

systemctl start nginx 開啟服務

3、tomcat 集群會話的配置

注意:兩台tomcat-srv的配置是一模一樣的,除了測試的頁面設置不同

cd /usr/local/tomcat/ 進入自己的tomcat 的目錄下

vim conf/server.xml 在Engine 引擎段中,添加下面代碼,注意:注釋千萬別加去

<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8">    定義集群節點,“8”表示異步

<Manager className="org.apache.catalina.ha.session.DeltaManager"    定義Manger采用DeltaManager 會話管理器
expireSessionsOnShutdown="false"    一個節點關閉,不影響集群其他session
notifyListenersOnReplication="true"/>    復制、刪除操作通知session listener

<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="auto" 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"/>
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>

4、配置注釋

(1)Cluster配置:

Cluster(集群,族) 節點,如果你要配置tomcat集群,則需要使用此節點.

className 表示tomcat集群時,之間相互傳遞信息使用那個來實現信息之間的傳遞.

channelSendOptions可以設置為2、4、8、10,每個數字代表一種方式

  2 = Channel.SEND_OPTIONS_USE_ACK(確認發送)

  4 = Channel.SEND_OPTIONS_SYNCHRONIZED_ACK(同步發送)

  8 = Channel.SEND_OPTIONS_ASYNCHRONOUS(異步發送)

在異步模式下,可以通過加上確認發送(Acknowledge)來提高可靠性,此時channelSendOptions設為10,半同步

例:

<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8">

 

(2)Manager

(a)Manager介紹

Manger對象用於實現HTTP會話管理的功能,Tomcat中有4種Manger的實現:

① StandardManager

Tomcat6的默認會話管理器,用於非集群環境中對單個處於運行狀態的Tomcat實例會話進行管理。當Tomcat關閉時,這些會話相關的數據會被寫入磁盤上的一個名叫SESSION.ser的文件,並在Tomcat下次啟動時讀取此文件。

② PersistentManager

當一個會話長時間處於空閑狀態時會被寫入到swap會話對象,這對於內存資源比較吃緊的應用環境來說比較有用。

DeltaManager

用於Tomcat集群的會話管理器,它通過將改變了會話數據同步集群中的其它節點實現會話復制。這種實現會將所有會話的改變同步給集群中的每一個節點,也是在集群環境中用得最多的一種實現方式。

④ BackupManager

用於Tomcat集群的會話管理器,與DeltaManager不同的是,某節點會話的改變只會同步給集群中的另一個而非所有節點

(b)Manager配置

className-指定實現org.apache.catalina.ha.ClusterManager接口的類,信息之間的管理
expireSessionsOnShutdown-設置為true時,一個節點關閉,將導致集群下的所有Session失效
notifyListenersOnReplication-集群下節點間的Session復制、刪除操作,是否通知session listeners

 

(3)Channel 頻道的介紹和配置

(a)介紹

Channel是Tomcat節點之間進行通訊的工具。Channel包括4個組件:

  Membership:集群的可用節點列表

  Receiver :接收器,負責接收消息

  Sender :發送器,負責發送消息

  Interceptor :Cluster的攔截器

 

(b)Membership 配置

① Membership:維護集群的可用節點列表,它可以檢查到新增的節點,也可以檢查到沒有心跳的節點

② className-指定Membership使用的類

③ address-組播地址

④ port-組播端口

⑤ frequency-發送心跳(向組播地址發送UDP數據包)的時間間隔(單位:ms)。默認值為500

⑥ dropTime-Membership在dropTime(單位:ms)內未收到某一節點的心跳,則將該節點從可用節點列表刪除。默認值為3000

 

注:組播(Multicast):一個發送者和多個接收者之間實現一對多的網絡連接。

一個發送者同時給多個接收者傳輸相同的數據,只需復制一份相同的數據包。

它提高了數據傳送效率,減少了骨干網絡出現擁塞的可能性

相同組播地址、端口的Tomcat節點,可以組成集群下的子集群

例:

<Membership className="org.apache.catalina.tribes.membership.McastService"
address="228.0.0.4"
port="45564"
frequency="500"
dropTime="3000"/>

 

(c)Receiver 配置

Receiver : 接收器,負責接收消息

接收器分為兩種BioReceiver(阻塞式)、NioReceiver(非阻塞式)

  className-指定Receiver使用的類

  address-接收消息的地址

  port-接收消息的端口

  autoBind-端口的變化區間

  如果port為4000,autoBind為100,接收器將在4000-4099間取一個端口,進行監聽

  selectorTimeout-NioReceiver內輪詢的超時時間

  maxThreads-線程池的最大線程數

例:

<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="auto"
port="4000"
autoBind="100"
selectorTimeout="5000"
maxThreads="6"/>

 

(d)Sender 配置

Sender : 發送器,負責發送消息

Sender內嵌了Transport組件,Transport真正負責發送消息

Transport:定義傳輸方式

Transport分為兩種:bio.PooledMultiSender(阻塞式)、nio.PooledParallelSender(非阻塞式)

例:

<Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
<Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
</Sender>

 

(e)Interceptor 配置

Interceptor : Cluster的攔截器

TcpFailureDetector-網絡、系統比較繁忙時,Membership可能無法及時更新可用節點列表,此時TcpFailureDetector可以攔截到某個節點關閉的信息,並嘗試通過TCP連接到此節點,以確保此節點真正關閉,從而更新集群可以用節點列表

MessageDispatch15Interceptor-查看Cluster組件發送消息的方式是否設置為Channel.SEND_OPTIONS_ASYNCHRONOUS(Cluster標簽下的channelSendOptions為8時)。 設置為Channel.SEND_OPTIONS_ASYNCHRONOUS時,MessageDispatch15Interceptor先將等待發送的消息進行排隊,然后將排好隊的消息轉給Sender

例:

<Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>

 

(4)ClusterListener 配置

ClusterListener : 監聽器,監聽Cluster組件接收的消息

使用DeltaManager時,Cluster接收的信息通過ClusterSessionListener傳遞給DeltaManager

例:

<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>

 

5、創建測試頁面

mkdir webapps/test

cd webapps/test

① 設置一個web.xml 的配置文件

mkdir WEB-INF

cp /usr/local/tomcat/conf/web.xml WEB-INF/

vim WEB-INF/web.xml 在</web-app>上加一行

<distributable/> 表示分布式

② vim session.jsp 創建測試頁面,在tomcat-srv1上是TomcatA;在tomcat-srv1上是TomcatB

<%@ page language="java" %>
<html>
<head><title>TomcatA</title></head>    //TomcatA的標題
<body>
<h1><font color="blue">TomcatA </h1>  
<table align="centre" border="1">
<tr>
<td>Session ID</td>    
<% session.setAttribute("abc","abc"); %>
<td><%= session.getId() %></td>
</tr>
<tr>
<td>Created on</td>
<td><%= session.getCreationTime() %></td>
</tr>
</table>
</body>
</html>

 

6、測試

頁面訪問http://192.168.30.107/test/session.jsp;輪詢,但是session ID是一樣的,會話保持成功

已經會話保持

 

實戰五:基於共享存儲實現LNMT的會話保持

原理:新建立一個存放各個tomcat session記錄的server,每台tomcat服務器都將自己的session記錄在這個服務器中,用戶再次訪問,每台tomcat 都從這個server中獲取;實現會話保持

1、環境准備

機器名稱

IP配置

服務角色

備注

nginx

192.168.30.107

代理服務器

開啟代理功能

tomcat-srv1

192.168.30.106

web服務

指向共享存儲

tomcat-srv2

192.168.30.7

web服務

指向共享存儲

memcached

192.168.30.6

共享存儲

 

 

2、下載提供,實驗所依賴的.jar包

memcached-session-manager項目地址,http://code.google.com/p/memcached-session-manager/, https://github.com/magro/memcached-session-manager

① 下載如下jar文件至各tomcat節點的tomcat安裝目錄下的lib目錄中,尋找自己需要的版本號,tc的版本號要與tomcat版本相同。

  memcached-session-manager-1.8.3.jar

  memcached-session-manager-tc7-1.8.3.jar

  spymemcached-2.11.1.jar

  msm-javolution-serializer-1.8.3.jar

  javolution-5.4.3.1.jar

我已經下到了我的網盤,有需要的私聊 http://pan.baidu.com/s/1nvGFgKD

② 把這些包,上傳到 lib 目錄下

/usr/local/tomcat/lib

 

3、配置nginx代理

vim /etc/nginx/nginx.conf

upstream tomcat_srv {    #在http 段配置
server 192.168.30.106:8080 weight=1;
server 192.168.30.7:8080 weight=2;
}

location / {    #在server 段配置
        proxy_pass http://tomcat_srv;
}
location ~* \.(jsp|do)$ {
        proxy_pass http://tomcat_srv;

systemctl start nginx 開啟服務

4、在server.xml 中配置

vim /usr/local/tomcat/conf/server.xml

<Context path="/test" docBase="test" reloadable="true">
  <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
  memcachedNodes="192.168.30.106:11211"
  requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
  transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"/>
</Context>

5、和上實驗一樣,創建測試頁面並測試

頁面訪問http://192.168.30.107/test/session.jsp;輪詢,但是session ID是一樣的,會話保持成功

已經會話保持

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM