在多租户环境下 (cakephp),APC缓存隔离

5
我正在使用cakephp运行一个多租户应用程序。该应用程序只有一个实例,唯一的区别是每个应用程序连接的数据库不同。除此之外,该应用程序是相同的。
我的设置:
1. Apache 2.2 2. Php 5.3 3. cake 1.3.10 4. Win 2k3服务器
我已经在apache的docroot下部署了应用程序(只运行一个应用程序实例)。我最近从文件转换到APC缓存。两个应用程序的缓存文件前缀相同。使用Apache虚拟主机来决定要去哪个应用程序。我正在缓存静态html/js/css/gif,但不缓存php(通过apache的mod_expires)。
问题:
我注意到一些应该可用于APP 1的缓存值显示在App 2的下拉列表中。我很震惊看到这种情况发生。
如何在APC缓存层中添加应用程序之间的隔离?
更新: 即使我将应用程序的新副本放在自己的docroot中,问题仍然存在!
更新2:
场景1)具有所有perm/comb的1个实例
如果我有类似以下的php代码:
if(client=="client1") {
$options = array(opt1,opt2);
}else if(client=="client2") {
$options = array(opt3,opt4);
}

同时由客户端1和客户端2共享该代码,APC缓存会如何影响它?

情景2)每个客户端定制的两个实例

client1.php
$options = array(opt1,opt2);

client2.php
$options = array(opt3,opt4);

这对APC缓存有什么影响? 如果我理解正确,对于情景1,可能会导致客户端1的数据与客户端2混合(非常糟糕)。 对于情景2,只要使用不同的缓存键,我就可以确保永远不会出现混淆问题。

2个回答

2

为什么:

  1. APC不了解虚拟主机、应用程序或其他“apache”事物。
  2. 这意味着如果共享APC,则任何缓存键都在所有虚拟主机之间共享。(通常希望这样做)。
  3. APC没有自己的隔离层。

解决方法:

  1. 为每个应用程序提供自己的缓存键前缀。这使它们能够访问各自的用户缓存键。(最简单的方法)
  2. 如果需要真正的隔离,请遵循breiti的memcached工作流程。(可能是最佳解决方案)
  3. 您可以考虑为每个单独的虚拟主机运行唯一的PHP.ini和唯一的fcgiwrapper(参见:http://chrisgilligan.com/wordpress/apc-cache-considerations-for-virtual-hosting-environments/)。但是,这意味着内存使用量大增。(如果您真的想要这个解决方案)

1

一种方法可能是:

  • 为您的用户使用 memcached 而不是 APC
  • 将您的虚拟主机/域名绑定到自己的 IP 上
  • 为您的虚拟主机启动 memcache 实例(即 vhost1 = 端口 12345,vhost2 = 端口 12346,...)
  • 添加 iptable 规则,在特定的 memcache 端口上删除每个数据包,如果它不匹配该端口的 vhost ip,则不会被处理

您的问题似乎是 PHP 作为 fastcgi 运行,因此每个 vhost 将获得相同的 PHP 进程来共享其缓存。 您需要设置 PHP 仅为每个 vhost 运行(不知道您要查找什么)。

我更喜欢 memcache 方法,因为:

  • memcache 允许您创建一个 memcache 集群
  • 很容易将应用程序服务器与缓存服务器分离(对于扩展性来说是一个巨大的优势)
  • 将字节缓存与用户缓存分离
  • 经过正确配置非常安全(因为其 iptables 非常可靠

感谢您提供的按IP:端口进行memcache的想法,但是关于opcode缓存呢? - aks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接