Супервайзер не работает с Gunicorn + Flask

Я пытаюсь запустить Gunicorn из Supervisor в системе Ubuntu 12.04. Gunicorn запускает приложение Flask (простой веб-сервис REST, протестированный на встроенном сервере Flask). Я установил Gunicorn, клонировав репозиторий GIT, пытаясь избежать «apt-get install», потому что он запускает сервер Gunicorn при его установке. Я не хочу, чтобы он работал, он будет запускаться только супервизором.

Итак, после установки, если я попытаюсь:

cd /usr/local/bin
gunicorn my_app:app -c /path/to/gu_config_file

Гуникорн работает. Тогда я убиваю его. Обратите внимание на файл конфигурации без расширения, потому что с расширением «.py» у меня не работает. Поэтому я редактирую файл конфигурации супервизора, например:

[program:gunicorn]
command=/usr/local/bin/gunicorn my_app:app -c /path/to/.gu_setup
directory=/usr/local/bin/
autostart=true
autorestart=true
redirect_stderr=True

И обновить изменения в Supervisor:

supervisorctl reread
# gunicorn: changed
supervisorctl update
# gunicorn: stopped
# gunicorn: updated process group

Обнаруживает изменения в файле и работает с программой Gunicorn. Хорошо, но затем я пытаюсь запустить его:

supervisorctl start gunicorn

Получение раздражающего:

gunicorn: ERROR (abnormal termination)

Проверка журнала супервайзера:

2013-03-08 13:07:22,378 INFO spawned: 'gunicorn' with pid 3355
2013-03-08 13:07:22,916 INFO exited: gunicorn (exit status 3; not expected)
2013-03-08 13:07:23,918 INFO spawned: 'gunicorn' with pid 3361
2013-03-08 13:07:24,492 INFO exited: gunicorn (exit status 3; not expected)
2013-03-08 13:07:26,496 INFO spawned: 'gunicorn' with pid 3367
2013-03-08 13:07:27,078 INFO exited: gunicorn (exit status 3; not expected)
2013-03-08 13:07:30,085 INFO spawned: 'gunicorn' with pid 3373
2013-03-08 13:07:30,628 INFO exited: gunicorn (exit status 3; not expected)
2013-03-08 13:07:31,630 INFO gave up: gunicorn entered FATAL state, too many start retries too quickly

Я не знаю, что делать прямо сейчас... Вы можете мне помочь? Большое спасибо!

РЕДАКТИРОВАТЬ: извините, я забыл сказать, что экспортировал переменную PYTHONPATH как:

export PYTHONPATH=/usr/local/bin:/usr/local/lib/project

'my_app' находится в /usr/local/bin. Путь к lib необходим для других модулей. Я также отредактировал файл конфигурации Supervisor, чтобы указать переменную среды, например:

environment=PYTHONPATH=/usr/local/bin:/usr/local/lib/project/

Но не работал.

РЕДАКТИРОВАТЬ 2: как предлагает @robertklep в своем комментарии, это вывод журнала:

Traceback (most recent call last):
  File "/tmp/gunicorn/gunicorn/arbiter.py", line 485, in spawn_worker
    worker.init_process()
  File "/tmp/gunicorn/gunicorn/workers/base.py", line 100, in init_process
    self.wsgi = self.app.wsgi()
  File "/tmp/gunicorn/gunicorn/app/base.py", line 103, in wsgi
    self.callable = self.load()
  File "/tmp/gunicorn/gunicorn/app/wsgiapp.py", line 25, in load
    return util.import_app(self.app_uri)
  File "/tmp/gunicorn/gunicorn/util.py", line 369, in import_app
    __import__(module)
  File "/usr/local/bin/my_app.py", line 4, in <module>
    import const
ImportError: No module named const
2013-03-08 13:29:35 [3670] [INFO] Worker exiting (pid: 3670)
2013-03-08 13:29:36 [3665] [INFO] Shutting down: Master
2013-03-08 13:29:36 [3665] [INFO] Reason: Worker failed to boot.

Модуль 'const' находится в /usr/local/lib/project...


person Alberto Megía    schedule 08.03.2013    source источник


Ответы (2)


Я не вижу, чтобы вы устанавливали среду в файле конфигурации вашего супервизора:

[program:gunicorn]
environment=PYTHONPATH=/usr/local/bin:/usr/local/lib/project
command=/usr/local/bin/gunicorn my_app:app -c /path/to/.gu_setup
...

Если это не сработает, попробуйте запустить gunicorn в режиме отладки:

command=/usr/local/bin/gunicorn --debug --log-level debug my_app:app -c /path/to/.gu_setup

Или пройдите путь прямо к гуникорну:

command=/usr/local/bin/gunicorn --pythonpath /usr/local/bin,/usr/local/lib/project my_app:app -c /path/to/.gu_setup

EDIT: --pythonpath gunicorn не работает, вы можете передать только один каталог:

command=/usr/local/bin/gunicorn --pythonpath /usr/local/lib/project my_app:app -c /path/to/.gu_setup
person robertklep    schedule 08.03.2013
comment
Да, я сделал это и редактировал свой вопрос в то же время, когда вы мне отвечали... извините! Я делаю то, что вы сказали, подождите! :) - person Alberto Megía; 08.03.2013
comment
Итак, он говорит мне, что не может найти модуль «const», но он находится в /usr/local/lib/project, добавлен в среду в файле конфигурации Supervisor... - person Alberto Megía; 08.03.2013
comment
То же самое: нет модуля с именем 'const'. Но он есть, он тоже скомпилирован python! (появился файл pyc). Я думаю, что это проблема с компакт-диском Supervisor, потому что я могу запустить его с помощью Gunicorn, только самостоятельно установив PYTHONPATH... - person Alberto Megía; 08.03.2013
comment
Чтение документа Supervisor: подпроцессы наследуют среду оболочки, используемой для запуска программы supervisord. Никакая оболочка не выполняется супервизором при запуске подпроцесса, поэтому переменные среды, такие как USER, PATH, HOME, SHELL, LOGNAME и т. д., не изменены по сравнению со значениями по умолчанию или иным образом переназначены. и Если вам нужно установить переменные среды для конкретной программы, которые в противном случае могли бы быть установлены вызовом оболочки для конкретного пользователя, вы должны сделать это явно в параметре конфигурации environment=program. (supervisord.org/subprocess.html#subprocess-environment) - person Alberto Megía; 08.03.2013
comment
Я просто заметил, что --pythonpath пушечного рога действительно может быть сломан. Попробуйте установить только --pythonpath /usr/local/lib/project. - person robertklep; 08.03.2013
comment
Я думаю, что это сработало, но мне нужно проверить это на чистой машине. Я скажу это вам, чтобы вы могли отредактировать свой ответ, и я отмечу это! Большое спасибо @robertklep - person Alberto Megía; 08.03.2013
comment
Настройка --pythonpath /path/to/project решила мою проблему. Спасибо! - person Greg Wang; 21.11.2013

Нет необходимости передавать --pythonpath. Если у вас работает virtuanenv вы ставите add где находится gunicorn. Пример:

command=/home/virtualenv/bin/gunicorn application:app -c /home/virtualenv/deploy/gunicorn.conf.py

И каталог, когда код Flask, пример:

directory=/home/virtualenv/myapp

Помните, что пользователь root!

user=root
person user2389644    schedule 20.09.2013