У меня есть небольшой 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?
Любая помощь приветствуется.