在搭建完集群环境后,不得不考虑的一个问题就是用户访问产生的session如何处理。如果不做任何处理的话,用户将出现频繁登录的现象,比如集群中存在A、B两台服务器,用户在第一次访问网站时,Nginx通过其负载均衡机制将用户请求转发到A服务器,这时A服务器就会给用户创建一个Session。当用户第二次发送请求时,Nginx将其负载均衡到B服务器,而这时候B服务器并不存在Session,所以就会将用户踢到登录页面。这将大大降低用户体验度,导致用户的流失,这种情况是项目绝不应该出现的
1. 粘性session
原理:将用户锁定在某台服务器上,有负载均衡设置ip_hash,是的同一个ip的客户端请求在一段时间内始终落在同一个web server上
nginx作为反向代理服务器的配置
upstream example.com {
server 192.168.31.23:80
server 192.168.31.24:80
ip_hash
}
web server 192.168.31.23 上
server {
listen 80;
localtion / {
proxy_pass http://example.com
}
}
web server 192.168.31.24 上
server {
listen 80;
localtion / {
proxy_pass http://example.com
}
}
缺陷:限制服务扩展
- nginx必须是最前端服务器
- nginx后端还有其他方式的负载均衡,请求再次分流,session还是不能定位到一台服务器上
2. 利用memcached集群共享session
- 首先保证php的memcache扩展已安装
$ php -m | grep memcache
[PHP Modules]
..........
memcached
...........
- 部署memcached集群。
主机名分别是
memcache1.server,memcache2.server,memcache3.server。启动相应的端口
注意:不同业务用到的memcache服务端口号不能冲突
业务A:用到memcache1-3.server的11021,11022,11023端口;
业务B:用到memcache1-3.server的11031,11032,11033端口;
将程序添加到开机启动/etc/rc.local里
- 业务服务器上应用memcache
- 在业务服务器上的/etc/hosts里设置主机映射
$ vim /etc/hosts
192.168.1.23 memcache1.server
192.168.1.24 memcache2.server
192.168.1.25 memcache3.server
- 修改php的配置文件php.ini
[Session]
session_save_handler = memcached
session_save_path = "memcache1.server:11021,memcache2.server:11022,memcache3.server:11023"
然后重启php-fpm
- 分布在其他服务器上的业务B以此类推
网友评论