Category Archives: Разработка

Некоторые мысли о интернет разработке.

Grafana — бесподобный дашборд графиков

Немного предыстории.

Я вообще говоря фанатик графиков, люблю что бы графиков было как можно больше, что бы различные оповещения сопровождались иллюстрацией на графике, в офисе у нас висит телек на который выведены графики с показателями основных параметров платформы.

Изначально я использовал какти с некоторыми дополнениями, об этом писал отдельный пост. Кто не работал с какти, раскажу что с ним не так — новый график нужно добавлять вручную, при чем это происходит в несколько этапов и занимает минут по 5-10 если уже знаешь что нужно сделать. Плюс к этому неудобство менеджмента когда графиков и данных очень много.

Затем была попытка применить заббикс для этих нужд. Из плюсов — там можно настроить discovery сервисов, когда заббикс самостоятельно создает новые графики по заданным критериям. Например из сервера выдается список пользователей, а заббикс по этому списку и заранее заданному шаблону запроса данных для каждого отдельного пользователя строит на каждого из них график.

Недостаток главный заключался в том, что графики у заббикса, простите, полнейшее говно.

grafana1

Без понимания что за данные изображены на графике возможно не будет настолько очевидно как это ужасно, но поверьте мне, графики заббикса не годятся ни для чего кроме мониторинга чисто серверных параметров типа трафика, памяти, nginx, php.

Удобство автоматического создания графиков теряло свою привлекательность абсолютным неудобством их отображения. Можно было либо выбирать по одному графику за раз из длиннющего выпадающего списка либо сделать комплексный экран и вывалить туда все графики по шаблону. В итоге выходили экраны на сотню и более графиков.

grafana2 

И снова обратите внимание на сколько уродски они выглядят. Оценить реально какую то динамику изменений невозможно. Вроде как и графики есть, а толку ноль.

Как появилось время, разочаровавшись заббиксом я решил попробовать новое решение и наткнулся на graphite, простая высокопроизводительная система ключ-значение на базе данных whisper. Суть в том, что в отличии от какти и заббикса здесь данные нужно пушить в базу, а не наоборот тянуть в базу с сервисов. Отсюда сразу же плюс в том, что данные автомаически собираются по всем нужным параметрам, этим управляет приложение, а не графит. Не нужно делать дополнительно дискавери сервисов как для заббикса, отдельно интефейсов для пула статы с сервиса.

Стата пулиться простым интерфейсом: ключ[пробел]значение[пробел][[время]]

Интерфейс графита который идет с ним в комплекте особо впечатления конечно не создает, скорее даже наоборот.

grafana3

Из всех сущестующих метрик можно формировать графики, создавать дашборды с предустановленными графиками, но это особо не интересно, т.к. этот интерфейс тоже совсем не интересен.

Настало время представить вам графану — лучший веб интерфейс для graphite и elasticsearch. Сам графит не хранит и не собирает данных, этим занимаются указанные выше системы, в моем случае графит. И выполняет он свою функцию наишучшим образом. В графите мне нравится все и отобразить там можно графики в любом виде, пользуясь кучей возможностей группировок, сумирования, создания переменных и прочее прочее.

grafana4Разве это не красота? Так выглядит один обзорный дашбоард.

Возможности по выводу графиков покрывают пока все мои нужды. Вся настройка проходит через удобный веб интерфейс в одном месте, все просто и понятно.

Есть так же и удобная возможность вывода десятков графиков (например какие то показатели по всем пользователям системы), только в отличии от забикса здесь можно добавить переменную с возможностью задания ей нескольких значений, и отображаться будут только графики по выбранным пользователям.

В общем подытожив, всячески рекомендую графану — лучший интерфейс графиков которые я встречал.

Впереди еще буду пробовать применять elasticsearch DB под свои нужды, с ним можно строить статистику в реальном времени.

Отладка проекта на продакшене

Бывают часто ситуации, когда после тестирования на деве обновляешь код на продакт сервере и внезапно оказывается что сайт не работает. При чем не всегда спасет и логирование ошибок. Фатал эроры к примеру туда не попадут.

