我有一个使用 Falcon 框架在 python 中构建的小型 rest api,它在带有 gunicorn + gevent 和 pypy 2.3 的虚拟环境中运行(我从 gevent@pypy-hacks 和 gevent-on-pypy/pypycore 成功安装了 pip 包)。我想为我的应用程序添加一个“主管”,所以我首先安装了 supervisord 并按照步骤启动并运行它。
我在服务器做的第一件事就是测试启动api的命令;它运行成功,我可以毫无问题地使用 api。命令是:
/bin/bash -c 'cd /path/to/project/api && /path/to/project/env/bin/gunicorn -c settings.py my-api:my_api'
注意:在 settings.py 中我设置了参数daemon=False
,因为我看到主管要求命令在“前台”运行而不是守护进程。
一旦工作正常,我继续创建应用程序的/etc/supervisor/conf.d/my_api.conf
conf 文件,并将“command”参数设置为上面我成功运行的命令。当我尝试通过supervisord启动api时,失败了,在api的日志中,错误是:
Traceback (most recent call last):
File "/path/to/project/env/site-packages/gunicorn/arbiter.py", line 507, in spawn_worker
worker.init_process()
File "/path/to/project/env/site-packages/gunicorn/workers/ggevent.py", line 185, in init_process
self.patch()
File "/path/to/project/env/site-packages/gunicorn/workers/ggevent.py", line 74, in patch
_sock=s))
File "/path/to/project/env/site-packages/gevent/socket.py", line 240, in __init__
self.hub = get_hub()
File "/path/to/project/env/site-packages/gevent/hub.py", line 169, in get_hub
hub = _threadlocal.hub = hubtype(*args, **kwargs)
File "/path/to/project/env/site-packages/gevent/hub.py", line 268, in __init__
loop_class = _import(self.loop_class)
File "/path/to/project/env/site-packages/gevent/hub.py", line 198, in _import
return _import(path[-1])
File "/path/to/project/env/site-packages/gevent/hub.py", line 210, in _import
x = __import__(module)
ImportError: No module named gevent.core
所以,我很惊讶手动运行命令确实有效,但是当主管尝试运行它时,抛出了上述错误。
经过大量的尝试和错误,我决定安装 monit 以查看它是否可以监视我的 api,并且我确实设置成功,将“启动程序”参数指定为上述命令。
我很惊讶 monit 抛出了完全相同的错误。那么,这是否意味着我的 api(pypy + gunicorn + gevent)的性质阻止了它自己被周围的任何监控软件监控?
配置supervisord/monit时我做错了什么吗?
任何帮助是极大的赞赏。