Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Следующая версия
Предыдущая версия
python:supervisor [2015/11/26 23:14] – создано mirocowpython:supervisor [2024/04/11 13:37] (текущий) mirocow
Строка 1: Строка 1:
-====== Supervisor ======+{{tag>service unix linux python supervisor initd}}
  
 +====== Supervisor by python ======
 +
 +  * http://supervisord.org
 +
 +Служит для демонизации процессов/программ с определенными параметрами и отслеживания их состояния. Запуск процессов supervisord производит от своего имени, как под процессы, поэтому контроль остается за визором. Supervisorctl предоставляет системный- и веб-интерфейсы для мониторинга и управления процессами. Вы можете предоставить пользователям доступ на определенные программы, а они в свою очередь смогут видеть состояние этих программ и совершать действия над ними (start, stop, restart). Также имеется XML-RPC интерфейс, которым вы можете пользоваться для написания своих расширений и приложений, которым нужен доступ к Supervisord.
 +Supervisor написан на [[develop:python:python]].
 +===== Установка =====
 +
 +==== apt-get ====
 +
 +
 +  $ sudo apt-get install supervisor
 +
 +==== pip ====
 +
 +Можно установить еще и c помощью пакетного мененджера pip для [[develop:python:python]], самая свежая версия из питоновского  установщика, но для этого нужно еще тянуть кучу пакетов для питона и компиляторов
 +
 +  sudo pip install --upgrade supervisor
 +  sudo ln -s /usr/local/bin/supervisord /usr/bin/supervisord
 +  sudo ln -s /usr/local/etc/supervisord.conf /etc/supervisord.conf
 +
 +===== Настройка =====
 +
 +  nano /etc/supervisor/supervisor.conf
 +или
 +  $ echo_supervisord_conf > /etc/supervisor/supervisor.conf
 +
 +  [unix_http_server]
 +  file = /tmp/supervisor.sock
 +  
 +  [supervisord]
 +  logfile          = ./logs/supervisord.log
 +  logfile_maxbytes = 50MB
 +  logfile_backups  = 10
 +  loglevel         = info
 +  pidfile          = /tmp/supervisord.pid
 +  nodaemon         = false
 +  minfds           = 1024
 +  minprocs         = 200
 +  
 +  [rpcinterface:supervisor]
 +  supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
 +  
 +  [supervisorctl]
 +  serverurl = unix:///tmp/supervisor.sock
 +  
 +  [program:someprogram1]
 +  command                 = bash -c "ulimit -n 10000; exec /usr/bin/php ./bin/some-program-1.php"
 +  process_name            = Some-Program
 +  numprocs                = 1
 +  autostart               = true
 +  autorestart             = true
 +  user                    = root
 +  stdout_logfile          = ./logs/some-program-info.log
 +  stdout_logfile_maxbytes = 1MB
 +  stderr_logfile          = ./logs/some-program-error.log
 +  stderr_logfile_maxbytes = 1MB
 +
 +===== WEB GUI =====
 +
 +Для запуска web интерфейса supervisorctl необходимо в файле /etc/supervisor/supervisord.conf проверить наличие секции:
 +  [inet_http_server]
 +  port=127.0.0.1:9771
 +  ;username=user
 +  ;password=123
 +
 +
 +Для работы через nginx c web версией можно написать прокси сервер:
 +
 +  server {
 +      listen 80;
 +      server_name supervisor.loc;
 +      location / {
 +          proxy_pass http://127.0.0.1:9771;
 +          proxy_set_header Host $host;
 +          proxy_set_header X-Real-IP $remote_addr;
 +          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 +      }
 +  }
 +
 +после чего перезапускаем nginx с supervisor' ом:
 +
 +
 +  /etc/init.d/supervisor restart
 +  /etc/init.d/nginx restart
 +Если при запуске supervisor возникла ошибка: Starting supervisor: Error: Another program is already listening on a port that one of our HTTP..., то для решения данной проблемы нужно убить socket supervisor.sock, где находится видно из конфига
 +
 +Пример:
 +
 +  $sudo unlink /tmp/supervisor.sock
 +Далее из браузера заходим на http://supervisor.loc
 +
 +===== supervisorctl =====
 +
 +Создание задач для supervisor:\\
 +Для создания задач, необходимо прописывать конфиги в /etc/supervisor/conf.d/ Структура файла конфигураций для worker'а supervisor'а:
 +
 +
 +  [program:]
 +  command=
 +  process_name=%(process_num)s                          
 +  stdout_logfile=/var/log/.log
 +  stderr_logfile=/var/log/.log
 +  redirect_stderr=true
 +  autostart=true                                         
 +  autorestart=true                                       
 +  startsecs=5                                            
 +  numprocs=1   
 +
 +  * [program:] — заголовок секции. Нижеследующие параметры будут относится только к этому воркеру(демону)
 +  * command — команда на запуск файла. чаще всего путь к исполняемому файлу.
 +  * process_name — имя каждого инстанса воркера. Здесь есть тонкость — В мануале указано, что этот параметр не обязательный. Но у меня были проблемы с запуском нескольких инстансов воркера, если его не указывать. Дело в том, что имена процессов должны отличаться. Здесь помимо названия воркера указываем его порядковый номер.
 +  * stdout_logfile — говорит само за себя. куда перенаправляем стандартную консоль вывода.
 +  * stderr_logfile — то же самое, только для ошибок. Рекомендую указывать эти 2 параметра. Они могут очень выручить, когда придется разбераться почему падают ваши демоны.
 +  * autostart — как и следовало ожидать. запускаем воркеров при запуске супервизорда. Как правило при старте системы.
 +  * autorestart — Перазапуск воркера, если тот при выполнении одного из заданий упал с Exception'ом.
 +  * startsecs — сколько времени нужно ждать воркера, чтобы он запустился (не обязательный параметр)
 +  * numprocs — количество инстансов воркеров.
 +
 +===== Наблюдения =====
 +
 +Иногда при останове supervisor'а остается висеть на порту http сервера python - нужно найти кто висит
 +
 +  sudo netstat -nap | grep 9771
 +И грохнуть по pid процесс:
 +
 +  sudo kill 2342
 +Прописать параметры $_SERVER в конфиге supervisor можно через переменную environment:
 +
 +  [program:php-test]
 +  command=php /path/file.php
 +  environment=HTTP_HOST="blog-tree.com",SOME_SERVER_PARAM="my_param"
 +далее нам эти переменные будут доступны из $_SERVER['HTTP_HOST'] и $_SERVER['SOME_SERVER_PARAM']
 +
 +{{topic>[python]}}