nginx stream模块代理ldap实现高可用需四层透传、健康兜底与连接可控:启用with-stream模块,同级配置stream块,upstream轮询后端,分别监听389/636端口并设置短超时与ssl透传,加强访问控制与日志可观测性。

用 Nginx stream 模块代理原生 LDAP 协议实现高可用,关键在于四层透传、后端健康兜底和连接可控,不是改协议,而是稳转发。
确认 stream 模块已启用
这是前提,缺一不可:
- 执行 nginx -V 2>&1 | grep with-stream,有输出才说明模块已编译进二进制
- 若无结果,需重新编译 Nginx,添加 --with-stream(推荐同时加 --with-stream_ssl_module,后续支持 LDAPS)
- 主配置文件顶部必须显式加载:load_module modules/ngx_stream_core_module.so;
- stream 块必须与 http 块同级,不能嵌套在 http 内
配置 upstream 实现多节点负载与故障转移
LDAP 协议本身无会话粘性要求,但要注意:部分客户端或域控在 bind 后会复用连接,建议启用简单轮询+连接探测,避免单点失效影响认证流:
- 定义 upstream,列出所有 OpenLDAP 主节点(如三主部署:192.168.1.11:389、192.168.1.12:389、192.168.1.13:389)
- 可加 max_fails=2 fail_timeout=30s,让 Nginx 自动摘除连续失败的后端
- 不建议配 weight 或 ip_hash,LDAP 是无状态查询为主,均衡即可
监听并透传 LDAP 与 LDAPS 流量
分别处理明文 389 端口和加密 636 端口,后者需证书透传(Nginx 不终止 TLS,只做字节流转发):
- 389 端口 server 块:listen 389; + proxy_pass ldap_backend; + proxy_timeout 1s;(LDAP 响应快,超时宜短)
- 636 端口 server 块:listen 636 ssl;,指定证书路径;ssl_certificate 和 ssl_certificate_key 必须存在且可读
- LDAPS 下 proxy_pass 仍指向同一 upstream,Nginx 不解密,TLS 由后端 LDAP 服务终结
增强接入层安全性与可观测性
代理层虽不处理业务逻辑,但能有效收敛暴露面:
- 配合 iptables 或 realip 模块限制仅允许跳板机或应用网段访问 Nginx 的 389/636 端口
- 开启 proxy_responses 1 可防止空响应导致客户端 hang 住
- 日志方面,stream 模块支持 log_format 和 access_log,记录 client_addr、upstream_addr、session_time 等字段,便于排查连接异常
- 可搭配 keepalive 连接池(proxy_socket_keepalive on;)减少后端新建连接压力
不复杂但容易忽略:后端 OpenLDAP 多主节点之间必须已配置好 syncrepl 或 MMR,Nginx stream 只负责流量分发,不解决数据一致性问题。











