美文网首页linux运维工程师必会
第十一章:Session会话共享

第十一章:Session会话共享

作者: chenkang | 来源:发表于2019-10-17 08:34 被阅读0次

第一节:采用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共享原理.png

第三节: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"

相关文章

  • 第十一章:Session会话共享

    第一节:采用Redis存储session会话的原因 我们采用的是分布式结构,分布式的好处是通过负载均衡(LB)分发...

  • Session会话共享

    第一节:采用Redis存储session会话的原因 我们采用的是分布式结构,分布式的好处是通过负载均衡(LB)分发...

  • Session会话共享

    第一节:采用Redis存储session会话的原因 我们采用的是分布式结构,分布式的好处是通过负载均衡(LB)分发...

  • web 10.Cookie&Session

    会话:多次请求回应 组成一次会话 为了共享数据Cookie 客户端会话技术Session 服务端会话技术 例如:购...

  • Redis的使用场景

    第一、会话缓存(Session Cache) 单机是不需要考虑 Session 共享的问题,但是如果分布式或者部署...

  • Tomcat+redis+Slb(session共享)

    最近项目要增加会话负载并且需要Session共享,本来阿里的Slb是具有会话保持,并且具有cookie植入功能可以...

  • tomcat的session共享会话

    一.常见的session共享方案 1.使用nginx的ip_hash 使用ip绑定ip_hash算法时,用户的请求...

  • PHP Session

    PHP session 变量用于存储关于用户会话(session)的信息,或者更改用户会话(session)的设置...

  • session、token与jwt

    session与cookie 什么是session session翻译过来是会话,但在WEB领域常常是指会话数据:...

  • ubuntu tmux 快捷键

    session 新建tmux会话tmux new -s [name of session] 在已有tmux会话基础...

网友评论

    本文标题:第十一章:Session会话共享

    本文链接:https://www.haomeiwen.com/subject/pmfumctx.html