我正在尝试设置memcached以允许在2个负载均衡的Apache服务器上进行会话共享 - 在我的php.ini中我有:
节点1
session.save_handler = memcached
session.save_path = "tcp://NODE1_IP:11211"
和
节点2
session.save_handler = memcached
session.save_path = "tcp://NODE2_IP:11211"
在/ etc / sysconfig / memcached中,我有:
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS="-l 127.0.0.1"
在phpinfo我有:
session.save_handler memcached memcached
session.save_path tcp://NODE1_IP:11211 tcp://NODE1_IP:11211
当我登录我的应用程序时,我在登录页面和页面上都有session_start,它检查用户是否已登录,但是当我:
print_r($_SESSION);
当会话看起来没有被设置时,没有显示任何内容。
有一点值得注意的是,在phpinfo中,我在会话部分的顶部看到了这些行:
Session Support enabled
Registered save handlers files user
Registered serializer handlers php_serialize php php_binary wddx
已注册的保存处理程序列出了文件和用户,但没有关于memcached的内容 - 可能这就是为什么这不起作用?我该如何更改/添加?
node1_ip应该是公共IP还是私有IP,还是不重要?
我可以telnet到localhost 11211但不能访问NODE1_IP 11211 - 拒绝连接。端口11211已打开 - 尝试将/ etc / sysconfig / memcached更改为" -l NODE1_IP:11211"但仍然拒绝连接
如果我将/ etc / sysconfig / memcached中的选项更改为OPTIONS""然后我可以telnet到NODE1_IP 11211所以看起来我在memcached配置中的格式是错误的吗?
还有什么我需要做的吗?我尝试使用127.0.0.1更改保存路径,添加和删除tcp,使用实际的IP地址,使用所有用逗号分隔的IP地址,但仍无法使其工作。
答案 0 :(得分:0)
假设您在负载均衡器上使用粘性会话,并且无法保证来自同一客户端的请求由同一个apache提供服务。
OPTIONS="-l 127.0.0.1"
告诉memcached仅侦听本地环回,即除了localhost之外的任何地方都无法访问它。您需要更改它以侦听专用网络接口(确保它不能从Internet公开访问)。
要在两个apache服务器上保持会话可用,您需要同步memcached。最简单的方法是通过将save_path
指向两个服务器来复制所有数据,并将session_redundancy设置为3:
session.save_path = "tcp://NODE1_IP:11211, tcp://NODE2_IP:11211"
memcache.allow_failover=1
memcache.session_redundancy=3
因此会话将保存到两个memcached服务器。
如果您不想牺牲内存以实现冗余,请仅保留1个memcached运行,并将两个apache服务器指向它。
编辑:
应该安装php_memcache库,例如对于debian发行版:
php 5.x:apt-get install php5-memcache
php 7.x:apt-get install php-memcache
答案 1 :(得分:0)
如果你有:
session.save_handler = memcached
这意味着您使用的是memcache D 扩展名而不是内存缓存。
在这种情况下,配置应该写成而不是 tcp:// 协议:
session.save_path NODE1_IP:11211
session.save_path = tcp:// NODE1_IP:11211 用于 memcache 扩展名,最后没有“d”。