背景:rails部署在多个机器上,如何处理session?
如果单机部署那么不用理会这个问题,使用系统默认的session机制既可,如果多机情况下就不一样,处理不当很有可能出现, 用户在一台机器已经登陆,结果下次访问另一台机器,可能就会被迫再次登陆(因为这台机器并没有session数据)。用户只管使用,并不关心你的应用如何部署,所以出现这种情况会让用户很困惑,甚至会造成比较严重的后果。
如果单机部署那么不用理会这个问题,使用系统默认的session机制既可,如果多机情况下就不一样,处理不当很有可能出现, 用户在一台机器已经登陆,结果下次访问另一台机器,可能就会被迫再次登陆(因为这台机器并没有session数据)。用户只管使用,并不关心你的应用如何部署,所以出现这种情况会让用户很困惑,甚至会造成比较严重的后果。
我尝试采用了数据库存储session的方案。即多个rails共享一个数据库中的session表中的纪录。
无论用户访问哪台rails机器,rails都会取出同一行session数据
具体步骤如下:
step 1)修改 environment.rb
加上如下一行代码:
ActionController::CgiRequest::DEFAULT_SESSION_OPTIONS[:database_manager]=CGI::Session::ActiveRecordStore
step 2)在数据库加上如下一张表
CREATE TABLE `sessions` (
`id` int(11) NOT NULL auto_increment,
`sessid` varchar(255) default NULL,
`data` text,
`updated_at` datetime default NULL,
PRIMARY KEY (`id`),
KEY `session_index` (`sessid`)
) ;
关于session的过期清除
写一个脚本定时删除过期的session纪录,
sql语句如下:
delete from sessions where now()-update_at>3600