- PVSM.RU - https://www.pvsm.ru -

Осовремененный Unix Way или pipe в браузер

Наверное, каждый, кому когда-нибудь приходилось следить одновременно за большим количеством окошек с логами, подумывал о переносе некоторых из них на экран планшета или телефона.
А, находясь далеко от компьютера, следить за выхлопом недавно запущенного большого и страшного сервиса?
Конечно, можно поставить ssh клиент на телефон, но это не особо удобно.
Поэтому я решил сделать мини-сервис упрощающий «удалённый» просмотр логов.


Осовремененный Unix Way или pipe в браузер [1]Осовремененный Unix Way или pipe в браузер [2]

Краткое резюме

Сервис cantail.me [3] с открытым исходным кодом, выложенным на github [4].
Свободный консольный клиент (github [5]). Для простой отправки данных достаточно:

long-runnig-app | tailme

И скопировать ссылку из открывшегося окна браузера. Или можно добавить параметр -s и просто скопировать её из терминала.

Для примера сейчас запущена публикация лога nginx'а [6] командной:

tail -f /var/log/nginx/cantailme.access.log | tailme -s

Установка клиента

В ubuntu 11.10+ приложение можно установить из ppa [7]:

add-apt-repository ppa:nvbn-rm/ppa
apt-get update
apt-get install tailme

В других дистрибутивах можно установить через pip:

pip install -e git+https://github.com/nvbn/cantailme-client.git#egg=tailme

Либо через установочный скрипт:

git clone https://github.com/nvbn/cantailme-client.git
cd cantailme-client
python setup.py install

Под капотом

Осовремененный Unix Way или pipe в браузер

Реализация клиента очень простая — цикл читающий stdin и отправляющий на сервер новые строчки.
Для предотвращения подмены данных сервер при инициализации сессии отдаёт хеш-идентификатор и «секрет», которые в дальнейшем используются для отправки «строк».

Серверная часть немного сложнее, её можно разделить на 3 условных сущности:

  • http «сервер» занимающийся рендеренгом 2 вьюх;
  • jsonrpc api, с помощью которого консольный клиент инициализирует сессию и отправляет данные на сервер;
  • push сервер для отправки полученных через api строк клиентам в реальном времени.

Взаимодействие между частями системы проходит при помощи RabbitMQ.
Push работает через tornado-sockjs [8].
Для экономии ресурсов логи загружаются сразу в файл и отдаются через nginx, минуя django.
Для желающих залить /dev/urandom или большие логи раз в 5 минут запускается «суровый» скриптик [9].

Деплой

Осовремененный Unix Way или pipe в браузер

В данном случае он нетривиален, но я уже сталкивался с похожей ситуацией [10]. Основные причины выбора такой схемы:

  • нередка ситуация, когда нестандартные порты порезаны, поэтому tornado и django должны висеть на одном стандартном порту;
  • заставить nginx работать нормально с WebSocket'ами проблематично;
  • HAProxy не раздаёт статику;
  • эту схему я успел погонять в продакшене на неэкспериментальных проектах =)

В случае возникновения ошибок пишиет багрепорты в трекере для сервера [11] и клиента [11]. Либо в комментариях к этому посту =)

PS с habrastorage произошёл какой-то косяк, перезалил картинки к себе.

Автор: nvbn


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/linux/11232

Ссылки в тексте:

[1] Image: http://cantail.me/media/pub/bigm.png

[2] Image: http://cantail.me/media/pub/bigt.jpeg

[3] cantail.me: http://cantail.me/

[4] github: https://github.com/nvbn/cantailme-server

[5] github: https://github.com/nvbn/cantailme-client

[6] публикация лога nginx'а: http://cantail.me/tail/e794a80e/

[7] ppa: https://launchpad.net/~nvbn-rm/+archive/ppa

[8] tornado-sockjs: https://github.com/MrJoes/sockjs-tornado/

[9] «суровый» скриптик: https://github.com/nvbn/cantailme-server/blob/master/app/management/commands/kill_fat.py

[10] похожей ситуацией: http://habrahabr.ru/post/135650/

[11] сервера: https://github.com/nvbn/cantailme-server/issues