Tomcat實現session會話保持(一)

基礎知識

tomcat是Apache軟件基金會的Jakarta項目中的核心項目,最新的Servlet和JSP規範可以在Tomcat中很好的表現。做爲一個免費的開放源代碼的Web應用服務器,屬於輕量級的應用服務器,在中小型系統和併發量不是很大的場景下被普遍使用,是開發和調試JSP代碼的首選。實際上而言,tomcat是Apache服務器的拓展,可是能夠獨立運行,tomcat能夠獨立的去處理html和jsp頁面html

session

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

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

保存客戶端會話的三種經常使用方式:

1,配合調度器端實現會話保持,如Nginx的ip_hash算法

Tomcat實現session會話保持(一)

2,在後端的web服務器上經過組播的方式實現session共享,缺點是會形成很大的網絡IO,當後端的服務器併發量很大時,網卡會成爲系統的瓶頸

Tomcat實現session會話保持(一)

3,在web服務器的後端增長專用的session服務器,用來存儲客戶的session信息,這樣就避免由於每一個web服務器都要同步session信息,而致使後端web服務器的網絡IO壓力過大。但此種方法須要對session服務器作高可用,不然一旦session服務器宕機,則全部客戶端的session信息將丟失

Tomcat實現session會話保持(一)

實驗模擬:在調度器端實現會話保持

實驗設備

操做系統:CentOS7.6
nginx     IP:192.168.8.134  
tomcat1 IP:192.168.8.160
tomcat2 IP:192.168.8.161

實驗架構圖

Tomcat實現session會話保持(一)

環境配置:

清空防火牆規則linux

iptables -F
iptables -X

臨時設置關閉selinuxnginx

setenforce 0

安裝jdk,centos7的源默認最高支持jdk1.8web

yum -y install java-1.8.0-openjdk-devel

實驗部署步驟:

配置Nginx

安裝nginx,nginx在epel源,所以未安裝epel源的話要先安裝epel源算法

[root@nginx ~]#yum -y instll nginx

修改nginx配置文件apache

[root@nginx ~]#vim /etc/nginx/nginx.conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    include /etc/nginx/conf.d/*.conf;
}
upstream web {
        #使用ip_hash算法保持
        hash $remote_addr consistent;
        server 192.168.8.160:8080;
        server 192.168.8.161:8080;
}
server {
        listen 80 default_server;
        index index.jsp;
        location / {
                proxy_pass http://web/;
        }
}

檢查語法並啓動nginxvim

[root@nginx ~]#nginx -t
[root@nginx ~]#systemctl start nginx

配置tomcat1

安裝tomcat以及對應的其餘管理工具後端

[root@tomcat1 ~]#yum -y install tomcat tomcat-lib tomcat-admin-webapps tomcat-webapps tomcat-docs-webapp

建立相關目錄

[root@tomcat1 ~]#mkdir -pv /data/app/{WEB-INF,META-INF,classes,lib}

編輯主頁文件

[root@tomcat1 ~]#vim /data/app/index.jsp
<%@ page language="java" %>
        <html>
                <head><title>TomcatA</title></head>
                <body>
                        <h1><font color="red">TomcatA</font></h1>
            table align="centre" border="1">
                                <tr>
                                        <td>Session ID</td>
                                <% session.setAttribute("www.test.com","www.test.com"); %>
                                        <td><%= session.getId() %></td>
                                </tr>
                                <tr>
                    <td>Created on</td>
                    <td><%= session.getCreationTime() %></td>
                </tr>
            </table>
                </body>
        </html>

修改server.xml配置文件,在host中增長一個context作測試

[root@tomcat1 ~]#vim /etc/tomcat/server.xml 
<Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">

        <!-- SingleSignOn valve, share authentication between web applications
             Documentation at: /docs/config/valve.html -->
        <!--
        <Valve className="org.apache.catalina.authenticator.SingleSignOn" />
        -->

        <!-- Access log processes all example.
             Documentation at: /docs/config/valve.html
             Note: The pattern used is equivalent to using pattern="common" -->
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log." suffix=".txt"
               pattern="%h %l %u %t "%r" %s %b" />
        <Context path="/app" docBase="/data/app" reloadable=""/>
      </Host>

修改tomcat-users增長以下幾行配置

[root@tomcat1 ~]#vim /etc/tomcat/tomcat-users.xml
<role rolename="admin-gui"/>
<role rolename="admin-script"/>
<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<user username="tomcat" password="www.test.com" roles="manager-gui,manager-script,admin-gui,admin-script"/>

配置tomcat2

建立必要的目錄

[root@tomcat2 ~]#mkdir /data

把tomcat1主機配置文件傳輸給tomcat2

[root@tomcat1 ~]#scp /etc/tomcat/server.xml 192.168.8.161:/etc/tomcat/server.xml 
[root@tomcat1 ~]#scp /etc/tomcat/tomcat-users.xml 192.168.8.161:/etc/tomcat/tomcat-users.xml

編輯主頁文件

[root@tomcat2 ~]#vim /data/app1/index.jsp
<%@ page language="java" %>
        <html>
                <head><title>TomcatB</title></head>
                <body>
                        <h1><font color="red">TomcatB</font></h1>
            table align="centre" border="1">
                                <tr>
                                        <td>Session ID</td>
                                <% session.setAttribute("www.test.com","www.test.com"); %>
                                        <td><%= session.getId() %></td>
                                </tr>
                                <tr>
                    <td>Created on</td>
                    <td><%= session.getCreationTime() %></td>
                </tr>
            </table>
                </body>
        </html>

在tomcat2上一樣建立此目錄

[root@tomcat2 ~]#mkdir /data

把tomcat1配置文件拷貝到tomcat2

[root@tomcat1 ~]#scp -r /data/app/ 192.168.8.161:/data/
[root@tomcat1 ~]#scp /etc/tomcat/server.xml 192.168.8.161:/etc/tomcat/server.xml 
[root@tomcat1 ~]#scp /etc/tomcat/tomcat-users.xml 192.168.8.161:/etc/tomcat/tomcat-users.xml

啓動tomcat並訪問

[root@tomcat1 ~]#systemctl start tomcat
[root@tomcat1 ~]#systemctl enable tomcat
[root@tomcat2 ~]#systemctl start tomcat
[root@tomcat2 ~]#systemctl enable tomcat

訪問測試,來自客戶端的同一個IP始終發往一個後端服務器
Tomcat實現session會話保持(一)

相關文章
相關標籤/搜索