Ответ 1
Я бы посмотрел что-то вроде Supervisor.
Я хочу создать Flask + Nginx + Gunicorn. У меня есть настройка и запуск Nginx, и я запускаю gunicorn, как описано в документах:
gunicorn app:app
Но когда я выхожу из сервера, выйдет процесс пушки? Каков правильный способ убедиться, что он остается включенным для Nginx для подключения к нему и перезапускается, если он сработает?
Я бы посмотрел что-то вроде Supervisor.
Используйте --daemon
во время запуска gunicorn. Пример:
gunicorn grand56.wsgi:application --name grand56 --workers 3 --user=root --group=root --bind=127.0.0.1:1001 --daemon
используйте --daemon для привязки команды gunicorn. например:
gunicorn --bind 0.0.0.0:8001 your_project.wsgi --daemon
Главное отметить, что при запуске процесса из командной строки это дочерний элемент вашего терминального процесса (то есть дочерний элемент bash
). Когда вы выходите из сервера, ваш процесс bash
завершается - как и все его дочерние элементы.
Вы хотите использовать любую имеющуюся у вас систему для управления nginx, также управляйте gunicorn (что-нибудь от init.d
или сценариев Upstart до специализированных мониторов процессов, таких как Monit, Supervisor, Bluepill, Foreman и т.д.)
Обратите внимание на Шона.
Однако вы можете запустить его на лету, как это:
nohup gunicorn -c config.py </dev/null >/dev/null 2>&1
, и он больше не будет зависеть от терминального соединения. Вы можете заменить >/dev/null
на что-то вроде >somelogfile
, если вы хотите сохранить любой вывод.
Но для использования в производстве лучше всего интегрировать его в любой инструмент, который вы используете для управления процессами.
Попробуйте следующее:
nohup gunicorn app:app &
Я попробовал опцию systemd, и она работала нормально, ссылка ниже содержит мой полный ответ и содержит все шаги, чтобы вызвать ваше приложение в качестве сервиса gunicorn.
https://askubuntu.com/questions/930589/running-upstart-script-on-17-04/1010398#1010398
Запуск обниматься, как это.
--daemon должен держать процесс в фоновом режиме.
--access-logfile для ведения журнала запросов
--bind = <ip>: <port> Предоставление IP разрешит доступ из других систем (если прокси не нужен).
gunicorn <pyscirpt_name>:__hug_wsgi__ --name caassist -w 4 --access-logfile /var/logs/gunicorn/gunicorn_access.log --daemon --bind=<ip>:<port>
Supervisor
- отличное кроссплатформенное решение для управления процессами. Он очень многофункциональный и (на мой взгляд) требует гораздо больше настроек, чем некоторые альтернативы vanilla Linux (upstart, sysv, systemd). Вам обязательно следует использовать что-то подобное для запуска, мониторинга и (при необходимости) перезапуска процесса.
Независимо от того, каким менеджером процессов вы в конечном итоге пользуетесь, вы все равно можете легко оставить gunicorn "запущенным неправильно" (то есть как пользователь root). Я думаю, что некоторые важные детали, оставленные другими ответами, заключаются в том, что вам, вероятно, нужен один (не-root) пользователь, владеющий процессом gunicorn, который связывается с сокетом unix, который принадлежит этому пользователю и группе nginx и имеет разрешения 770
. С помощью gunicorn
вы вместо этого задаете маску, поэтому инвертируйте 770
в 007
и используйте флаг -m
. Таким образом, только gunicorn и nginx могут читать/записывать/выполнять в сокет, и порт не требуется. Вы можете указать пользователя и группу вашего процесса gunicorn с флагами -u
и -g
, и он создаст сокет с этими владельцами. Что бы вы ни использовали для процесса mgmt, для nginx/gunicorn, вы, вероятно, захотите что-то вроде этого в своем скрипте запуска:
exec gunicorn wsgi:app -u gunicorn -g nginx -m 007 -b gunicorn.sock >> /var/log/$<service_name>.sys.log 2>&1
Убедитесь, что у пользователя gunicorn есть разрешение на запись в файл журнала. Затем в nginx, где у вас ранее был ip/порт (т.е. 0.0.0.0:5000
), вы указываете путь к сокету (т.е. /usr/share/nginx/html/gunicorn.sock
). Обратите внимание, что здесь я не использовал флаг --daemon
, но я использовал exec
, это предполагает наличие менеджера процессов, который будет запускать gunicorn как дочерний процесс с exec
.
Вы можете найти все различные флаги здесь.