使用 Unix Domain Socket(UDS)可显著降低 Nginx 与后端通信延迟,P99 延迟降 50% 以上、吞吐提升 20%–40%;需严格遵循 unix:/run/myapp.sock 格式,确保权限(660)、路径(/run/)、keepalive 上游配置及后端协同监听。

直接用 proxy_pass 指向本地 Unix Domain Socket(UDS)是消灭网络栈耗时最有效的办法——它让 Nginx 和后端进程在内核态直连,不走 TCP/IP 协议栈,省掉三次握手、包头封装、校验、缓冲区拷贝等全部开销。实测高并发小请求场景下,P99 延迟可降 50% 以上,吞吐提升 20%–40%。
路径写法必须精准无误
UDS 路径不是普通文件路径,Nginx 对格式有硬性要求:
-
必须以
unix:开头 + 绝对路径,例如:proxy_pass unix:/run/myapp.sock; - 不能加
http://前缀(http://unix:/...是非法语法,报 invalid URL prefix) - 不能省略
unix:(proxy_pass /run/myapp.sock;会被当域名解析,直接 502) - 路径中不能含空格、中文、波浪号(
~)、变量或相对路径(如./sock或../sock)
权限与文件系统位置要闭环对齐
UDS 是文件系统对象,Nginx worker 进程必须能“走进去、摸得到、读得动”:
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
- socket 文件本身权限建议设为
srw-rw----(即660),属主和属组需包含 Nginx worker 用户(如www-data或nginx) - 所有父目录(如
/run/)必须对 Nginx 用户有 x(执行)权限,否则连目录都进不去 - 推荐把 socket 放在
/run/(tmpfs 内存文件系统),避免磁盘 I/O 和系统自动清理干扰;不要放/tmp/,尤其不能含空格或特殊字符 - 启动前手动验证:
sudo -u www-data ls -l /run/myapp.sock,确保可读可写
必须启用 keepalive 连接复用
不复用连接,每次请求都新建销毁 UDS,性能优势几乎归零:
- 定义
upstream块并显式开启keepalive:upstream backend { server unix:/run/myapp.sock; keepalive 32; } -
proxy_pass必须指向该 upstream 名:proxy_pass http://backend;(不是unix:/...) - 配套启用 HTTP/1.1 长连接:
proxy_http_version 1.1;和proxy_set_header Connection ''; -
keepalive值建议从 16 或 32 开始压测,过高易耗尽文件描述符;它表示每个 worker 进程维护的空闲连接池大小
后端服务要协同管理 socket 生命周期
UDS 性能释放依赖后端配合,单边优化无效:
- 后端(如 Gunicorn、Uvicorn、FastAPI)必须监听 UDS 文件路径,而非
127.0.0.1:8000 - 启动时显式设置权限,例如 Gunicorn 加参数:
--chmod-socket=660 --umask=007 - 确保后端先于 Nginx 启动;若顺序不可控,用 systemd 的
After=nginx.service或 socket 激活机制(systemd socket unit) - 异常退出后 socket 文件可能残留,启动脚本中应加清理逻辑:
rm -f /run/myapp.sock

















