直接用 Unix Domain Socket(UDS)代替 127.0.0.1:端口可跳过 TCP/IP 协议栈,彻底消除本地回路开销;关键需路径、权限、协议写法和连接复用四点全部对齐:必须用绝对路径+http://unix:前缀,Nginx worker 需对 socket 文件具备读写权限,须通过 upstream 定义 keepalive 连接池,并配齐 HTTP/1.1 及 Host 等必要头部。

直接用 Unix Domain Socket(UDS)代替 127.0.0.1:端口,就能跳过整个 TCP/IP 协议栈,不握手、不封包、不校验、不走网络缓冲区——这是消灭本地回路开销最彻底的方式。关键不在“加个配置”,而在路径、权限、协议写法和连接复用四点全部对齐。
必须用绝对路径 + 正确协议前缀
UDS 是文件,不是网络地址,Nginx 对格式极其敏感:
- ✅ 正确写法:
proxy_pass http://unix:/var/run/myapp.sock;(http://unix:是完整协议标识,路径必须绝对) - ❌ 错误写法:
proxy_pass unix:/var/run/myapp.sock;(缺http://,Nginx 无法识别为 HTTP 后端) - ❌ 错误写法:
proxy_pass /var/run/myapp.sock;(会被当作相对 URI 重写,不是 socket 连接) - 路径中不能含
~、$document_root或中文/空格;/tmp/不推荐,优先用/run/(tmpfs,无磁盘 I/O)
权限必须让 Nginx worker 进程可读写
UDS 文件本质是带特殊权限的 socket 文件(类型 srw-rw----),权限错就直接报 (13: Permission denied):
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
- 后端服务(如 Gunicorn、Uvicorn)启动时,应以与 Nginx 相同用户运行(如
www-data),或显式设属组为 Nginx 用户组,并开启组写权限 - 检查命令:
ls -l /var/run/myapp.sock,确认属组正确、且权限包含rw(如srw-rw----) - 避免残留:后端启动脚本中加入
rm -f /var/run/myapp.sock,防止异常退出后文件卡住
启用 keepalive 复用连接,避免每次新建 socket
默认情况下,Nginx 每次请求都新建并关闭 UDS 连接——这会抵消一半性能收益。必须用 upstream 块配合 keepalive:
- 定义 upstream:
upstream backend {<br> server unix:/var/run/myapp.sock;<br> keepalive 32;<br>} - location 中使用:
proxy_pass http://backend; - 必须配套:
proxy_http_version 1.1;和proxy_set_header Connection '';,否则长连接无法生效 -
keepalive 32表示每个 worker 进程最多缓存 32 个空闲连接,建议从 16 起步,压测后调整
补全 Host 头并清理干扰 header
UDS 转发时,Nginx 默认的 $proxy_host 为空,会导致后端收不到 Host,常见于 Flask/FastAPI 等框架路由失败:
- 显式设置:
proxy_set_header Host $host;(不是$proxy_host) - 保留必要转发头:
X-Real-IP、X-Forwarded-For、X-Forwarded-Proto - 避免 header 污染:若复用连接,旧请求的 header 可能残留,可通过
proxy_buffering off;或升级到 Nginx 1.21+ 启用proxy_http_version 1.1自动处理

















