第一节:采用Redis存储session会话的原因
我们采用的是分布式结构,分布式的好处是通过负载均衡(LB)分发请求,让多个服务器各自处理请求,来减少单一服务器的压力,并且提高执行效率。
在这个分布式结构下,如果不用共享session的话,就会出现问题。当一个客户端发送一个请求(无session id),通过负载均衡(LB)将第一次请求分发给web01,服务器判断无session id,就让那个客户进行登录操作,并得到响应,此时客户端会存储一个来自web01响应的session id,并存储在浏览器的cookie。
当客户端发送第二次请求的时候,此时本次请求已经携带了session id(跳过登录),负载均衡(LB)却将请求分发给web02,因为web02中没有存储session,所以无法与客户端session id进行对应。所以程序会出现异常或是报错,无法正常响应亦或然你重新登陆。
session与cookie之间的关系参考:https://blog.csdn.net/qq_28296925/article/details/80921585
第二节:session会话共享存储原理
1.用户在浏览器输入用户密码登录进系统。
2.由负载均很代理到后端web01。
3.web01将session存储在redis中,同时下发给用户一个session id存储到浏览器的cookie中。
4.用户进行其他操作。
5.负载均衡(LB)代理到web02上面。
6.web02去读取redis中的session并验证。
第三节:session会话共享实例
我们使用phpmyadmin软件进行测试session会话共享
1.下载phpmyadmin
wget https://files.phpmyadmin.net/phpMyAdmin/4.8.5/phpMyAdmin-4.8.5-all-languages.zip
unzip phpMyAdmin-4.8.5-all-languages.zip <-软件包要解压到nginx配置文件中指定目录
2.设置phpmyadmin的nginx配置文件
[root@web01 code]# cat /etc/nginx/conf.d/php.conf
server {
listen 80;
server_name php.oldboy.com;
root /code/phpmyadmin;
location / {
index index.php index.html;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
3.修改phpmyadmin代码文件中内容
[root@web01 phpmyadmin]# cp config.sample.inc.php config.inc.php
[root@web01 phpmyadmin]# vim config.inc.php
/* Server parameters */
$cfg['Servers'][$i]['host'] = '172.16.1.51'; <-redis主机IP
4.在web02上部署phpmyadmin(同上)
5.负载均衡配置如下
[root@lb01 conf.d]# cat proxy_php.oldboy.com.conf
upstream php_pools {
server 172.16.1.7:80;
server 172.16.1.8:80;
}
server {
listen 80;
server_name php.oldboy.com;
location / {
proxy_pass http://php_pools;
include proxy_params;
}
}
[root@lb01 conf.d]# systemctl restart nginx
6.解决session共享问题:使用Redis
服务器 | IP地址 |
---|---|
负载均衡(LB) | 172.16.1.5 |
WEB01 | 172.16.1.7 |
WEB02 | 172.16.1.8 |
REDIS | 172.16.1.51 |
MySQL | 172.16.1.51 |
7.在172.16.1.51服务器上安装redis,并启用redis
yum install redis -y
sed -i 's#^bind.*#bind 172.16.1.51 127.0.0.1#g' /etc/redis.conf <-主机IP+回环地址
systemctl start redis
systemctl enable redis
8.配置应用服务器,连接redis,将session的信息存储至redis数据库中(7 8) php->redis
vim /etc/php.ini
session.save_handler = redis
session.save_path = "tcp://172.16.1.51:6379"
vim /etc/php-fpm.d/www.conf
;php_value[session.save_handler] = files <--找到最后两行注释掉
;php_value[session.save_path] = /var/lib/php/session
systemctl restart php-fpm
[root@web01 code]# chown -R www.www /var/lib/php/
9.查看内存数据库信息
[root@db01 ~]# redis-cli
127.0.0.1:6379> keys *
1) "PHPREDIS_SESSION:c4d2e73662097f988f86c43243ccf623"