Правильное подключение ssl сертификата на сайт.

Недавно столкнулся с такой проблемой, что у меня с браузером ФФ 25 сайт по https открывается без проблем, а у нескольких коллег выдает предупреждение о недоверенном сертификате. При чем в остальных браузерах у всех все было нормально.

В итоге проблема оказалась в том, что сертификат был подписан промежуточным центром сертификации, который был не во всех браузерах. Для решения этой проблемы нужно всего лишь слить содержимое файла *.crt и *.ca-bundle (которые выдаются обычно вместе).

Сделать это можно примерно такой командой:

cat www.example.com.crt bundle.crt > www.example.com.chained.crt

И затем прописываем в конфигурации этот файл:

server {
    listen              443 ssl;
    server_name         www.example.com;
    ssl_certificate     www.example.com.chained.crt;
    ssl_certificate_key www.example.com.key;
    ...
}

Еще одной новой фишкой nginx стала возможность задать в одной секции server настройки как для http так и для httpS. Это можно делать указанием слова ssl в строке listen. Для этого порта затем будет использовать ssl. И это избавляет от необходимости дублировать конфиг если у вас сайт доступен по обеим портам.

Пример конфига с работой по 80 (http) и 443 (https) портам:

server {
    listen              80;
    listen              443 ssl;
    server_name         www.example.com;
    ssl_certificate     www.example.com.chained.crt;
    ssl_certificate_key www.example.com.key;
    ...
}

//На самом деле эту информацию конечно же можно найти на официальном сайте (документация). Пишу здесь просто что бы предостеречь от ошибки, когда firefox выдает ошибку сертификата:

*****.com использует недействительный сертификат безопасности. К сертификату нет доверия, так как отсутствует цепочка сертификатов издателя. (Код ошибки: sec_error_unknown_issuer)

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

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

Чаще всего это связано с нехваткой каких то модулей для 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 и все. Когда закончите отладку можете просто удалить куку.

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

Перемещение/копирование большого количества файлов на freebsd

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

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

Это конечно подойдет не всем. Если, например нужно переместить один большой файл то это не поможет.

Собственно сама команда:

find /dir/to/src/* -name '*' -exec echo move {} \; -exec cp -R {} /dir/to/dest/ \; -exec rm -rf {} \; -exec sleep 3 \;

Зачем делается cp а затем rm вместо mv? Потому как mv почему то не может за собой удалить папку с файлами, поэтому для универсальности решения используется именно эта комбинация.

Число 3 в конце — это время в секундах, какую паузу нужно сделать после перемещения одного файла/папки.

Настройка собственного Jabber сервера на freebsd

Понадобилось для личных нужд поднять джаббер сервер. Был выбран ejabberd 2, как наиболее простой и в то же время функциональный.

Описывать весь процесс не буду, мне отлично помогла все сделать эта статья.

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

Оригинал инструкции здесь.

  1. Заходим в админ веб интерфейс по пути «Виртуальный хост» — выбираем нужный сервер — «Группы общих контактов»
  2. В поле для добавления новой группы вводим «everybody» и жмем добавить.
  3. Заполняем поля:
    • Название: EveryBody
    • Описание: This group contains everybody
    • Члены: @all@
    • Видимые группы: everybody
  4. Отправляем форму
  5. Готово. Теперь после подключения у вас появится новая группа «EveryBody» в которой будут все пользователи сервера.

Nagios и ошибка проверки PINGа

В какой то момент нагиос стал хаотично выдавать по разным сервисам в разное время ошибку:

CRITICAL — popen timeout received, but no child process

При этом ошибка не связана с реальной доступностью сервиса, все работало как положено.

Так вот, решение как оказалось простое — для проверки на пинг нужно отключить протокол IPv6.

Для этого открываем на редактирование файл /path/to/nagios/objects/commands.cfg

И там ищем два блока:

define command{
        command_name    check-host-alive
        command_line    $USER1$/check_ping -H $HOSTADDRESS$ -w 3000.0,80% -c 5000.0,100% -p 5
        }

и

define command{
        command_name    check_ping
        command_line    $USER1$/check_ping -H $HOSTADDRESS$ -w $ARG1$ -c $ARG2$ -p 5
        }

И редактируем их до такого вида:

define command{
        command_name    check-host-alive
        command_line    $USER1$/check_ping -4 -H $HOSTADDRESS$ -w 3000.0,80% -c 5000.0,100% -p 5
        }

и

define command{
        command_name    check_ping
        command_line    $USER1$/check_ping -4 -H $HOSTADDRESS$ -w $ARG1$ -c $ARG2$ -p 5
        }

То есть, всего лишь добавляем опцию -4, которая указывает, что нужно использовать только протокол IPv4.

После этого перезапуск нагиоса и проблема решена.

service nagios reload