unix socket反向代理需严格配置:路径以unix:开头、权限660且nginx用户属组、/run/目录存放、upstream+keepalive复用连接、后端监听uds并设chmod-socket。

直接用 proxy_pass 指向 Unix Socket(UDS)是单机反向代理最高效的通信方式,核心优势在于绕过 TCP/IP 协议栈、减少系统调用和上下文切换。但性能提升的前提是配置精准——错一个字符或漏一项权限,就可能返回 502 或 Permission denied。
socket 路径写法必须严格合规
Unix Socket 不是普通文件路径,Nginx 对其格式有硬性要求:
- 必须以
unix:开头,后接绝对路径,中间不能有空格:✅proxy_pass unix:/run/myapp.sock; - 不能加
http://前缀:❌proxy_pass http://unix:/run/myapp.sock;(报 invalid URL prefix) - 不能省略
unix::❌proxy_pass /run/myapp.sock;(被当作域名处理) - 路径不能是相对路径、不能含
~、$变量或空格,也不支持 URL 编码以外的特殊字符
权限与文件位置要同时满足
UDS 是文件系统对象,Nginx worker 进程需具备完整访问链权限:
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
- socket 文件本身需存在,类型为
srw-rw----(即带s标志的 socket),权限建议设为660 - Nginx worker 用户(如
www-data或nginx)必须属于 socket 所属组,或直接是属主 - 父目录(如
/run/)必须对 Nginx 用户有x权限(允许进入),否则连目录都进不去 - 推荐将 socket 放在
/run/(tmpfs 内存文件系统),避免磁盘 I/O 和系统自动清理干扰
必须配合 upstream + keepalive 复用连接
不启用连接复用,每次请求都新建/销毁 socket,UDS 的低开销优势几乎归零:
- 定义 upstream 块,显式启用
keepalive:upstream backend {<br> server unix:/run/myapp.sock;<br> keepalive 32;<br>} - location 中引用该 upstream 名:
proxy_pass http://backend;(不是unix:/...) - 配套设置 HTTP/1.1 长连接:
proxy_http_version 1.1;和proxy_set_header Connection ''; -
keepalive值建议 16–64;过小复用率低,过大易耗尽文件描述符
后端服务需协同监听并管理 socket 生命周期
UDS 性能释放依赖后端配合:
- 后端(如 Gunicorn、Uvicorn、FastAPI)必须监听 UDS 文件路径,而非
127.0.0.1:8000 - 启动时显式设置 socket 权限,例如 Gunicorn 加参数:
--chmod-socket=660 --umask=007 - 确保后端先于 Nginx 启动,或用 systemd 的
After=nginx.service控制顺序 - 异常退出后 socket 文件可能残留,建议在启动脚本中加清理逻辑:
rm -f /run/myapp.sock