Чаще всего это связано с нехваткой каких то модулей для php или чего угодно другого. Суть сводится к тому, что нужно включить вывод ошибок и посмотреть что происходит на сервере в момент ошибки.

Но для всех пользователей отображать ошибки конечно же неправильно, нужно как то отделить девелопера от остальных пользователей и показывать ошибки только ему.

В этом нам с легкостью поможет nginx (в апаче вроде можно сделать так же, но я им давно не пользуюсь).

Мы будем проверять наличие куки с определенным значением и если находим ее то выставляем переменную окружения APPLICATION_ENV в значение «development», а затем в коде по этому значению будем включать отображение ошибок.

Итак, редактируем файл /path/to/nginxconf/fastcgi_params (для freebsd это /usr/local/etc/nginx/fastcgi_params) и в конце дописываем:

set $appEnv 'production';
if ($http_cookie ~ "dev_cookie=secret_value" ) {
    set  $appEnv 'development';
}
fastcgi_param   APPLICATION_ENV  $appEnv;

Из этого понятно, что проверяться будет наличие куки с именем dev_cookie и значением secret_value. Конечно же для вашей реализации нужно изменить эти значения.

Установка переменной необходима потому как fastcgi_param нельзя использовать внутри if.

И после этого в коде используем такую небольшую конструкцию:

defined('APPLICATION_ENV') || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'production'));

if (APPLICATION_ENV == 'development')
{
	error_reporting(E_ALL ^ E_NOTICE);
	ini_set('display_errors',1);
}
else
{
	error_reporting(0);
	ini_set('display_errors',0);
}

И если где то в коде еще потребуется разделять логику для девелопера/обычных посетителей то можем в любом месте делать проверку

(APPLICATION_ENV == 'development')

 

Теперь, если вам нужно включить для себя отображение ошибок вы должны в браузере для нужного сайта создать куку с именем dev_cookie и значением secret_value и все. Когда закончите отладку можете просто удалить куку.

Мое решение работает сразу для всех проектов на сервере. Если вам нужно сделать данный функционал только для одного проекта или части сайта то вы можете перенести код в соответствующую секцию конфигурации.

Среда разработки — установка и настройка usvn

Скажу прежде о том, что настройку среды разработки, описанной в одном из предыдущих постов я конечно закончил, но описать это в блоге забыл.

Напишу по свежей памяти о недавном разворачивании usvn (usvn.info) как UI для управления SVN репозиториями.

Напомню, что речь идет о виртуальном сервере на freebsd работающим из под виртуалки. Нужен ли кому то личный репозиторий пусть решает сам, лично я считаю очень полезным даже при самостоятельной разработке (в случае работы в команде необходимость в таком инструменте вообще не возникает).

Забегая вперед, скажу, что программа smartSvn которой я пользуюсь для работы с репозиториями имеет возможность создания и работы через локальный репозиторий, так что возможно если бы я увидел эту возможность до настройки всего этого, то попробовал бы сначала поработать с локальным.

Лирика

Кому  нужны только технические детали, может листать вниз.

Так вот, как то у меня бывает получается, что, казалось бы, простая задача (скачать архив, распаковать, настроить хост в нгинсе и апач) усложняется какими то проблеммами.

Так вот и в этот раз. Во-первых, я видимо попал как раз на тот момент, когда старая команда, занимающаяся usvn прекратила работу над ним (следуя из их новостей), а какая то новая принялась. И видимо они как раз начали вникать в разработку, так как за несколько дней, которые я занимался поднятием этого дела  у себя, у них вышли 1.0.2 а затем 1.0.3 версии. Во-вторых, сайт самого usvn падал почему то каждый вечер, и даже почитать их документацию было невозможно.

Лирика закончена.

Напомню базовую систему, на которой нужно поднять usvn: freebsd, nginx, php-fpm. Nginx стоит фронтэндом. Апача пока и в помине нету.

