Проблемы с supervisord и monit с помощью gunicorn+gevent+pypy

У меня есть небольшой API для отдыха, построенный на python с использованием Falcon Framework, и он работает в виртуальной среде с помощью gunicorn + gevent и pypy 2.3 (я успешно установил пакеты pip из gevent@pypy-hacks и gevent-on-pypy/pypycore). Я хотел добавить «супервизор» для своего приложения, поэтому я сначала установил супервизор и выполнил шаги, чтобы запустить его.

Первое, что я сделал на сервере, это протестировал команду для запуска 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», установленным как команда выше, которую я успешно выполнил. Когда я попытался запустить 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?

Любая помощь приветствуется.


person Roland Pish    schedule 11.06.2015    source источник


Ответы (1)


Оказывается, переменная окружения GEVENT_LOOP уже экспортирована в мой /etc/environment следующим образом:

export GEVENT_LOOP=pypycore.loop

Так как для запуска gevent на pypy необходимы некоторые хаки, включая приведенный выше экспорт.

Но мне нужно было экспортировать его вручную в записи команды «start_program» Monit (в конце я придерживался 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'
person Roland Pish    schedule 11.06.2015