Статьи

Мониторинг и управление приложениями с помощью Supervisor: часть 1

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
1
2
3
4
from flask import Flask
app = Flask(__name__)
 
import my_app.views

В приведенном выше файле приложение было настроено и инициализировано.

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 ищет папку 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.