案例环境:
背景:由于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共享成功