You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在supervisord中以fcgi-program运行gunicorn遇错误,如何解决?

问题描述

我尝试通过supervisord管理的socket运行gunicorn:

  • supervisord可管理socket,并通过stdin将文件描述符传递给子进程
  • gunicorn支持通过fd://FD格式的参数绑定到指定文件描述符

我写了一段脚本捕获stdin并传给gunicorn:

input=$(cat)
gunicorn seagull.ui.app:server -b "${input}"

但子进程日志报错:

[2022-07-26 09:34:35 +0100] [696696] [ERROR] Can't connect to ('0.0.0.0', 8000)
cat: -: Transport endpoint is not connected
[2022-07-26 09:34:38 +0100] [696731] [INFO] Starting gunicorn 20.1.0
[2022-07-26 09:34:38 +0100] [696731] [ERROR] Connection in use: ('0.0.0.0', 8000)
[2022-07-26 09:34:38 +0100] [696731] [ERROR] Retrying in 1 second.

请问如何配置才能正常工作?


解决方案

1. 直接让gunicorn绑定到stdin对应的文件描述符

supervisord的fcgi-program会将创建的socket绑定到子进程的stdin(即文件描述符0),你不需要用脚本读取stdin,直接让gunicorn绑定到fd://0即可,无需额外脚本:

gunicorn seagull.ui.app:server -b fd://0

2. 确保supervisord使用正确的配置段

必须使用[fcgi-program:x]配置段,而不是普通的[program:x],只有fcgi-program才会自动创建socket并将其文件描述符传递给子进程的stdin。示例配置:

[fcgi-program:gunicorn]
command=gunicorn seagull.ui.app:server -b fd://0
# 可选择TCP socket或Unix socket
socket=tcp://127.0.0.1:8000
# socket=/path/to/gunicorn.sock
process_name=%(program_name)s_%(process_num)02d
numprocs=1
autostart=true
autorestart=true
stdout_logfile=/var/log/supervisord/gunicorn.stdout.log
stderr_logfile=/var/log/supervisord/gunicorn.stderr.log

错误原因说明

  • 你之前的脚本用cat读取stdin是错误的:stdin是supervisord传递的socket文件描述符,不是文本流,cat尝试读取这个socket会触发"Transport endpoint is not connected"错误。
  • 由于input变量最终为空,gunicorn没有收到有效的-b参数,会默认绑定到0.0.0.0:8000,导致端口冲突或无法连接的报错。

内容的提问来源于stack exchange,提问作者Ben

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 01:06:26