不能直接用 mod_socache_memcache 存 session,必须配合 mod_session 和 mod_session_socache 使用;它仅提供带 TTL 的 key-value 缓存,不处理 session 生命周期、序列化或过期清理。

mod_socache_memcache 是否真的适合存 session
不能直接用 mod_socache_memcache 存 session。它只是 Apache 的通用共享缓存后端,不理解 session 生命周期、过期清理或序列化格式——mod_session 需要的是一个能按 key-value 存取、支持 TTL 的存储层,而 mod_socache_memcache 本身不提供 session 管理逻辑,必须和 mod_session + mod_session_socache 配合使用。
启用 socache memcache 的最小必要模块和配置
先确认已加载三个模块:mod_socache_memcache、mod_session、mod_session_socache。缺一不可,否则会报 Invalid argument: AH01821: unable to configure socache 或 Unknown session provider 'socache'。
在 httpd.conf 或虚拟主机中添加:
SocacheProvider memcache memcache://127.0.0.1:11211?timeout=5 SessionCookieName session path=/;httponly;secure Session socache memcache timeout 600
-
memcache://URL 中的timeout=5是连接超时(秒),不是 session 过期时间 -
Session socache memcache后的timeout 600才是 session 最大空闲时间(单位秒) - Memcached 实例必须已运行且可被 Apache 进程访问(注意 SELinux 或防火墙拦截)
为什么 session 总是丢失或 400 错误
常见原因不是配置语法错,而是数据格式和权限问题:
-
mod_session_socache默认把 session 数据 base64 编码后存入 socache,但 memcached 对 key 长度敏感——如果SessionCookieName值含非法字符(如空格、下划线),会导致 key 构造失败,Apache 返回 400;建议只用字母+数字,例如sessionid - memcached 默认最大 item 大小为 1MB,但
mod_session不分片,单个 session 超过限制会静默失败;可通过-I 2m启动参数调大(如memcached -I 2m) - Apache 工作进程用户(如
www-data)必须能建立到 memcached 的 TCP 连接;在容器或 systemd 场景下,PrivateTmp=yes可能干扰 socket 访问,改用memcache://显式地址更可靠
和 mod_session_dbd 或 Redis 方案比有什么实际代价
memcache 方案快,但丢数据风险高:memcached 重启即清空全部 session,且不支持持久化或主从同步;而 mod_session_dbd 写数据库至少能保留记录,Redis 可配 RDB/AOF。
另一个隐性成本是调试困难:mod_socache_memcache 没有内置 debug 日志,无法直接看到 key 是否写入成功;建议先用 telnet 127.0.0.1 11211 手动 set test 0 60 4\r\ntest\r\n 验证连通性,再观察 Apache error_log 中是否有 socache_memcache: failed to store 类报错。
真正上线前,务必验证 session 在多进程、多服务器间是否一致——memcached 本身无一致性保障,全靠客户端行为,而 Apache 的 socache 实现对并发写没有锁保护,高频写入可能丢更新。

















