Supervisor — это инструмент мониторинга, который контролирует различные дочерние процессы и управляет запуском / перезапуском этих дочерних процессов, когда они внезапно завершаются или завершаются по некоторым причинам. Он может быть расширен для управления процессами через API-интерфейс XML-RPC через удаленные местоположения без входа на сервер. Я расскажу о API XML-RPC во второй части этой серии из двух частей.
В первой части этой серии руководств я расскажу вам, как настроить Supervisor для работы с нашим приложением. Для этого я создам тривиальное приложение во Flask вместе с Gunicorn, чтобы действовать в качестве нашего HTTP-сервера WSGI.
Я предполагаю, что у вас есть общее представление о лучших методах настройки Flask, Gunicorn и среды, использующих virtualenv, которым необходимо следовать при разработке приложения Python.
Установка пакетов
Следующие пакеты должны быть установлены для разработки и управления приложением, которое мы будем разрабатывать.
1
|
$ pip install gunicorn supervisor Flask
|
Тривиальное приложение
Сейчас я создам тривиальное приложение во Flask. Это небольшое приложение, но оно удовлетворит потребности этого урока.
Ниже приведена структура приложения:
1
2
3
4
|
flask_app/
my_app/
— __init__.py
— views.py
|
flask_app / my_app / __ init__.py
1
2
3
4
|
from flask import Flask
app = Flask(__name__)
import my_app.views
|
В приведенном выше файле приложение было настроено и инициализировано.
flask_app / my_app / views.py
1
2
3
4
5
|
from my_app import app
@app.route(‘/’)
def hello_world():
return ‘Hello to the World of Flask!’
|
В приведенном выше файле я создал простую конечную точку Hello World.
Чтобы запустить приложение как процесс, мы можем использовать Gunicorn. Чтобы проверить, работает ли Gunicorn должным образом, просто запустите следующую команду из папки приложения.
1
|
$ gunicorn -w 4 -b 127.0.0.1:8000 my_app:app
|
После этого укажите ваш браузер на http://127.0.0.1:8000/, чтобы увидеть домашнюю страницу приложения.
Настройка и использование Supervisor
Теперь нам нужно сделать то же самое, используя Supervisor, чтобы он работал как демон и контролировался самим Supervisor, а не вмешательством человека.
Прежде всего, нам нужен файл конфигурации Supervisor. По умолчанию Supervisor ищет папку etc
которой есть файл с именем supervisord.conf
. В общесистемных установках это папка /etc/
, а в virtualenv она будет искать папку etc
в virtualenv, а затем вернуться к /etc/
.
В случае общесистемной установки выполните:
1
|
$ echo_supervisord_conf > /etc/supervisord.conf
|
В случае virtualenv из корневой папки virtualenv выполните:
1
|
$ echo_supervisord_conf > etc/supervisord.conf
|
Программа echo_supervisord_conf
предоставляется супервизором; он печатает образец файла конфигурации в указанное место. Это создаст файл с именем supervisord.conf
в месте, указанном в приведенной выше команде.
Чтобы настроить Supervisor для нашего приложения, добавьте в этот файл следующий блок:
1
2
3
4
5
6
7
8
|
[program:supervisor_demo]
command=<path/to/virtualenv>/bin/gunicorn -w 4 -b 127.0.0.1:8000 my_app:app
directory=<path/to/virtualenv>/supervisor-tutsplus-demo
user=someuser # Relevant user
autostart=true
autorestart=true
stdout_logfile=/tmp/app.log
stderr_logfile=/tmp/error.log
|
Здесь мы настраиваем команду, которая должна быть запущена и из какого каталога она должна быть сделана под каким пользователем. Также указано, следует ли перезапустить приложение в случае любого сбоя. Расположение файлов журнала также может быть указано. Существует множество других параметров конфигурации, которые можно найти в официальной документации Supervisor.
Обратите внимание, что никогда не следует запускать приложения от имени пользователя root. Это огромный недостаток безопасности при сбое приложения, который может нанести вред самой ОС.
Чтобы запустить приложение с помощью Supervisor, выполните следующие команды:
1
2
3
|
$ supervisord
$ supervisorctl status
supervisor_demo RUNNING pid 22550, uptime 0:00:04
|
Первая команда вызывает supervisord
сервер, а следующая — состояние всех дочерних процессов.
Каждый раз, когда вы вносите изменения в свое приложение, а затем хотите перезапустить Gunicorn, чтобы оно отразило изменения, выполните следующую команду:
1
|
$ supervisorctl restart all
|
Вы также можете задать конкретные процессы вместо перезапуска всего:
1
|
$ supervisorctl restart supervisor_demo
|
Supervisor также предоставляет интерфейс веб-интерфейса, который можно включить, включив inet_http_server
конфигурации inet_http_server
в supervisord.conf
. Этот веб-интерфейс можно найти по адресу http: // localhost: 9001 / .
Вывод
В этом руководстве мы увидели, как настроить Supervisor и использовать его для запуска приложения в качестве процесса-демона и коллективного или выборочного управления процессами. Во второй части этой серии руководств мы увидим, как управлять и запрашивать Supervisor и его программы / процессы с помощью API-интерфейса XML-RPC.