概述
Session简介
Session是由应用服务器维持的一个服务器端的存储空间(内存中),用户在连接服务器时,会由服务器生成一个唯一的SessionID,客户端使用该Session ID 为标识符来存取服务器端的Session存储空间。而Session ID则保存到客户端,使用浏览器Cookie保存的,用户提交页面请求时,也会将 Session ID提交到服务器端,来存取Session空间的数据。服务器也通过URL重写的方式来传递Session ID的值,因此不是完全依赖Cookie。如果客户端Cookie禁用,则服务器可以自动通过重写URL的方式来保存Session的值,WEB应用中将这些多次请求修改使用的上下文对象称作会话(Session)
为什么需要session共享
当我们的网站用户越来越多,为满足并发访问,就会对网站服务器进行集群(负载均衡、分布式),那么问题随之而来,网站用户的登录权限都是存放在当时所访问的服务器上,其他服务器没有保存或保存的数据不一样。 当一个用户第一次 访问的是A应用服,而第二次访问分发到了B应用服,那么B应用服的session数据与A应用服没有同步。所以需要进行session同步处理。
解决负载均衡的时候session文件不能共享的方式
1.服务器文件同步(不建议使用,这样会造成文件重复,资源浪费)
2.session存数据库(不建议用,会加大数据库压力)
3.使用cookie(不建议用,cookie不太安全)
4.ip_hash(如果是局域网的话会造成这个局域的所有用户ip_hash值都一样)
5.存缓存(memcache 、redis) (建议使用这个)
session共享需要解决两个问题
多台服务器用同一个session_id
这个比较容易解决,只要在php中设置存session_id的cookie域名为网站主域就可以打开PHP.ini, 设置session.cookie_domain = .feiniu.com,当然也可以在php代码当中设置ini_set("session.cookie_domain","feiniu.com");
多台服务器用同一个session_id访问到相同的session内容
要实现这点,就必须把session内容存储到让所有服务器都能访问到的地方,php的session内容是默认存储到本服务器的文件中的,一般的解决方案是存入数据库,memcache或者redis这种缓存服务器,当然用默认的文件存储方式也可以,用NFS统一存储
Session复制
这种方案实现简单,从本机读取Session信息也很快速,但只能应用在集群规模比较小的环境下。当集群规模较大时,集群服务器间需要大量的通信进行Session复制,占用服务器和网络的大量资源,系统不堪负担。而且由于所有用户的Session信息在每台服务器上都有备份,在大量用户访问的情况下,甚至会出现服务器内存不够Session使用的情况。
配置tomcat实现session共享
源码包安装tomcat实验流程(yum安装未能成功)
准备
修改三台主机名
10:nginx
hostnamectl set-hostname nginx;bash
11:node1
hostnamectl set-hostname node1;bash
12:node2
hostnamectl set-hostname node2;bash
三台主机修改hosts配置文件
vim /etc/hosts
192.168.1.10 nginx
192.168.1.11 node1
192.168.1.12 node2
安装tomcat
安装jdk
解包移动
解压包
unzip tomcat.zip
cd tomcat
解压jdk包
tar xf jdk-7u25-linux-x64.tar.gz
复制目录
cp -r jdk1.7.0_25/ /usr/local/jdk1.7
配置JDK的环境变量
vim /etc/profile
export JAVA_HOME=/usr/local/jdk1.7
export JAVA_BIN=/usr/local/jdk1.7/bin
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
source /etc/profile
检测java是否安装成功
java -version
解包移动
tar xf apache-tomcat-7.0.42.tar.gz
cp -r apache-tomcat-7.0.42 /usr/local/tomcat
配置Tomcat 的环境变量
echo "export TOMCAT_HOME=/usr/local/tomcat" >> /etc/profile
echo "export PATH=$PATH:$TOMCAT_HOME/bin" >> /etc/profile
source /etc/profile
开启tomcat
/usr/local/tomcat/bin/catalina.sh start
修改Tomcat配置文件
vim /usr/local/tomcat/conf/server.xml
jvmRoute 12端改为"node2"
vim /usr/local/tomcat/webapps/ROOT/WEB-INF/web.xml
建立session.jsp的测试页面
vim /usr/local/tomcat/webapps/ROOT/session.jsp
11
Session ID:<%= session.getId() %><BR>
SessionPort:<%= request.getServerPort() %>
<% out.println("This tomcat server 192.168.1.11");%>
12
Session ID:<%= session.getId() %><BR>
SessionPort:<%= request.getServerPort() %>
<% out.println("This tomcat server 192.168.1.12");%>
重新启动Tomcat
/usr/local/tomcat/bin/shutdown.sh && /usr/local/tomcat/bin/startup.sh
netstat -anpt | grep -E ":(8080|4000)"
输入网址http://192.168.1.11:8080/session.jsp
输入网址http://192.168.1.12:8080/session.jsp
输入192.168.1.10/session.jsp
Session ID 不会变化,但是node和IP会变化,则表示成功
redis实现缓存共享
redis与memcached的区别
内存利用率:
就key-value而言,memcached内存利用率更高,而如果redis使用hash结构存储key-value,内存利用率比,memcached更高
性能对比:
redis早期版本使用单核,而memcached可以使用多核,所以平均一个核上redis在存储小数据时比memcached性能更高,而在100k以上的数据中,memcached性能要高于redis
持久化:
redis支持数据持久化,可以将内存中的数据保持在磁盘中,重启时可以再次加载进行使用,memcached不可以
备份:
redis支持数据备份,即master-slave模式的备份数据
数据类型:
redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储
服务器准备
nginx:192.168.1.10
tomcat1:192.168.1.11
tomcat2:192.168.1.12
redis:192.168.1.13
配置nginx负载均衡
包:nginx-1.6.0.tar.gz
下载库
yum -y install pcre-devel zlib-devel openssl-devel
下载gcc
yum install -y gcc-c++
添加用户
useradd -M -s /sbin/nologin nginx
解包
tar xf nginx-1.6.0.tar.gz -C /usr/src/
cd /usr/src/nginx-1.6.0/
配置编译安装
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx && make && make install
创建命令连接
ln /usr/local/nginx/sbin/* /usr/local/sbin/
修改配置文件
vim /usr/local/nginx/conf/nginx.conf
修改的部分为2处
httpd段
upstream tomcat {
server 192.168.1.11:8080 max_fails=3 fail_timeout=10;
server 192.168.1.12:8080 max_fails=3 fail_timeout=10;
}
server段
location ~ \.jsp$ {
proxy_pass http://tomcat; #配置nginx方向代理转发
}
nginx -t;nginx
安装tomcat
tomcat1
包: jdk-8u60-linux-x64.tar.gz apache-tomcat-8.5.16.tar.gz
ls
配置jdk环境
tar xf jdk-8u60-linux-x64.tar.gz
mv jdk1.8.0_60/ /usr/local/java8
vim /etc/profile.d/java.sh
JAVA_HOME=/usr/local/java8
CLASSPATH=$JAVA_HOME/lib
PATH=$PATH:$JAVA_HOME/bin
source /etc/profile
java -version
安装tomcat
tar xf apache-tomcat-8.5.16.tar.gz
mv apache-tomcat-8.5.16 /usr/local/tomcat
配置tomcat
cd /usr/local/tomcat/webapps/ROOT
vim index.jsp
<%@page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>tomcat-1</title>
</head>
<body>
<h1><font color="red">Session serviced by tomcat-1</font></h1>
<table aligh="center" border="1">
<tr>
<td>Session ID</td>
<td><%=session.getId() %></td>
<% session.setAttribute("abc","abc");%>
</tr>
<tr>
<td>Created on</td>
<td><%= session.getCreationTime() %></td>
</tr>
</table>
</body>
<html>
开启tomcat
/usr/local/tomcat/bin/startup.sh
浏览器输入192.168.1.11:8080
想要配置session共享,需要继续配置
准备包:commons-pool2-2.3.jar jedis-2.7.2.jar tomcat-redis-session-manager-8.5-master-2.0.0-8.5.5.jar
mv *.jar /usr/local/tomcat/lib/
vim /usr/local/tomcat/conf/context.xml
<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />
<Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
host="192.168.1.13"
port="6379"
database="0"
maxInactiveInterval="60"
/>
host="192.168.1.60" #redis数据库的ip地址
port="6379" #redis 端口号
database="0" #放在redis的第几个数据库中
cd /usr/local/tomcat/bin/
./shutdown.sh && ./startup.sh
tomcat2
类似于tomcat1,区别在于:
vim /usr/local/tomcat/webapps/ROOT/index.jsp
浏览器输入192.168.1.11:8080
测试轮询
session ID不同,因为还没有配置redis
部署redis
包: redis-3.2.12.tar.gz
redis-3.2.12.tar.gz
mkdir /data;cd /data
加入包 redis-3.2.12.tar.gz
tar xzf redis-3.2.12.tar.gz
mv redis-3.2.12 redis
yum -y install gcc automake autoconf libtool make
cd redis
make
vim /etc/profile
加入
export PATH=/data/redis/src:$PATH
source /etc/profile
mkdir /data/6379
vim /data/6379/redis.conf
daemonize yes
port 6379
logfile "/data/6379/redis.log"
dir "/data/6379"
dbfilename "dump.rdb"
#requirepass "123"
bind 192.168.1.13 127.0.0.1
# Generated by CONFIG REWRITE
maxmemory 125000kb
save 900 1
save 300 10
save 60 10000
appendonly yes
appendfsync always
开启
redis-server /data/6379/redis.conf
redis-cli -h 192.168.1.13
keys *
此时查看key是空的
测试
访问测试 192.168.1.10/index.jsp
我们登录redis并且查看key发现redis已经有了key值,解决了session会话不一致的问题,自己测试发现key的过期时间是1800s6分钟,如果6分钟没有做任何操作key值就过期了,再次访问的时候session的key值就变了
add(可忽略):yum安装redis
使用下载安装包
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum makecache
yum -y install redis
redis-server --version
发布者:LJH,转发请注明出处:https://www.ljh.cool/6739.html