背景:对于很多中小型项目而言,PHP语言是个不错的选择。当访问有一定的量,为了提示响应时间,需要进行多台web服务器进行同时处理请求。
如图所示:
1.客户端通过vip(虚拟ip地址)请求进入到SLB负载均衡。
2.SLB负载均衡器根据负载均衡算法(这里不是本文重点,不做介绍)将请求转发到web服务器。
3.web服务器中通过nginx+php-fpm提供服务。
在默认的情况下,php的session文件是保存在本机的/tmp目录中的。
这就存在一个问题:
1.对于同一个用户A,加入需要请求登陆服务,第一次请求被负载均衡转发到web1服务器处理。A用户输入username/password,成功获取到登陆状态。此时,A用户的session会话信息是保存在web1服务器中。
2.此时A用户再次访问页面,加入请求被转发到web2,由于web2机器中没有保存用户A的会话信息,致使A用户的不处于登陆状态(登陆状态丢失)。
针对这种分布式部署的php服务,如果在要保持session会话一致性,需要使用外部服务来保存session会话信息,而不是使用php的默认在服务器本地保存会话信息。
外部保存session会话的方式有多种,如mysql、memcache等等。
这里我们使用一个安装Memcache的机器作为保存session会话服务。
#修改php.ini
;session.save_handler = files
;session.save_path = "/tmp"
修改为
session.save_handler = memcached
session.save_path = "x.x.x.x:11211"