linux运维工程师必会

第十一章:Session会话共享

2019-10-17  本文已影响0人  chenkang

第一节:采用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"
上一篇 下一篇

猜你喜欢

热点阅读