非粘性会话负载平衡服务器上的CodeIgniter会话中断

非粘性会话负载平衡服务器上的CodeIgniter会话中断,codeigniter,session,load-balancing,Codeigniter,Session,Load Balancing,我有一个棘手的问题;我已经吃了一个月左右了,所以我做了广泛的研究 我有一个CodeIgniter站点,由第三方托管,在2台服务器上,由第三方平衡负载,这不是我的选择,也不是我有权更改的任何内容。有趣的是,负载平衡器随机选择服务器,没有粘性会话 现在,默认情况下,CI应该使用cookie或将会话存储在DB中来处理此问题。我们已将会话设置为自动加载 $autoload['libraries'] = array('session', 'user_agent', 'rest_client', 'lib_

我有一个棘手的问题;我已经吃了一个月左右了,所以我做了广泛的研究

我有一个CodeIgniter站点,由第三方托管,在2台服务器上,由第三方平衡负载,这不是我的选择,也不是我有权更改的任何内容。有趣的是,负载平衡器随机选择服务器,没有粘性会话

现在,默认情况下,CI应该使用cookie或将会话存储在DB中来处理此问题。我们已将会话设置为自动加载

$autoload['libraries'] = array('session', 'user_agent', 'rest_client', 'lib_log');
该配置为会话和cookie设置了以下内容:

/*
|--------------------------------------------------------------------------
| Session Variables
|--------------------------------------------------------------------------
|
| 'sess_cookie_name'        = the name you want for the cookie
| 'sess_expiration'         = the number of SECONDS you want the session to     last.
|   by default sessions last 7200 seconds (two hours).  Set to zero for no expiration.
| 'sess_expire_on_close'    = Whether to cause the session to expire automatically
|   when the browser window is closed
| 'sess_encrypt_cookie'     = Whether to encrypt the cookie
| 'sess_use_database'       = Whether to save the session data to a database
| 'sess_table_name'         = The name of the session database table
| 'sess_match_ip'           = Whether to match the user's IP address when reading the session data
| 'sess_match_useragent'    = Whether to match the User Agent when reading the session data
| 'sess_time_to_update'     = how many seconds between CI refreshing Session Information
|
*/
$config['sess_cookie_name']     = 'e1fdc095-98e2-4294-9584-362ba355bacf';

$config['sess_expiration']      = 3600;
$config['sess_expire_on_close']= TRUE;
$config['sess_encrypt_cookie']  = TRUE;
$config['sess_use_database']    = FALSE; // obviously used TRUE when trying to use DB
$config['sess_table_name']      = 'ci_sessions';
$config['sess_match_ip']        = FALSE;
$config['sess_match_useragent']= TRUE;
$config['sess_time_to_update']  = 300;

/*
|--------------------------------------------------------------------------
| Cookie Related Variables
|--------------------------------------------------------------------------
|
| 'cookie_prefix' = Set a prefix if you need to avoid collisions
| 'cookie_domain' = Set to .your-domain.com for site-wide cookies
| 'cookie_path'   =  Typically will be a forward slash
| 'cookie_secure' =  Cookies will only be set if a secure HTTPS connection exists.
|
*/
$config['cookie_prefix']    = "";
$config['cookie_domain']    = "";
$config['cookie_path']  = "/";
$config['cookie_secure']    = TRUE;
$config['cookie_httponly']  = TRUE;
我希望这个配置中有东西是假的?你的名字太长了?sess\u match\u ip应该是真的吗

1使用cookie:站点在单个节点上工作,但当请求被定向到另一台服务器时,会话将消失。当请求被定向到原始服务器时,会话将返回。这种情况经常发生,但并不总是如此——有时用户运气不错,所有请求都会转到一台服务器,导致无限的重定向循环,直到浏览器停止尝试

有趣的是,在这种情况下,登录时的标准行为是从创建会话的控制器/方法A/登录移动到另一个控制器B/索引中的方法,再移动到同一控制器B/欢迎中的方法。总是B/welcome无法识别会话,并重定向回A/login。然后循环开始,A/login识别会话

2与数据库:会话未创建,显然我无法监视数据库会话也未在数据库中创建。这一点还没有得到充分的探讨,部分原因是数据库中会话的唯一ID必须存储在客户机上,而唯一的存储位置是cookie。如果使用cookie,为什么要使用数据库

另外,第三方主机也回退了这一尝试,很难让他们做进一步的事情

因此,我有一个站点,如果负载完全在一台服务器上,那么它100%在我的单台服务器上工作,在它们的服务器上工作,但当负载平衡器按预期运行时,它会失败。cookie和DB存储方法都是如此


我束手无策。如果有人有任何可能的解决方案或建议,请让我知道。

我最终获得了一个类似的设置,并复制了该问题。但是,我也解决了这个问题。。我只是不知道怎么做。正是通过黑客攻击并最终替换了CI的整个/system文件夹,我才使其正常工作

FWIW,上面的配置设置

$config['cookie_secure']    = TRUE;
$config['cookie_httponly']  = TRUE;
不起作用;cookie_secure需要为false,即使站点有证书。我在其他地方读到,在负载平衡环境中安装证书的方式可能会影响这一点。cookie_httponly是非标准的,显然没有效果

对不起,我没有更好的建议