基础知识

tomcat是Apache软件基金会的Jakarta项目中的核心项目,最新的Servlet和JSP规范能够在Tomcat中很好的表现。作为一个免费的开放源代码的Web应用服务器,属于轻量级的应用服务器,在中小型系统和并发量不是很大的场景下被广泛使用,是开发和调试JSP代码的首选。实际上而言,tomcat是Apache服务器的拓展,但是可以独立运行,tomcat可以独立的去处理html和jsp页面

session

 在计算机中,尤其是在网络应用中,称为“会话控制”。Session 对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。当会话过期或被放弃后,服务器将终止该会话。

  在现今的互联网架构中会话保持越来越重要,但是会话的保持却在一定程度上依赖于提供服务的服务器上,随着并发量的不断提升,服务器最终会由于负载过高而宕机,因此引入了负载均衡机制,但是负载均衡的调度会使得同一用户的请求被调度到不同的主机之上,会严重的影响到session的保存

保存客户端会话的三种常用方式:

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会话保持(一)

环境配置:

清空防火墙规则

iptables -F
iptables -X

临时设置关闭selinux

setenforce 0

安装jdk,centos7的源默认最高支持jdk1.8

yum -y install java-1.8.0-openjdk-devel 

实验部署步骤:

配置Nginx

安装nginx,nginx在epel源,因此未安装epel源的话要先安装epel源

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

修改nginx配置文件

[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/;
        }
}

检查语法并启动nginx

[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会话保持(一)