nginx的server块支持listen unix:/path/to/socket语法直接监听unix domain socket(uds),用于本地高效通信,需绝对路径、正确权限(如/run/myapp.sock,nginx用户可写),不支持ssl,客户端须用curl --unix-socket等工具访问。

Nginx 的 server 块支持监听 Unix Domain Socket(UDS),这在本地进程间高效通信场景中非常实用,尤其适合反向代理到本地 FastCGI、PHP-FPM 或其他 Unix socket 服务(如 Node.js、Gunicorn)时减少 TCP 开销。
server 块直接监听 UDS 是可行的,但需注意:它不是常见用法;绝大多数情况下,UDS 用于 upstream 或 fastcgi_pass 等后端转发,而非 listen 指令本身。不过 Nginx 确实支持 listen unix:/path/to/socket,可用于暴露 HTTP 服务 via socket(例如容器内通信、无网络栈环境)。
server 块 listen unix socket 的写法
`listen` 指令可直接指定 Unix socket 路径,语法简洁:server {
listen unix:/run/myapp.sock;
server_name localhost;
location / {
root /var/www/html;
index index.html;
}
}
关键点:
- 路径必须是绝对路径(如
/run/myapp.sock,不能是./myapp.sock或tmp/myapp.sock) - Nginx 主进程必须对该路径有读写权限(通常需属主为
nginx或www-data,目录权限755,socket 文件权限660) - 推荐使用
/run/(tmpfs 内存文件系统),避免磁盘 I/O 和临时文件清理风险;不建议用/tmp/ - 不支持
http://前缀,也不带端口或协议名 —— 就是纯unix:/path
与 TCP listen 的行为差异
- **无 IP/端口绑定**:不走网络协议栈,不占用端口,不涉及 `server_name` 的 Host 匹配逻辑(因为没有 HTTP Host header 传输机制?错 —— 实际上 UDS 上的 HTTP 请求仍含 Host 头,Nginx 仍会按 `server_name` 匹配) - **默认无 default_server 自动降级**:若多个 `server` 块监听同一 UDS 路径,Nginx 启动会报错(“duplicate listen”),不允许冲突 - **不支持 SSL 直接启用**:`listen unix:/path ssl;` 语法非法 —— Unix socket 无法承载 TLS 握手,SSL 只能用于 `listen 443 ssl` 这类 TCP 场景实际部署注意事项
- socket 文件由 Nginx 在启动时自动创建(如果父目录存在且权限正确),若已存在旧 socket,需确保被正确清理(否则可能 bind 失败) - systemd 等初始化系统常配合 `Socket=` 单元预创建 socket 并设置权限,Nginx 可继承 - 客户端访问需用支持 UDS 的工具,例如: - curl:`curl --unix-socket /run/myapp.sock http://localhost/` - 浏览器无法直连 UDS,必须通过 TCP proxy 中转(如 socat) - 日志中 client 地址显示为 `unix:` 或 `127.0.0.1`(取决于底层实现),不可依赖 `$remote_addr` 做访问控制 —— 更推荐用 `auth_request` 或上游鉴权常见错误与修复
- `bind() to unix:/run/myapp.sock failed (13: Permission denied)` → 检查 `/run/` 目录属组是否包含 `nginx` 用户,或添加 `user nginx;` 并确保 `nginx` 用户能写入该路径 - `open() "/run/myapp.sock" failed (2: No such file or directory)` → 父目录 `/run` 存在但子目录缺失?确保 `/run/myapp/` 存在,或改用 `/run/myapp.sock`(Nginx 会尝试创建文件,但不会建父目录) - 配置生效后无法访问 → 确认客户端使用 `--unix-socket` 参数;检查 SELinux/AppArmor 是否拦截(如 `setsebool -P nginx_can_network_connect 1`)不复杂但容易忽略权限和路径语义。











