内容简介:tomcat是Apache软件基金会的Jakarta项目中的核心项目,最新的Servlet和JSP规范能够在Tomcat中很好的表现。作为一个免费的开放源代码的Web应用服务器,属于轻量级的应用服务器,在中小型系统和并发量不是很大的场景下被广泛使用,是开发和调试JSP代码的首选。实际上而言,tomcat是Apache服务器的拓展,但是可以独立运行,tomcat可以独立的去处理html和jsp页面在计算机中,尤其是在网络应用中,称为“会话控制”。Session 对象存储特定用户会话所需的属性及配置信息。这样,
基础知识
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算法
2,在后端的web服务器上通过组播的方式实现session共享,缺点是会造成很大的网络IO,当后端的服务器并发量很大时,网卡会成为系统的瓶颈
3,在web服务器的后端增加专用的session服务器,用来存储客户的session信息,这样就避免因为每个web服务器都要同步session信息,而导致后端web服务器的网络IO压力过大。但此种方法需要对session服务器做高可用,否则一旦session服务器宕机,则所有客户端的session信息将丢失
实验模拟:在调度器端实现会话保持
实验设备
操作系统:CentOS7.6
nginx IP:192.168.8.134
tomcat1 IP:192.168.8.160
tomcat2 IP:192.168.8.161
实验架构图
环境配置:
清空防火墙规则,关闭selinux,安装jdk
#清空防火墙规则 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 #检查无误后启动nginx [root@nginx ~]#systemctl start nginx
配置tomcat1
安装tomcat以及对应的其他管理工具 [root@tomcat1 ~]#yum -y install tomcat tomcat-lib tomcat-admin-webapps tomcat-webapps tomcat-docs-webapp
配置tomcat显示session会话信息
[root@tomcat1 ~]#mkdir -pv /data/app1/{WEB_INF,META_INF,classes,lib} [root@tomcat1 ~]#vim /data/app1/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.zd.com","www.zd.com"); %> <td><%= session.getId() %></td> </tr> <tr> <td>Created on</td> <td><%= session.getCreationTime() %></td> </tr> </table> </body> </html> #在tomcat2上同样创建此目录 [root@tomcat2 ~]#mkdir /data #把配置文件拷贝到tomcat2 [root@tomcat1 ~]#scp -r /data/app1/ 192.168.8.161:/data/ #更改测试页面 [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>
修改server.xml配置文件
[root@tomcat1 ~]#vim /etc/tomcat/server.xml #在host中增加一个context做测试 <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> #把配置文件传输给tomcat2 [root@tomcat1 ~]#scp /etc/tomcat/server.xml 192.168.8.161:/etc/tomcat/server.xml
修改tomcat-users.xml配置文件
[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@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集群之会话保持
- Tomcat集群之会话保持
- tomcat的session会话保持方案
- 最简配置!3 步完成Nginx+tomcat负载均衡的会话保持
- Nginx+Tomcat会话保持N种方案,各有千秋!你选择对了吗?
- java – Spring会话数据Redis – 从Redis Store获取有效会话,当前用户
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。