5

我正在运行 centos 6。使用 apache 处理 php 和 nginx 处理脚本图像和 css

我已经安装了 memcached 服务器。

PORT="11211"
USER="memcached"
MAXCONN="4096"
CACHESIZE="512"
OPTIONS="-l 127.0.0.1"

我还安装了 php 模块。

我创建了一个新的 php 文件

 $memcache = new Memcache;
 $memcache->connect('127.0.0.1', 11211) or die ("Could not connect");

我检查了 memcached 状态,它正在运行。
我总是收到“无法连接”。
我试图将值从 '127.0.0.1' 更改为 'localhost' - 仍然无法正常工作。

$memcache = new Memcache();
$memcache->addServer('127.0.0.1', 11211) or die ("Could not connect");
var_dump($memcache->getExtendedStats());
$memcache->set('key', 'hello world', false, 60);
echo $memcache->get('key');
//$memcache->connect('127.0.0.1', 11211) or die ("Could not connect");

输出

数组(1){[“127.0.0.1:11211”]=>布尔(假)}

connect 和 addServer 有什么不同?最好的方法是什么?
但我没有得到 Hello World

有关代码和此问题的更多更新..

phpinfo显示 memcached。
var_dump($memcache->get('key')); 给

布尔(假)

为什么我应该使用addServer而不是connect

更多代码更新

$memcache = new Memcache;
$memcache->addServer('localhost', 11211);
echo $memcache->getServerStatus('localhost', 11211);
output : 1

//$memcache->set('key', 'hello world') or die("failed to store data");
output : failed to store data

更多细节

getsebool httpd_can_network_memcache

返回

应该重来吗?

注意:Memcache::connect(): Server 127.0.0.1 (tcp 11211, udp 0) failed with: Permission denied (13)
4

1 回答 1

7

正如评论中所指出的,您似乎正在运行 Security-Enhanced Linux (SELinux),它在内核级别添加了额外的安全层。在我的经验和使用中,我发现 SELinux 在某些服务周围添加了一个力场,因此它们无法访问系统上的特定资产。例如,如果我想从 提供 html 内容/home/src/web,我必须告诉系统 httpd 服务可以访问/home/src/web路径中的内容。为此,我将发出以下命令:

$ -> setsebool -P httpd_enable_homedirs 1

基本上,为了允许服务之间的交叉通信,您必须通过策略允许此类访问,就像“针孔”防火墙以允许访问特定端口一样,除了 SELinux 您没有授予对端口的访问权限,而是您是授予对系统或服务的另一部分的访问权限。对我们来说幸运的是,有几个内置策略可以使用上述setsebool结构,而不是尝试定义我们自己的策略,这可能会很痛苦。有关 SELinux 的更完整说明,请查看wikipedia 页面

现在回答您的具体问题:

为什么我应该使用 addServer 而不是连接?

addserver()将允许您将多个 ip(或主机名)添加到假定缓存值存在的列表中,即 memcache 服务器池。而这connect()将只允许您连接到单个指定的服务器。

getebool httpd_can_network_memcache,它返回关闭,它应该返回吗?

是的,似乎打开此特定设置将允许您连接到启用 SELinux 的 memcache 服务器,但是在我的生产服务器上,我仍然将其设置为关闭,但有以下设置:

$ -> setsebool -P httpd_can_network_connect 1

我相信,这两种设置都可以实现目标,但是通过上述设置,如果您在另一台主机上有 memcache 服务器,httpd 仍然可以访问它。

这是一篇关于针孔 SELinux 以允许 httpd 服务访问其他服务的不错的文章。

于 2013-08-25T18:51:18.463 回答