第一節(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)證。

第三節(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"