В общем вот краткая инструкция по  быстрому поднятию нужного:

  1. Ставим apache2 (я ставил из портов — /usr/ports/www/apache22/ ), подключая обязательно модули auth_file, auth_basic, mod_dav, dav_fs, советую еще поставить mod_ssl);
  2. Ставим subversion (/usr/ports/devel/subversion), не забыв включить в опции его конфига mod_dav, остальные параметры вроде можно оставить по дефолту;
  3. При этом subversion закинет в папку /usr/local/libexec/apache22/ пару модулей для апача, необходимые для правильной работы этой системы;
  4. Правим конфиг апача. Главное — вешаем его не на стандартный 80, а на другой порт, я выбрал 433 (не путать с 443 который является дефолтным для https). Совет: если у вас по итогу не будет работать свн как нужно (например при переходе по нужному адресу будут ошибки 403, 404  и т.п., попробуйте перед директивой <location> для усвн поставить ServerRoot «/usr/local/www/usvn/files/svn/» — если сам усвн вы ставили в /usr/local/www/usvn/ и для репозиториев была указана стандартная папка). Не забываем так же вручную прописать для апача подключение модулей (добавлять после всех остальных): LoadModule dav_svn_module libexec/apache22/mod_dav_svn.so
    LoadModule authz_svn_module libexec/apache22/mod_authz_svn.so
  5. Настраиваем nginx для обработки нужного сайта, перенаправляя все запросы на index.php
  6. Перезапускаем nginx, apache. Если все ок, можно пробовать открывать адрес на который настроен nginx.

Не забудьте так же включить short_open_tag для php, потому что будет криво отображаться сайт усвн. Сначала на этапе установки я этого не заметил, все работало, хоть и криво, но потом пользоваться уже невозможно :-)

И еще поясню, кто не понял: сам сайт работает через nginx+php-fpm, а все что касается работы svn обслуживается модулем апача на другом порту. Таким образом менеджмент сервера выполняется с браузера, а комиты/апдейты и все остальное через адрес, например http://svn.site.ru:433/usvn/svn/

Приведу так же пример конфига апача:

Listen 433
ServerName svn.site.ru:433

LoadModule authn_file_module libexec/apache22/mod_authn_file.so
LoadModule auth_basic_module libexec/apache22/mod_auth_basic.so
LoadModule dav_module libexec/apache22/mod_dav.so
# ssl
LoadModule ssl_module libexec/apache22/mod_ssl.so

LoadModule dav_svn_module libexec/apache22/mod_dav_svn.so
LoadModule authz_svn_module libexec/apache22/mod_authz_svn.so

User www
Group www

ServerAdmin you@example.com
ErrorLog "/var/log/apache/httpd-error.log"
LogLevel warn

DefaultType text/plain

EnableMMAP off
EnableSendfile off
AcceptFilter http none

ServerRoot "/usr/local/www/usvn-1.0/files/svn"

<Location /usvn/svn>
DAV svn
SVNParentPath /usr/local/www/usvn-1.0/files/svn
SVNListParentPath off
SVNPathAuthz on
AuthzSVNAnonymous Off

AuthType Basic
AuthName "site repository"
AuthUserFile /usr/local/www/usvn-1.0/files/htpasswd
AuthzSVNAccessFile /usr/local/www/usvn-1.0/files/authz
Require valid-user
</Location>

Update: забыл добавить еще. После того как все уже было настроено, усвн отказывался создавать репозитории возвращая ошибку «Can’t create subversion repository». В итоге оказалось что все дело в том, что вызов команды svn … или svnadmin … возвращалось с 127 кодов выхода. Фикс этого: либо прописать для нужного юзера переменную окружения либо заменить команду svn -> /usr/local/bin/svn, svnadmin -> /usr/local/bin/svnadmin

После этого все работает четко =)

 

