我在AWS有两台服务器。 一个是现场制作服务器(一个有数百个站点和大约5,000个用户的多站点WordPress安装),另一个是为testing服务器configuration的prod克隆。 活动的有四个arrays服务器,一个Elastic Load Balancer,连接到AWS中的一个大型RDS。 直到昨天,我天真地认为我们的caching正在通过APC和WordPress插件在这里和那里处理。 但不是。 结果发现有人在我们的服务器上添加了AWS的ElastiCache。 从本质上讲,ElastiCache是不在云中的那些memcache。
无论如何,我们前两天试图在我们的testing服务器上启用caching,并且引入了一个非常奇怪的错误(一个redirect神秘地出现在我们的活动网站的主要pipe理仪表板上,然后进入我们的testing服务器)。 所以一旦我们意识到这个bug最有可能与我们不知道的caching系统有关,我们就禁用了caching。 事实certificate,当我们在我们的testing服务器上启用caching时,它使用了我们在服务器上使用的同一个Elasticache服务器(因为testing是活的克隆)。 所以当我们删除/重命名object-cache.php文件时,我们禁用了它。
禁用它解决了我们的redirect问题,但是突然之间,我们的5,000个用户中有很多(不是全部)用户不能再login到他们各自的站点。 出于某种原因,我们的数据库中的值对于很大一部分用户来说不起作用,迫使他们不得不重置密码。 显然,这个数字是5000个用户的巨大数量。 因此,我们在实例上重新启用了caching,并决定修改我们的cachingredirect,而不是WPconfiguration更改(我们在configuration中添加了define('RELOCATE',true);强制redirect到我们的testing服务器被覆盖)。
我们在memcache中注意到的一件事情是,它不断更新我们的wp_options表,其中testing服务器的域代替了我们的活动域。 实际上,每当我运行查询来查找testing域的string并将其更新到活动域时,它仍然在执行此操作。 每隔几分钟,caching都会将其更改回来。 害怕。 但是现在看起来我们的configuration更改强制覆盖。 真正令人关注的是,看起来内存caching似乎是从自己的密钥中提取出来的:值为用户密码而不是直接从数据库中取值。 我的意思是启用caching,用户可以进入。没有它,许多用户被迫重置密码。
有没有人有任何想法,以便如何有效地了解在这种情况下与memcache发生了什么,以及如何解决这个问题,使数据库得到适当的写入,所以密码信息不只是在caching中举行? 我认为这是一个定时炸弹。 所有这一切都需要一个flush_all命令,让我的大部分用户的生活非常痛苦。
我们在NDS上使用RDS上的MySQL。 WordPress 3.4.2。
您的caching被testing实例中的数据和会话信息覆盖。 使用memcached客户端清除caching。 重新启动caching集群也可以这样做。 重置您的密码也会重置您的会话,这就是为什么这是一个可能的解决scheme。
也就是说,你的安全组织可能是错误的。 您的testing实例应该永远无法连接到ElastiCache群集。 Memcached没有身份validation,所以如果你可以访问caching服务器,你可以访问数据。 检查并确保您的安全组没有设置为允许每个地址。