第十一章:Session會(huì)話共享

第一節(jié):采用Redis存儲(chǔ)session會(huì)話的原因

我們采用的是分布式結(jié)構(gòu),分布式的好處是通過負(fù)載均衡(LB)分發(fā)請(qǐng)求,讓多個(gè)服務(wù)器各自處理請(qǐng)求,來減少單一服務(wù)器的壓力,并且提高執(zhí)行效率。

在這個(gè)分布式結(jié)構(gòu)下,如果不用共享session的話,就會(huì)出現(xiàn)問題。當(dāng)一個(gè)客戶端發(fā)送一個(gè)請(qǐng)求(無session id),通過負(fù)載均衡(LB)將第一次請(qǐng)求分發(fā)給web01,服務(wù)器判斷無session id,就讓那個(gè)客戶進(jìn)行登錄操作,并得到響應(yīng),此時(shí)客戶端會(huì)存儲(chǔ)一個(gè)來自web01響應(yīng)的session id,并存儲(chǔ)在瀏覽器的cookie。

當(dāng)客戶端發(fā)送第二次請(qǐng)求的時(shí)候,此時(shí)本次請(qǐng)求已經(jīng)攜帶了session id(跳過登錄),負(fù)載均衡(LB)卻將請(qǐng)求分發(fā)給web02,因?yàn)閣eb02中沒有存儲(chǔ)session,所以無法與客戶端session id進(jìn)行對(duì)應(yīng)。所以程序會(huì)出現(xiàn)異常或是報(bào)錯(cuò),無法正常響應(yīng)亦或然你重新登陸。

session與cookie之間的關(guān)系參考:https://blog.csdn.net/qq_28296925/article/details/80921585

第二節(jié):session會(huì)話共享存儲(chǔ)原理

1.用戶在瀏覽器輸入用戶密碼登錄進(jìn)系統(tǒng)。

2.由負(fù)載均很代理到后端web01。

3.web01將session存儲(chǔ)在redis中,同時(shí)下發(fā)給用戶一個(gè)session id存儲(chǔ)到瀏覽器的cookie中。

4.用戶進(jìn)行其他操作。

5.負(fù)載均衡(LB)代理到web02上面。

6.web02去讀取redis中的session并驗(yàn)證。


session共享原理.png

第三節(jié):session會(huì)話共享實(shí)例

我們使用phpmyadmin軟件進(jìn)行測(cè)試session會(huì)話共享

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.設(shè)置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代碼文件中內(nèi)容

[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主機(jī)IP  

4.在web02上部署phpmyadmin(同上)

5.負(fù)載均衡配置如下

[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

服務(wù)器 IP地址
負(fù)載均衡(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服務(wù)器上安裝redis,并啟用redis

yum install redis -y
sed -i 's#^bind.*#bind 172.16.1.51 127.0.0.1#g' /etc/redis.conf    <-主機(jī)IP+回環(huán)地址
systemctl start redis
systemctl enable redis

8.配置應(yīng)用服務(wù)器,連接redis,將session的信息存儲(chǔ)至redis數(shù)據(jù)庫(kù)中(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.查看內(nèi)存數(shù)據(jù)庫(kù)信息

[root@db01 ~]# redis-cli 
127.0.0.1:6379> keys *
1) "PHPREDIS_SESSION:c4d2e73662097f988f86c43243ccf623"
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容