必须用upstream块定义UDS后端并启用keepalive,权限需满足属组一致、绝对路径、读写权限;proxy_pass须指向upstream名如http://uds_backend,不可直接写unix:/。

要让 Nginx 的 upstream 模块真正支持后端集群的 Unix Domain Socket(UDS)连接,核心不是“能不能写 unix:”,而是权限对齐、连接复用和配置层级是否正确。直接在 proxy_pass 里写 unix:/path 虽然能通,但无法做负载均衡、健康检查或连接池,也不符合集群语义。
必须用 upstream 块定义 UDS 后端
UDS 地址只能作为 server 指令的地址参数,不能出现在 proxy_pass 的 URI 部分:
- ✅ 正确:在
upstream中声明server unix:/run/app.sock; - ❌ 错误:在
location中写proxy_pass unix:/run/app.sock;(这绕过 upstream,不支持集群特性) - ❌ 错误:
proxy_pass http://unix:/run/app.sock或proxy_pass /(语法非法)
启用 keepalive 才算真正复用 UDS 连接
仅设 proxy_http_version 1.1 和 Connection '' 不够——upstream 层必须显式启用连接池,否则每次请求仍会新建/销毁 socket 文件描述符:
- 在
upstream块中添加keepalive 32;(推荐值 16–64,视 worker 数与并发而定) -
keepalive是每个 Nginx worker 进程维护的空闲连接上限,不是全局总数 - 若值太小(如 4),连接复用率低;太大(如 256)可能触达系统
fs.file-max或进程级ulimit -n限制
权限与路径必须严格满足
UDS 是文件系统对象,Nginx worker 进程需同时满足三项条件才能成功 connect:
- socket 文件路径必须为绝对路径(如
/run/myapp.sock),且父目录存在、可访问 - Nginx 启动用户(如
www-data或nginx)需对 socket 文件有读写权限(srw-rw----类型) - Nginx 用户与后端服务应同属一个组(例如都加入
app组),并确保 socket 创建时保留组写权限(避免被 umask 截断) - 建议将 socket 放在
/run/(tmpfs)下,避免磁盘 I/O 和临时文件清理干扰
location 中必须引用 upstream 名称
代理请求时,proxy_pass 必须指向 upstream 的名字,且协议前缀为 http://(即使后端是 UDS):
- ✅ 正确:
proxy_pass http://uds_backend;(uds_backend是 upstream 名) - ❌ 错误:
proxy_pass unix:/run/app.sock;(跳过 upstream,无集群能力) - 务必搭配:
proxy_http_version 1.1;和proxy_set_header Connection '';,防止后端因 HTTP/1.0 行为主动断连


















