Apache HTTP Server 版本 2.4
描述 | LDAP 连接池和结果缓存服务,供其他 LDAP 模块使用 |
---|---|
状态 | 扩展 |
模块标识符 | ldap_module |
源文件 | util_ldap.c |
此模块旨在提高依赖于后端连接到 LDAP 服务器的网站的性能。除了标准 LDAP 库提供的功能外,此模块还添加了 LDAP 连接池和 LDAP 共享内存缓存。
要启用此模块,必须将 LDAP 支持编译到 apr-util 中。这可以通过在构建 Apache 时向 configure
脚本添加 --with-ldap
标志来实现。
SSL/TLS 支持取决于已链接到 APR 的 LDAP 工具包。截至撰写本文时,APR-util 支持:OpenLDAP SDK(2.x 或更高版本)、Novell LDAP SDK、 Mozilla LDAP SDK、本机 Solaris LDAP SDK(基于 Mozilla)或本机 Microsoft LDAP SDK。有关详细信息,请参阅 APR 网站。
以下是一个示例配置,它使用 mod_ldap
来提高由 mod_authnz_ldap
提供的 HTTP 基本身份验证的性能。
# Enable the LDAP connection pool and shared # memory cache. Enable the LDAP cache status # handler. Requires that mod_ldap and mod_authnz_ldap # be loaded. Change the "yourdomain.example.com" to # match your domain. LDAPSharedCacheSize 500000 LDAPCacheEntries 1024 LDAPCacheTTL 600 LDAPOpCacheEntries 1024 LDAPOpCacheTTL 600 <Location "/ldap-status"> SetHandler ldap-status Require host yourdomain.example.com Satisfy any AuthType Basic AuthName "LDAP Protected" AuthBasicProvider ldap AuthLDAPURL "ldap://127.0.0.1/dc=example,dc=com?uid?one" Require valid-user </Location>
LDAP 连接从请求到请求进行池化。这允许 LDAP 服务器保持连接并绑定,准备处理下一个请求,而无需解绑/连接/重新绑定。性能优势类似于 HTTP 保持连接的效果。
在繁忙的服务器上,许多请求可能会同时尝试访问相同的 LDAP 服务器连接。如果 LDAP 连接正在使用中,Apache 将在原始连接旁边创建一个新连接。这确保连接池不会成为瓶颈。
无需在 Apache 配置中手动启用连接池。任何使用此模块访问 LDAP 服务的模块都将共享连接池。
LDAP 连接可以跟踪绑定到 LDAP 服务器时使用的 ldap 客户端凭据。这些凭据可以提供给在转介跟踪期间不允许匿名绑定的 LDAP 服务器。要控制此功能,请参阅 LDAPReferrals
和 LDAPReferralHopLimit
指令。默认情况下,此功能已启用。
为了提高性能,mod_ldap
使用积极的缓存策略来最大限度地减少必须联系 LDAP 服务器的次数。当 Apache 提供受 mod_authnz_ldap
保护的页面时,缓存可以轻松地将吞吐量提高一倍或三倍。此外,LDAP 服务器上的负载将显着降低。
mod_ldap
在搜索/绑定阶段使用搜索/绑定缓存,在比较阶段使用两个操作缓存,支持两种类型的 LDAP 缓存。服务器使用的每个 LDAP URL 都有自己的一组这三个缓存。
执行搜索然后绑定的过程是 LDAP 操作中最耗时的方面,尤其是在目录很大的情况下。搜索/绑定缓存用于缓存所有导致成功绑定的搜索。负面结果(即,不成功的搜索或未导致成功绑定的搜索)不会被缓存。做出此决定的理由是,具有无效凭据的连接只占连接总数的一小部分,因此通过不缓存无效凭据,可以减小缓存的大小。
mod_ldap
在缓存中存储用户名、检索到的 DN、用于绑定的密码和绑定的时间。每当使用相同的用户名启动新连接时,mod_ldap
都会将新连接的密码与缓存中的密码进行比较。如果密码匹配,并且缓存的条目不太旧,mod_ldap
将绕过搜索/绑定阶段。
搜索和绑定缓存由 LDAPCacheEntries
和 LDAPCacheTTL
指令控制。
在属性和可分辨名称比较函数期间,mod_ldap
使用两个操作缓存来缓存比较操作。第一个比较缓存用于缓存为测试 LDAP 组成员资格而进行的比较的结果。第二个比较缓存用于缓存对可分辨名称之间进行的比较的结果。
请注意,在检查组成员资格时,任何子组比较结果都会被缓存以加快将来的子组比较。
这两个缓存的行为由 LDAPOpCacheEntries
和 LDAPOpCacheTTL
指令控制。
mod_ldap
具有一个内容处理程序,允许管理员监控缓存性能。内容处理程序的名称为 ldap-status
,因此可以使用以下指令访问 mod_ldap
缓存信息
<Location "/server/cache-info"> SetHandler ldap-status </Location>
通过获取 URL http://servername/cache-info
,管理员可以获取 mod_ldap
缓存使用的每个缓存的状态报告。请注意,如果 Apache 不支持共享内存,则每个 httpd
实例都有自己的缓存,因此重新加载 URL 每次都会导致不同的信息,具体取决于哪个 httpd
实例处理请求。
创建到 LDAP 服务器的 SSL 和 TLS 连接的能力由指令 LDAPTrustedGlobalCert
、LDAPTrustedClientCert
和 LDAPTrustedMode
定义。这些指令指定要使用的 CA 和可选的客户端证书,以及连接上要使用的加密类型(无、SSL 或 TLS/STARTTLS)。
# Establish an SSL LDAP connection on port 636. Requires that # mod_ldap and mod_authnz_ldap be loaded. Change the # "yourdomain.example.com" to match your domain. LDAPTrustedGlobalCert CA_DER "/certs/certfile.der" <Location "/ldap-status"> SetHandler ldap-status Require host yourdomain.example.com Satisfy any AuthType Basic AuthName "LDAP Protected" AuthBasicProvider ldap AuthLDAPURL "ldaps://127.0.0.1/dc=example,dc=com?uid?one" Require valid-user </Location>
# Establish a TLS LDAP connection on port 389. Requires that # mod_ldap and mod_authnz_ldap be loaded. Change the # "yourdomain.example.com" to match your domain. LDAPTrustedGlobalCert CA_DER "/certs/certfile.der" <Location "/ldap-status"> SetHandler ldap-status Require host yourdomain.example.com Satisfy any AuthType Basic AuthName "LDAP Protected" AuthBasicProvider ldap AuthLDAPURL "ldap://127.0.0.1/dc=example,dc=com?uid?one" TLS Require valid-user </Location>
不同的 LDAP SDK 在设置和处理 CA 和客户端证书方面有很大的不同。
如果您打算使用 SSL 或 TLS,请仔细阅读本节,以了解不同 LDAP 工具包上配置之间的差异。
CA 证书在名为 cert7.db 的文件中指定。SDK 不会与任何证书未由此文件中指定的 CA 签名的 LDAP 服务器通信。如果需要客户端证书,则可以指定一个可选的 key3.db 文件,并指定一个可选的密码。如果需要,可以指定 secmod 文件。这些文件采用与 Netscape Communicator 或 Mozilla Web 浏览器使用的格式相同。获取这些文件的最简单方法是从您的浏览器安装中获取它们。
客户端证书通过引用证书“昵称”使用 LDAPTrustedClientCert
指令在每个连接中指定。可以指定一个可选的密码来解锁证书的私钥。
SDK 仅支持 SSL。尝试使用 STARTTLS 会在运行时尝试联系 LDAP 服务器时导致错误。
# Specify a Netscape CA certificate file LDAPTrustedGlobalCert CA_CERT7_DB "/certs/cert7.db" # Specify an optional key3.db file for client certificate support LDAPTrustedGlobalCert CERT_KEY3_DB "/certs/key3.db" # Specify the secmod file if required LDAPTrustedGlobalCert CA_SECMOD "/certs/secmod" <Location "/ldap-status"> SetHandler ldap-status Require host yourdomain.example.com Satisfy any AuthType Basic AuthName "LDAP Protected" AuthBasicProvider ldap LDAPTrustedClientCert CERT_NICKNAME <nickname> [password] AuthLDAPURL "ldaps://127.0.0.1/dc=example,dc=com?uid?one" Require valid-user </Location>
Novell SDK 要正常工作,必须指定一个或多个 CA 证书。这些证书可以指定为二进制 DER 或 Base64(PEM)编码文件。
注意:客户端证书是全局指定的,而不是每个连接指定的,因此必须使用以下 LDAPTrustedGlobalCert
指令指定。尝试通过 LDAPTrustedClientCert
指令设置客户端证书会导致在尝试连接到 LDAP 服务器时记录错误。
SDK 支持 SSL 和 STARTTLS,使用 LDAPTrustedMode
参数设置。如果指定了 ldaps:// URL,则强制使用 SSL 模式,覆盖此指令。
# Specify two CA certificate files LDAPTrustedGlobalCert CA_DER "/certs/cacert1.der" LDAPTrustedGlobalCert CA_BASE64 "/certs/cacert2.pem" # Specify a client certificate file and key LDAPTrustedGlobalCert CERT_BASE64 "/certs/cert1.pem" LDAPTrustedGlobalCert KEY_BASE64 "/certs/key1.pem" [password] # Do not use this directive, as it will throw an error #LDAPTrustedClientCert CERT_BASE64 "/certs/cert1.pem"
OpenLDAP SDK 要正常工作,必须指定一个或多个 CA 证书。这些证书可以指定为二进制 DER 或 Base64(PEM)编码文件。
CA 和客户端证书都可以全局指定 (LDAPTrustedGlobalCert
) 或每个连接指定 (LDAPTrustedClientCert
)。当任何设置在每个连接中指定时,全局设置将被取代。
SDK 的文档声称支持 SSL 和 STARTTLS,但 STARTTLS 似乎并非在所有版本的 SDK 上都能正常工作。可以使用 LDAPTrustedMode 参数设置 SSL/TLS 模式。如果指定了 ldaps:// URL,则强制使用 SSL 模式。OpenLDAP 文档指出,SSL (ldaps://) 支持已被弃用,将被 TLS 取代,尽管 SSL 功能仍然有效。
# Specify two CA certificate files LDAPTrustedGlobalCert CA_DER "/certs/cacert1.der" LDAPTrustedGlobalCert CA_BASE64 "/certs/cacert2.pem" <Location "/ldap-status"> SetHandler ldap-status Require host yourdomain.example.com LDAPTrustedClientCert CERT_BASE64 "/certs/cert1.pem" LDAPTrustedClientCert KEY_BASE64 "/certs/key1.pem" # CA certs respecified due to per-directory client certs LDAPTrustedClientCert CA_DER "/certs/cacert1.der" LDAPTrustedClientCert CA_BASE64 "/certs/cacert2.pem" Satisfy any AuthType Basic AuthName "LDAP Protected" AuthBasicProvider ldap AuthLDAPURL "ldaps://127.0.0.1/dc=example,dc=com?uid?one" Require valid-user </Location>
尚不支持本机 Solaris LDAP 库的 SSL/TLS。如果需要,请改为安装和使用 OpenLDAP 库。
本机 Microsoft LDAP 库的 SSL/TLS 证书配置是在系统注册表中完成的,不需要任何配置指令。
通过使用 ldaps:// URL 格式或相应地使用 LDAPTrustedMode
指令,支持 SSL 和 TLS。
注意:此工具包对客户端证书支持的状态尚不清楚。
描述 | 主 LDAP 缓存中的最大条目数 |
---|---|
语法 | LDAPCacheEntries number |
默认值 | LDAPCacheEntries 1024 |
上下文 | 服务器配置 |
状态 | 扩展 |
模块 | mod_ldap |
指定主 LDAP 缓存的最大大小。此缓存包含成功的搜索/绑定。将其设置为 0 可关闭搜索/绑定缓存。默认大小为 1024 个缓存的搜索。
描述 | 缓存项保持有效的时长 |
---|---|
语法 | LDAPCacheTTL 秒 |
默认值 | LDAPCacheTTL 600 |
上下文 | 服务器配置 |
状态 | 扩展 |
模块 | mod_ldap |
指定搜索/绑定缓存中项保持有效的时长(以秒为单位)。默认值为 600 秒(10 分钟)。
描述 | 丢弃在连接池中闲置时间过长的后端连接 |
---|---|
语法 | LDAPConnectionPoolTTL n |
默认值 | LDAPConnectionPoolTTL -1 |
上下文 | 服务器配置,虚拟主机 |
状态 | 扩展 |
模块 | mod_ldap |
兼容性 | Apache HTTP Server 2.3.12 及更高版本 |
指定池化 LDAP 连接可以保持空闲的最大时长(以秒为单位),在此时长内连接仍可供使用。连接在下次需要时清理,而不是异步清理。
设置为 0 将导致连接永远不会保存在后端连接池中。默认值为 -1,以及任何其他负值,都允许任何时长的连接被重用。
出于性能原因,此指令使用的参考时间基于 LDAP 连接返回到池中的时间,而不是与 LDAP 服务器最后一次成功 I/O 的时间。
从 2.4.10 开始,已实施新的措施来避免参考时间因缓存命中或缓慢请求而膨胀。首先,如果不需要后端 LDAP 连接,则不会更新参考时间。其次,参考时间使用 HTTP 请求接收的时间,而不是请求完成的时间。
此超时默认以秒为单位,但接受毫秒 (ms)、分钟 (min) 和小时 (h) 的后缀。
描述 | 指定套接字连接超时时长(以秒为单位) |
---|---|
语法 | LDAPConnectionTimeout 秒 |
上下文 | 服务器配置 |
状态 | 扩展 |
模块 | mod_ldap |
此指令配置底层 LDAP 客户端库中可用的 LDAP_OPT_NETWORK_TIMEOUT(或 LDAP_OPT_CONNECT_TIMEOUT)选项。此值通常控制 LDAP 客户端库等待 TCP 连接到 LDAP 服务器完成的时长。
如果连接在超时时间内未成功,则会返回错误,或者 LDAP 客户端库将尝试连接到辅助 LDAP 服务器(如果已指定,则通过 AuthLDAPURL
中的空格分隔的主机名列表)。
如果与服务器链接的 LDAP 客户端库支持 LDAP_OPT_NETWORK_TIMEOUT 选项,则默认值为 10 秒。
描述 | 启用 LDAP SDK 中的调试 |
---|---|
语法 | LDAPLibraryDebug 7 |
默认值 | 已禁用 |
上下文 | 服务器配置 |
状态 | 扩展 |
模块 | mod_ldap |
打开 SDK 特定的 LDAP 调试选项,这些选项通常会导致 LDAP SDK 将详细的跟踪信息记录到主 Apache 错误日志中。来自 LDAP SDK 的跟踪消息提供了详细的信息,这些信息在调试与后端 LDAP 服务器的连接问题时可能很有用。
此选项仅在 Apache HTTP Server 与实现 LDAP_OPT_DEBUG
或 LDAP_OPT_DEBUG_LEVEL
的 LDAP SDK 链接时可配置,例如 OpenLDAP(值为 7 表示详细)或 Tivoli Directory Server(值为 65535 表示详细)。
记录的信息可能包含 LDAP 身份验证使用或验证的明文凭据,因此在使用此指令时,应注意保护和清除错误日志。
描述 | 用于缓存 LDAP 比较操作的条目数量 |
---|---|
语法 | LDAPOpCacheEntries 数字 |
默认值 | LDAPOpCacheEntries 1024 |
上下文 | 服务器配置 |
状态 | 扩展 |
模块 | mod_ldap |
这指定了 mod_ldap
用于缓存 LDAP 比较操作的条目数量。默认值为 1024 个条目。将其设置为 0 将禁用操作缓存。
描述 | 操作缓存中条目保持有效的时长 |
---|---|
语法 | LDAPOpCacheTTL 秒 |
默认值 | LDAPOpCacheTTL 600 |
上下文 | 服务器配置 |
状态 | 扩展 |
模块 | mod_ldap |
指定操作缓存中条目保持有效的时长(以秒为单位)。默认值为 600 秒。
描述 | 在终止 LDAP 查询之前要追逐的最大推荐跳转次数。 |
---|---|
语法 | LDAPReferralHopLimit 数字 |
默认值 | SDK 依赖,通常在 5 到 10 之间 |
上下文 | 目录,.htaccess |
覆盖 | AuthConfig |
状态 | 扩展 |
模块 | mod_ldap |
此指令(如果由 LDAPReferrals
指令启用)限制在终止 LDAP 查询之前要追逐的推荐跳转次数。
LDAP SDK 中对此可调参数的支持并不常见。
描述 | 在查询 LDAP 服务器时启用推荐追逐。 |
---|---|
语法 | LDAPReferrals On|Off|default |
默认值 | LDAPReferrals On |
上下文 | 目录,.htaccess |
覆盖 | AuthConfig |
状态 | 扩展 |
模块 | mod_ldap |
兼容性 | 参数 default 在 Apache 2.4.7 及更高版本中可用 |
一些 LDAP 服务器将其目录划分为多个域,并使用推荐来指导客户端跨越域边界。这类似于 HTTP 重定向。LDAP 客户端库可能默认情况下会追逐推荐,也可能不会追逐推荐。此指令明确配置底层 SDK 中的推荐追逐。
LDAPReferrals
接受以下值
当设置为 "on" 时,底层 SDK 的推荐追逐状态将启用,LDAPReferralHopLimit
用于覆盖 SDK 的跳转限制,并且会注册 LDAP 重新绑定回调。
当设置为 "off" 时,底层 SDK 的推荐追逐状态将完全禁用。
当设置为 "default" 时,底层 SDK 的推荐追逐状态不会更改,LDAPReferralHopLimit
不会用于覆盖 SDK 的跳转限制,并且不会注册任何 LDAP 重新绑定回调。
指令 LDAPReferralHopLimit
与此指令协同工作,以限制在终止 LDAP 查询之前要追逐的推荐跳转次数。当推荐处理通过 "On" 值启用时,客户端凭据将通过重新绑定回调提供,用于任何需要它们的 LDAP 服务器。
描述 | 配置 LDAP 服务器重试次数。 |
---|---|
语法 | LDAPRetries 重试次数 |
默认值 | LDAPRetries 3 |
上下文 | 服务器配置 |
状态 | 扩展 |
模块 | mod_ldap |
服务器将重试失败的 LDAP 请求,最多重试 LDAPRetries
次。将此指令设置为 0 将禁用重试。
LDAP 错误(如超时和拒绝连接)是可重试的。
描述 | 配置 LDAP 服务器重试之间的延迟。 |
---|---|
语法 | LDAPRetryDelay 秒 |
默认值 | LDAPRetryDelay 0 |
上下文 | 服务器配置 |
状态 | 扩展 |
模块 | mod_ldap |
如果 LDAPRetryDelay
设置为非零值,则服务器将延迟重试 LDAP 请求,延迟时间为指定的时间。将此指令设置为 0 将导致任何重试都立即发生。
LDAP 错误(如超时和拒绝连接)是可重试的。
描述 | 设置共享内存缓存文件 |
---|---|
语法 | LDAPSharedCacheFile 目录路径/文件名 |
上下文 | 服务器配置 |
状态 | 扩展 |
模块 | mod_ldap |
指定共享内存缓存文件的目录路径和文件名。如果未设置,则如果平台支持,将使用匿名共享内存。
描述 | 共享内存缓存的大小(以字节为单位) |
---|---|
语法 | LDAPSharedCacheSize 字节 |
默认值 | LDAPSharedCacheSize 500000 |
上下文 | 服务器配置 |
状态 | 扩展 |
模块 | mod_ldap |
指定为共享内存缓存分配的字节数。默认值为 500kb。如果设置为 0,则不会使用共享内存缓存,每个 HTTPD 进程都会创建自己的缓存。
描述 | 指定 LDAP 搜索和绑定操作的超时时长(以秒为单位) |
---|---|
语法 | LDAPTimeout 秒 |
默认值 | LDAPTimeout 60 |
上下文 | 服务器配置 |
状态 | 扩展 |
模块 | mod_ldap |
兼容性 | Apache HTTP Server 2.3.5 及更高版本 |
此指令配置绑定和搜索操作的超时时长,以及底层 LDAP 客户端库中可用的 LDAP_OPT_TIMEOUT 选项。
如果超时到期,httpd 将重试,以防现有连接被防火墙静默丢弃。但是,如果防火墙配置为发送 TCP RST 数据包而不是静默丢弃数据包,则性能会好得多。
ldap 比较操作的超时需要具有 LDAP_OPT_TIMEOUT 的 SDK,例如 OpenLDAP >= 2.4.4。
描述 | 设置包含或引用每个连接客户端证书的文件。 |
---|---|
语法 | LDAPTrustedClientCert 类型 目录路径/文件名/昵称 [密码] |
上下文 | 目录,.htaccess |
状态 | 扩展 |
模块 | mod_ldap |
它指定在建立与 LDAP 服务器的 SSL 或 TLS 连接时使用的每个连接客户端证书的目录路径、文件名或昵称。不同的位置或目录可能具有自己的独立客户端证书设置。一些 LDAP 工具包(尤其是 Novell)不支持每个连接客户端证书,如果您尝试使用此指令,它们将引发 LDAP 服务器连接错误(对于 Novell 客户端证书,请改用 LDAPTrustedGlobalCert
指令 - 有关详细信息,请参阅上面的 SSL/TLS 证书指南)。类型指定正在设置的证书参数的类型,具体取决于所使用的 LDAP 工具包。支持的类型为
描述 | 设置包含全局受信任证书颁发机构或全局客户端证书的文件或数据库 |
---|---|
语法 | LDAPTrustedGlobalCert 类型 目录路径/文件名 [密码] |
上下文 | 服务器配置 |
状态 | 扩展 |
模块 | mod_ldap |
它指定了受信任的 CA 证书和/或系统范围的客户端证书的目录路径和文件名,mod_ldap
在建立与 LDAP 服务器的 SSL 或 TLS 连接时应使用。请注意,使用此指令指定的所有证书信息将全局应用于整个服务器安装。一些 LDAP 工具包(特别是 Novell)要求使用此指令全局设置所有客户端证书。大多数其他工具包要求使用 LDAPTrustedClientCert
在每个目录或每个位置设置客户端证书。如果设置错误,在尝试联系 LDAP 服务器时可能会记录错误,或者连接可能会静默失败(有关详细信息,请参阅上面的 SSL/TLS 证书指南)。类型指定正在设置的证书参数的类型,具体取决于所使用的 LDAP 工具包。支持的类型为
描述 | 指定连接到 LDAP 服务器时要使用的 SSL/TLS 模式。 |
---|---|
语法 | LDAPTrustedMode type |
上下文 | 服务器配置,虚拟主机 |
状态 | 扩展 |
模块 | mod_ldap |
支持以下模式
并非所有 LDAP 工具包都支持上述所有模式。如果模式不受支持,将在运行时记录错误消息,并且与 LDAP 服务器的连接将失败。
如果指定了 ldaps:// URL,则模式变为 SSL,并且会忽略 LDAPTrustedMode
的设置。