mod_authn_socache可显著减少ldap重复查询,需加载socache_shmcb、authn_socache、authnz_ldap三模块并按序启用;配置cacheprovider与authncachesocache指定共享内存缓存,authbasicprovider中socache须排ldap前,且用authncacheprovidefor ldap声明缓存目标。

直接用 mod_authn_socache 缓存 LDAP 认证结果,能显著减少对后端 LDAP 服务器的重复查询——尤其在页面含大量资源(如图片、JS、CSS)时,一次登录会触发数十次认证请求,缓存可把其中绝大多数转为内存查表。
确认模块已启用且顺序正确
必须同时加载三个基础模块,且 mod_socache_shmcb 要先于 mod_authn_socache 加载:
-
mod_socache_shmcb:提供共享内存缓存底层支持 -
mod_authn_socache:实现认证凭证缓存逻辑 -
mod_authnz_ldap:实际执行 LDAP 查询与绑定
在 Debian/Ubuntu 上运行:a2enmod socache_shmcb authn_socache authnz_ldap
然后用 httpd -M | grep -E "(socache|authn|ldap)" 验证是否全部列出,顺序应为 socache_shmcb → authn_socache → authnz_ldap。
配置共享内存缓存区
在主配置(如 apache2.conf 或 httpd.conf)中添加:
CacheProvider shmcb:/var/cache/apache2/socache-shmcb(512000) AuthnCacheSOCache shmcb AuthnCacheTimeout 300
说明:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
-
shmcb(512000)表示分配 512KB 共享内存,约支持 2000 个用户条目(每个约 250B) -
AuthnCacheSOCache shmcb必须与CacheProvider的别名一致(默认就是shmcb) -
AuthnCacheTimeout 300设为 300 秒(5 分钟),避免缓存过期太频繁;若 LDAP 密码策略变更较频繁,可适当调低
在目录或位置块中启用缓存并声明提供者优先级
关键点在于让 Apache 先尝试缓存,再回退到 LDAP:
<directory>
AuthType Basic
AuthName "LDAP Protected"
AuthBasicProvider socache ldap
AuthnCacheProvideFor ldap
AuthLDAPURL "ldap://ldap.example.com/dc=example,dc=com?uid?one"
AuthLDAPBindDN "cn=admin,dc=example,dc=com"
AuthLDAPBindPassword "secret"
Require valid-user
</directory>
注意两处细节:
-
AuthBasicProvider socache ldap:明确把socache放在ldap前,表示优先查缓存 -
AuthnCacheProvideFor ldap:告诉mod_authn_socache为ldap提供者缓存结果(不是authn_ldap或其他变体)
补充建议与验证方式
LDAP 本身已有内置缓存(如 mod_ldap 的 LDAPCacheEntries),但那是操作级缓存(如连接、搜索结果),而 mod_authn_socache 是凭证级缓存(用户名+密码是否有效),二者不冲突,可共存。
上线前建议检查:
- 确保
/var/cache/apache2/目录存在且 Apache 进程有读写权限 - 重启 Apache 后访问受保护路径,观察 LDAP 服务器日志——首次认证后连续刷新页面,应只看到极少量新 bind 请求
- 用
curl -I -u testuser:testpass http://yoursite/protected/多次测试,配合tail -f /var/log/apache2/error.log查看是否有authn_socache相关提示(如缓存命中)










