Как демонизировать приложение Flask?

#python #flask

#python #flask

Вопрос:

У меня есть небольшое приложение, написанное на Python с использованием Flask. Прямо сейчас я запускаю его под nohup, но я хотел бы демонизировать его. Каков правильный способ сделать это?

Ответ №1:

Существует несколько способов развертывания проекта Flask. Развертывание с помощью gunicorn может быть самым простым, установите gunicorn, а затем:

 gunicorn project:app --daemon
  

Хотя вы, вероятно, захотите использовать supervisor или что-то в этом роде для мониторинга gunicorn (по крайней мере, используйте --pid , чтобы вы могли легко перезаряжать / останавливать gunicorn).

Ответ №2:

Я запускаю centos с systemd, работающим для всех моих других сервисов. Итак, я использовал то же самое для своего приложения flask

Создайте скрипт sh со всеми моими настройками Flask

 #!/bin/bash
# flask settings
export FLASK_APP=/some_path/my_flask_app.py
export FLASK_DEBUG=0

flask run --host=0.0.0.0 --port=80
  

Сделайте этот скрипт исполняемым

chmod x path/of/my/script.sh

Добавьте службу systemd для вызова этого скрипта

/etc/systemd/system/
vim flask.service

 [Unit]
Description = flask python command to do useful stuff

[Service]
ExecStart = path/of/my/script.sh

[Install]
WantedBy = multi-user.target
  

Чтобы завершить, включите его при загрузке

systemctl включить flask.service

Дополнительная информация о systemd:https://www.tecmint.com/create-new-service-units-in-systemd

Ответ №3:

Если у вас уже установлен supervisor, я думаю, gunicorn был бы немного излишним. Ниже приведен файл flask.ini, который можно поместить в /etc/supervisorord.d / (затем «supervisorctl reload», чтобы перезагрузить конфигурацию и запустить процесс).

 command=/opt/flask/env0/bin/python /opt/flask/developer/FlaskWebServer.py
directory=/opt/flask
redirect_stderr=true
startsecs=5
autorestart=true
stdout_logfile=/opt/flask/flask.stdout.log
  

Комментарии:

1. Обратите внимание, что при этой настройке вы используете встроенный сервер Flask, который плохо масштабируется.

Ответ №4:

Если вы хотите контролировать его и сохранять постоянство при перезагрузках, вы могли бы использовать immortal

Вы могли бы назвать это так:

проект immortal -l / var /log/your-app gunicorn: приложение

Или, например, через run.yml:

 cmd: gunicorn project:app
cwd: /path/of/project
env:
    DEBUG: 1
    ENVIRONMENT: production
 log:
    file: /var/log/app.log
    age: 86400 # seconds
    num: 7     # int
    size: 1    # MegaBytes
    timestamp: true # will add timesamp to log
 stderr:
    file: /var/log/app-error.log
    age: 86400 # seconds
    num: 7     # int
    size: 1    # MegaBytes
    timestamp: true # will add timesamp to log
 user: www
  

Подробнее о immortal:https://immortal.run/about