Unix Domain Socket(UDS)因零网络栈开销、低延迟、高吞吐,成为Nginx多worker间高效IPC的优选方案;它规避TCP握手与协议处理,实测吞吐高20%–40%、延迟降50%以上,适用于限流共享、热重载通知等场景。

Nginx 默认采用多进程模型(一个 master 进程 + 多个 worker 进程),各 worker 之间默认无状态、不通信。若需进程间协作(如共享限流计数、缓存同步、信号通知等),直接使用文件锁、共享内存或第三方服务(Redis)虽可行,但存在性能开销或复杂度问题。此时,利用 Unix Domain Socket(UDS)在本地进程间建立低延迟、零网络栈开销的双向通信通道,是一种轻量且高效的选择。
为什么用 Unix Domain Socket 而不是 TCP localhost?
Unix Domain Socket 是内核提供的 IPC 机制,数据不经过网络协议栈,避免了 TCP 的三次握手、包头封装、校验、路由查找等开销。实测对比下,相同负载下 UDS 的吞吐可高出 20%–40%,延迟降低 50% 以上。尤其适合高频、小数据量的 worker 间通信(如每秒数千次的计数器更新)。
如何在 Nginx 中集成 UDS 通信?
Nginx 本身不原生支持 worker 间通过 UDS 主动收发消息,但可通过以下方式实现:
- 借助 Lua 模块(lua-nginx-module):在 init_worker_by_lua_block 中为每个 worker 创建独立的 UDS 客户端(或服务端),用 socket:connect("/tmp/nginx-ipc.sock") 连接统一的 IPC 中心;
- 自研 C 模块:在 worker 初始化时调用 socket(AF_UNIX, SOCK_STREAM, 0),bind/listen 一个固定路径(如 /var/run/nginx-ipc.sock),由 master 或专用 worker 充当 IPC broker;
- 复用 Nginx event loop:使用 ngx_event_connect_peer 等底层 API 注册 UDS fd 到 epoll,实现非阻塞读写,避免阻塞 worker。
典型应用场景与注意事项
常见实用场景包括:全局速率限制共享(替代 limit_req zone 的单 worker 局部性)、配置热重载通知(master 向所有 worker 发送 reload 指令)、健康检查结果广播(上游节点变更实时同步)。需注意:
- UDS 文件路径需有足够权限(worker 进程用户需对 socket 文件有读写权);
- 务必设置 SO_REUSEADDR 并处理连接异常(如 broker 崩溃后自动重连);
- 避免在 HTTP handler 中做阻塞 UDS I/O,应结合 cosocket 或异步回调;
- 不建议用 UDS 传递大块数据(>64KB),易触发内核缓冲区压力,优先走共享内存 + UDS 信号通知组合方案。
一个极简 IPC broker 示例(Python)
可起一个轻量 Python 进程监听 /tmp/nginx-ipc.sock,接收各 worker 的 JSON 消息(如 {"cmd":"inc","key":"api:/login","val":1}),聚合后广播或落盘。Nginx worker 用 Lua 发送请求并等待响应,整个流程毫秒级完成,无需引入外部依赖。

