P.S. Новый пост о том, как сделать то же самое с использованием SSL (через https://).

FreeBSD: syslog — что делать если конфиг правильный, а сообщения не пишутся

Было такое дело. Конфиг 100% правильный, проверил уже стопитсот раз, но на настроенную local2.* сообщения по заданому файлу не пишутся. Уже перепроверил все что можно, включая права и владельца папки логов, а в итоге.. файл лога нужно создать самостоятельно! Только после этого сислог начнет писать в него сообщения.

Среда разработки — самое начало

Привет всем! Этим постом я начну цикл статей по настройке среды разработки. Нет, это будет на настройка любимой IDE, а немного более масштабно.

Начав не так давно работать в одной компании, я там столкнулся с одним решением по организации разработки, которое мне очень пришлось по душе.

Суть была такова: на своем компе настраивается виртуальная машина и на нее ставится freeBSD, затем папка из родительской ОС (на работе это Windows 7, сейчас у себя я делаю для mac os X) расшаривается на гостевую через samba (у себя я планирую это делать через NFS). Далее на фряхе настарваются все необходимые компоненты, апачи, пхп, нгниксы и прочее, аналогично к настройке на продакшн серверах. Таким образом во время разработки мы работаем в той же среде что и будет использоваться для реальной работы.

Но тогда мне дали почти все готовое, нужно было только немного подкорректировать настройки, а сейчас я уже сам с нуля хочу настроить подобную систему.

Писать буду по мере настройки что бы не забывалось.

Часть 1 — установка freeBSD, настройка интернета.

Первое что я сделал — скачал дистрибутив фряхи (да, кэп :-) — FreeBSD-8.2-RELEASE-i386-dvd1. С этим никаких проблем думаю не может возникнуть. Далее создал новую виртуальную машину (в предварительно установленной virtualbox), с соответствующим типом системы. Выделил ей 512мб оперативы и 10гб диска в динамическом разделе. Далее в свойствах машины примонтировал скачанный образ.

Здесь мне стоило еще поменять настройки сетевого подключения (как я понял потом). Так вот, что бы сразу сделать правильно, нужно выбрать сетевое подключение типа «мост», остальные настройки я не менял.

Хотя вот как выяснилось, вариант с подключением типа мост не совсем подходит. Если у вас комп подключен по этому интерфейсу физически ( то есть если вы выбрали подключение через ethernet), то все работает нормально. На виртуалке доступен и хост и интернет (если соответственно ваш комп подключен к инету). Но стоит отключиться и виртуалка стает тоже недоступной. Мне такой вариант не очень нравится. В идеале хочу что бы независимо от подключений на хосте, связь с виртуалкой была и если на хосте появляется доступ к инету то и на виртуалке он тоже был. Как найду способ это реализовать, напишу.

Далее запускаю виртуалку, начинаю установку. Когда спрашивали тип установки — выбрал рекомендуемый по умолчанию, т.к. ставлю фряху впервые. При запросе сетевых настроек следует выбрать «да», когда спросят попробовать ли настроиться через DHCP — у меня нужные настройки подхватились сразу. Далее, для удобства работы, я настроил себе подключение по ssh, т.к. работать с консоли, которую предоставляет виртуалбокс не так удобно (мне например очень нравится ZOC для этих целей). Для этого в одном из вопросов при настройке конфигурации нужно было ответить да, на вопрос включать ssh или нет. Если вы хотите заходить по ssh используя рут логин, то для активации этой возможности нужно сделать небольшую настройку.

ee /etc/ssh/sshd_config

И там ищем строку

#PermitRootLogin no

И меняем ее на

PermitRootLogin yes

(не забываем убрать # в начале строки).

Также, по желанию можно поменять порт по умолчанию (для виртуалки это в общем то ни к чему, но все же.

В этом же файле строка Port 22, для изменения убираем # в начале и меняем цифру на любую другую. После этого жмем Esc, пункт leave editor -> save changes. Вводим команду

/etc/rc.d/sshd restart

Все, пробуем подключится по ssh. Если вы не знаете айпи адрес виртуалки, то в консоли следует ввести

ifconfig | grep inet

Порт по умолчанию 22, если вы его поменяли то не забывайте при подключении указать соответствующий.

На этом пока все.