在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
相关产品推荐
相关产品推荐

