直接用 proxy_pass 指向本地 Unix Domain Socket(UDS)是消除 TCP/IP 协议栈开销最有效的方式——数据在内核内存中直传,不封包、不解包、不校验、不路由;但需严格满足路径格式(unix:/abs/path;)、权限闭环(660+属组一致)、upstream keepalive 复用(如 keepalive 32)及后端主动监听 UDS 四项条件。

直接用 proxy_pass 指向本地 Unix Domain Socket(UDS)是消除 TCP/IP 协议栈开销最有效的方式——数据在内核内存中直传,不封包、不解包、不校验、不路由。但想真正提速,不能只改一行配置,得让路径、权限、连接复用和后端四者严丝合缝。
UDS 路径写法必须严格合规
Nginx 对 UDS 地址格式有硬性校验,错一个字符就 502 或启动失败:
- ✅ 正确写法:
proxy_pass unix:/run/myapp.sock;(unix:开头 + 绝对路径 + 分号结尾) - ❌ 错误写法:
proxy_pass http://unix:/run/myapp.sock;(Nginx 报invalid URL prefix) - ❌ 错误写法:
proxy_pass /run/myapp.sock;(被当域名解析,连不上) - 路径中不能含空格、
~、变量(如$socket_path)、相对路径(如./sock)或中文
权限与文件系统位置要闭环匹配
Nginx worker 进程必须能“进目录、看 socket、读写它”,三者缺一不可:
⚠️ 已弃用 — 该技能已拆分为两个独立技能,以提升模块化程度:**webchat-https-proxy**(HTTPS/WSS 反向代理)和 **webchat-voi...**
- socket 文件权限设为
srw-rw----(即660),属主和属组都需包含 Nginx 运行用户(如www-data或nginx) - 父目录(如
/run/)必须对 Nginx 用户有x权限(允许进入),/run/是首选位置——它是 tmpfs 内存文件系统,无磁盘 I/O、不被系统清理 - 启动前可用命令验证:
sudo -u www-data ls -l /run/myapp.sock,确保显示可读可写 - 避免放在
/tmp/,尤其不能含空格或特殊字符
必须通过 upstream 启用 keepalive 连接复用
不复用连接,每次请求都新建销毁 UDS,性能优势几乎归零:
- 定义 upstream 块:
upstream backend { server unix:/run/myapp.sock; keepalive 32; } - location 中写:
proxy_pass http://backend;(注意是http://+ upstream 名,不是unix:) - 配套启用 HTTP/1.1 长连接:
proxy_http_version 1.1;和proxy_set_header Connection ''; -
keepalive 32表示每个 worker 进程最多缓存 32 个空闲连接;建议从 16 或 32 开始压测,过高易耗尽文件描述符
后端服务要主动适配 UDS 生命周期
单边优化无效,后端必须配合监听、权限设置和启动顺序:
- 后端(如 Gunicorn、Uvicorn、Express)必须显式监听 UDS 路径,而非
127.0.0.1:8000 - Gunicorn 示例参数:
--bind unix:/run/myapp.sock --chmod-socket=660 --umask=007 - 确保后端先于 Nginx 启动;systemd 中可通过
After=nginx.service控制顺序 - 异常退出后 socket 可能残留,启动脚本中加清理逻辑:
rm -f /run/myapp.sock

















