15.06.2018

Добавление ssl сертификата к сайту. certbot. lets encrypt.

Добавить на сайт сертификат без лишних эмоций можно так:
Используем сервис let’s encrypt И certbot
Я буду использовать в ручном режиме, потому, что у меня сайты находятся на разных портах, например на 84, вместо 80.

    1. Создам сертификат для нашего сайта, в чем преимущество let’s encrypt так это в том, что выдаст удостоверенный сертификат. правда бесплатно только на 3 месяца.

      1.1. установить certbot в систему. проходим по ссылке и выбираем web сервер и OS которая стоит на сервере. там на самом сайте прекрасная, короткая инструкция.
      2.2 воспользуемся ручным режимом, который спросит у вас имя вашего сайта, попросит внести в DNS TXT запись и выдаст сертификат:

      certbot certonly --manual --preferred-challenges dns

      примерно так:
      —————————————————-
      Please deploy a DNS TXT record under the name
      _acme-challenge.yourdomain.ru with the following value:

      Z9zqdbasdfasdfasdfsad1UabqXXadfasdfqwerE4oc
      —————————————————-
      Если всё ок, то сертификаты он сохранит в каталог /etc/letsencrypt/live/yourdomain.ru,
      а сообщит он об этом примерно так:
      —————————————————-
      IMPORTANT NOTES:
      – Congratulations! Your certificate and chain have been saved at:
      /etc/letsencrypt/live/yourdomain.ru/fullchain.pem
      Your key file has been saved at:
      /etc/letsencrypt/live/yourdomain.ru/privkey.pem
      —————————————————-

      Лично использую dns сервера от yandex – работают абсолютно бесплатно, редактировать одно удовольствие.

    2. Таким образом мы быстренько получили сертификаты не трогая никаких конфигураций web-сервера на самом сервере. Теперь остаётся включить ssl в apache и прописать в конфигурацию полученные сертификаты.

Ну и надо добавить обновление сертификатов в crontab чтобы не дергаться каждые три месяца на эту тему.

certbot renew --manual --preferred-challenges dns

27.11.2017

High load. Высокая нагрузка на сервер Астериск.

В рамках проекта с высокой нагрузкой нужно было решить проблему, описание которой звучит так: После 360 секунд вызовы переставали попадать в биллинг. Первонаперво была выяснена причина это отсутствие некоторых переменных, получаемых через AGI интерфейс php скриптом. При этом, если использовать AGI то такой проблемы не наблюдалось.
В нашем случае используется FASTAGI и связка ASterisk, xinetd, phpagi-fastagi.php, myscript.php.

Поиск решений занял несколько дней, потому, что нагрузка на сервер была высокой итак: 1. Обнаружили что mysript.php не получает значение переменной DIALSTATUS после выполнения команды DIAL. И поиск в интернете ничего не давал, пока я не набрел на собственно код phpagi библиотеки на sourceforge.net. (https://sourceforge.net/p/phpagi)
И в багтреке были прикреплены несколько вопросов именно по поводу переменной DIALSTATUS. Но комментиариев с решением под ними не было, а были они в “обсуждениях”, вот здесь: https://sourceforge.net/p/phpagi/discussion/366892/thread/5a4c09f0/

В двух словах, phpagi Общается с асетриском через потоки как будто пишет и читает из файла строки, и вот какое дело, иногда когда скрипт читает данные из потока он получает толи пустые строки толи что, и не может получить значение переменной, хотя по agi debug четко видно, переменная передается скрипту.

Было два решения которые предложила система, это а) повторить запрос переменной несколько раз, пример:
function get_var($agi_in, $value)
{
$temp = $agi_in->get_variable($value);
$temp = $agi_in->get_variable($value);
$temp = $agi_in->get_variable($value);
$temp = $temp;
$agi_in->verbose($value." :".$temp);
return $temp;
}

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

function evaluate($command)
{
//clear the buffer
stream_set_blocking($this->in,0);
do {
$line = fgets($this->in);
} while ($line);
stream_set_blocking($this->in,1);

Всем пока.

10.06.2017

SIPP Тестирование Asterisk

Решил провести тестирование Астериска на предмет максимального количества звонков.
Сразу скажу, у меня Астериск 1.4 и я просто посылаю на эхотест его, примеры эхотеста в астериска в sip.conf есть.

Чтобы провести тестирование нагрузки нам понадобится sipp

  1. yum install sipp
  2. копируем в локальный каталог сценарий с uac_pcap.xml из документации sipp
  3. копируем pcap файлы для астериск в каталог pcap текущей папки
  4. подбираем нужные параметры для sipp и должно работать

Здесь я опишу только 4 пункт:

в моем случае конфигурация рабочая выглядит так:

sipp -sf uac_pcap.xml -r 1 -mi 111.111.111.111 -i 111.111.111.111 -s 1005 222.222.222.222 -trace_msg -rtp_echo -d 5000

где
111.111.111.111 – внешний интерфейс вашей машины
222.222.222.222 – адрес астериска
1005 – номер для эхотеста
-d 5000 – пауза в 5 секунд (опционально)
и все погнали, в моей конфигурации сети, без особых проблем астериск успевает обслужить 50 вызовов в секунду и примерно 500 одновременных соединений, потом начинаются ретрансмиты сообщений.

9.06.2017

Memcached и ограничение соединений к нему

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

докопался до вот чего:

Огромное количество соединений к localhost остаются в состоянии time_wait в документации по memcached прекрасно сказано, что нужно проверить для увеличении производительности, а вот здесь был конкретный совет по поводу подвисших соединений:

Details of how to tune these variables are outside the scope of this document, but google for “Linux TCP network tuning TIME_WAIT” (or whatever OS you have) will usually give you good results. Look for the variables below and understand their meaning before tuning.

!THESE ARE EXAMPLES, NOT RECOMMENDED VALUES!
net.ipv4.ip_local_port_range = 16384 65534
net.ipv4.tcp_max_tw_buckets = 262144
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1

Я внес в систему только параметр net.ipv4.ip_local_port_range сделав его в два раза больше и дело пошло. Полезной оказалась статься про мониторинг memcached в частности утилита memcache-top и команда netstat которая показала кол-во еще ожидающих закрытия соединений.

9.06.2017

Автозапуск Debian 6 и Centos 6.8

Запуск программ при старте Debian:

Добавление скрипта в автозагрузку:

Удаление скрипта из автозагрузки:

2.04.2013

Userblacklist / GlobalBlack list

Реализация Чернго и белого списка на opensips.

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

1) проверка набранного номера на наличие в глобальном блэклисте, Если есть то смерть, если нет,то далее….

2) проверим пользовательский черный список, если набранный номер есть, то проведем сверку с колонкой prefix поля from, и в зависимости от значения whitelist либо дадим звонку идти дальше либо выставим запрет.

сам код:

### Глобальный Черный список
if (!check_blacklist(“globalblacklist”)) {
xlog(“For $ru globalblack list Active…”);
$avp(is_in_blacklist) = “1”;
sl_send_reply(“403”, “Forbidden BlackListed”);
exit;
}

if (!check_user_blacklist(“$rU”, “$fd”, “$fU”)) {
sl_send_reply(“403”, “Forbidden BlackListed”);
xlog(“User Black listed $fu -> $ru”);
exit;
} else {
xlog(“User white list active for $fu to $rU”);
}

Обратите внимание на параметры к функции check_user_blacklist . Изменен порядок, так чтобы пользователем являлся набранный номер, а префикс применялся к АОНу т.е. номеру звонящего или проще говоря полю FROM.

Для понимания ссылка на то как выгядит сам список.