【问题标题】:Issues with supervisord and monit with gunicorn+gevent+pypy使用 gunicorn+gevent+pypy 监控和监控的问题
【发布时间】:2015-06-11 04:53:13
【问题描述】:

我有一个使用 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 时我做错了什么吗?

非常感谢任何帮助。

【问题讨论】:

    标签: python supervisord pypy monit falconframework


    【解决方案1】:

    原来我的/etc/environment 中已经导出了环境变量 GEVENT_LOOP,如下所示:

    export GEVENT_LOOP=pypycore.loop
    

    由于要在 pypy 上运行 gevent,需要一些技巧,包括上述导出。

    但我需要在Monit的'start_program'命令入口中手动导出(最后我坚持使用Monit),所以得到的命令是:

    /bin/bash -c 'cd /path/to/project/api && export GEVENT_LOOP=pypycore.loop && /path/to/project/env/bin/gunicorn -c settings.py my-api:my_api'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-22
      • 2018-09-15
      • 2020-09-19
      • 1970-01-01
      相关资源
      最近更新 更多