案例環境:
背景:由於php-fpm運行在不同的服務器上,然而默認的php的session數據是在各個服務器上分別存放的。如果在某一次php請求過後,nginx將php請求發送到一臺php-fpm服務器上,就會導致session的丟失。那麼接下來就需通過memcached統一存儲session來解決這樣的問題。
第一步:基礎環境搭建
1、完成nginx+php-fpm與mysql分離的基礎環境搭建(mysql注意分別授權給web服務器)
2、php擴展memcache
3、Memcached服務端的部署
4、Heartbeat環境的部署(heartheat啓動服務時,服務必須在/etc/init.d/下)
5、測試保障能夠通過IP地址192.168.1.123能夠正常訪問
第二步:安裝如上的環境搭建後,不共享session,見web1和web2存放在相應的web目錄下。測試代碼如下
Web1上的測試代碼web1.php
<?php
session_start();
$_SESSION['TEST']=”session value test ”;
echo $_SESSION['TEST']
?>
測試結果:
Web2上的測試代碼web2.php(測試前,通過關閉web1的heartbeat服務(/etc/init.d/heartbeat stop),讓服務切換到web2上)
<?php
session_start();
echo $_SESSION['TEST']
?>
測試結果:
說明:在web1中,給TEST session賦值爲“session value test”,那麼web1肯定能夠輸出其內容,那web2卻不能輸出,其原因在於,session默認是保存在自己的web服務器上的。基於這樣的問題,如下,我們將通過session共享的方式解決這樣的問題
第三步:session共享測試
1、在192.168.1.121上啓動memcached
memcached -d -m 100 -l 192.168.1.121 -p 11211 -u root
2、分別的web1和web2上的php.ini(/usr/local/php/lib目錄下)文件中,配置如下內容
[Session]
session.save_handler = “memcache”
session.save_path = “tcp://192.168.1.121:11211”
說明:作用就是通過memcached來處理session,保存路徑爲tcp://192.168.1.121:11211
3、完成後,重新啓動php-fpm服務器
[root@web1 sbin]# ps -aux | grep php-fpm
Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ
root 1933 0.0 0.5 41004 2768 ? Ss 06:32 0:00 php-fpm: master process (/usr/local/php/etc/php-fpm.conf)
[root@web1 sbin]# kill -QUIT 1933
[root@web1 sbin]# ./php-fpm
[root@web2 lib]# ps -aux | grep php-fpm
Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ
root 1493 0.0 0.5 41004 2748 ? Ss 06:33 0:00 php-fpm: master process (/usr/local/php/etc/php-fpm.conf)
[root@web2 lib]# kill -QUIT 1493
[root@web2 sbin]# ./php-fpm
4、phpinfo中,需包含如下內容
5、再測試web1.php和web2.php的結果
Web1:
Web2:
說明:session共享成功