#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