美文网首页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会话共享

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