Поднять Nginx с HTTP2

Попутно решаем проблемы с OpenSSL

Решил перевести один свой проект на HTTPS. Но хотелось не только HTTP, но еще и HTTP2 в придачу. В итоге, как всегда это водится в Linux мире, столкнулся с проблемами. Проблемы благополучно решил, но хочется записать для себя и поделиться с вами этими решениями. И так, поехали…

Зачем переводить на HTTPS

Собственно вопрос, а зачем вообще может понадобиться этот HTTPS или даже HTTP2? Ну кроме того, что это новый модный протокол, а модный проект (aka startup) обязан работать на модных технологиях. На самом деле для бизнеса есть польза от HTTPS.

Зачем HTTPS?

Повышаем конверсию

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

SEO. Повышаем посещаемость

Но это мелочи. Копаем глубже — SEO. Мало того, что Google и Яндекс индексируют сайты под HTTPS охотнее, так Google еще и поднимает их в выдаче. Т.е. это легкий способ поднять свои позиции в серпе (выдаче) поисковика.

Аналитика

Но и это еще не все. Вы ведете активные рекламные кампании, да и просто следите за переходами в том же Google analitics. И проблема заключается в том, что сами поисковики находятся под HTTPS, а вот ваш сайт — нет! И это значит что? Правильно! Это значит то, что при переходе с HTTPS на HTTP теряется Referer. А это ведет к ухудшению аналитики. Откуда и почему приходят люди — загадка, покрытая правилами секурности.

Это несколько пунктов, ради которых стоит перевести ваш сайт с HTTP на HTTPS.

Почему HTTP/2?

Добрались и до нового модного протокола. Ну ок, получили сертификат, подняли Nginx, открыли 443 порт, настроили хост с прописанными сертификатами… А новый протокол-то зачем? И без него жить можно.

Да, можно, но за SSL надо платить. Секурность безопасность дается не просто так иначе бы давно все сайты были сразу под HTTPS. 
В HTTP/2 используется только одно мультиплексирующее соединение до хоста, вместо множества соединений передающих по одному файлу. И производится всего один handshake вместо множества, как у HTTPS/1.1 . Таким образом мы снижаем нагрузку на сервер и количество передаваемого трафика.

Ну и да, протокол 2й версии обещает повышение скорости загрузки ресурсов, но об этом мы поговорим в отдельной статье.

Получаем SSL сертификат

Как получить — решать вам. Можете купить, можете получить бесплатно, к примеру, на https://letsencrypt.org или https://www.startssl.com

Настраиваем Nginx

Вся суть настройки Nginx сводится к следующему:

  • Он должен быть правильно собран
  • Нужно прописать сертфикаты в host

Nginx правильно собран для работы с HTTP/2 если он конфигурировался со следующими опциями:

 ./configure --with-http_ssl_module \
--with-http_v2_module

Минимальная конфигурация хоста для запуска HTTS с поддержкой HTTP/2:

server {
listen 443 ssl http2;
server_name new.hr;

ssl on;
include ssl_base.conf;
ssl_certificate /etc/nginx/ssl/new.hr/1_new.hr_bundle.crt;
ssl_certificate_key /etc/nginx/ssl/ssl.key;

set $sname new.hr;
set $subdomain "www";
set $root "/www/sites/$sname/$subdomain/public";

root $root;
index index.html index.htm;
}

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

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

killall -HUP nginx
# or
/etc/init.d/nginx reload
# or
/etc/init.d/nginx rstart
# or
service nginx restart

В общем это на ваше усмотрение.

Проверяем работу

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

nginx -t

Лучше взять за правило перезапускать сервер только после проверки конфига:

nginx -t && /etc/init.d/nginx restart

Сначала думал что с сертификатми что-то не так. Но оказалось что проблема в другом.

Дебажим Nginx

В любой непонятной ситуации надо дебажить. Включить в Nginx дебаг лог просто, главное чтобы сервер был собран с флагом:

--with-debug

В глобальный nginx.conf добавляем строчку с логом:

...
error_log /var/log/nginx/debug.log debug;

http {
...
}

Перезапускаем сервер и читаем логи

nginxt -t && /etc/init.d/nginx restart && tail -f /var/log/nginx/debug.log

Запрашиваем наш сайт и смотрим в лог, а там видим

no ssl_certificate is defined in server listening on SSL port while SSL handshaking

Оказалось что у меня были хосты для тестов с SSL, в которых уже давно истекли сертификаты или вовсе были удалены. После того, как я вычистил все такие хосты все заработало. Вроде бы Ура!

SSL заработал но без HTTP/2

Когда я проверил протокол соединения, оказалось что это все еще старый добрый HTTP/1.1

Странно подумал я, снова полез в отладочный лог и оказалось что у меня не происходит переключения на новый протокол. Покопавшись в документации выяснилось что HTTP2 включается только если Nginx собран с OpenSSL версии 1.0.2 и выше.

Чтобы принимать HTTP/2-соединения по TLS, необходимо наличие поддержки расширения “Application-Layer Protocol Negotiation” (ALPN) протокола TLS, появившейся лишь в OpenSSL версии 1.0.2. Работа расширения “Next Protocol Negotiation” (NPN) протокола TLS (поддерживаемого начиная с OpenSSL версии 1.0.1) в данном случае не гарантируется.

Проверив свою версию в системе

openssl version

У меня оказалась она, естественно, ниже.

Собираем Nginx с SSL 1.0.2

Тут все не так уж сложно. Качаем, распаковываем и пересобираем:

wget https://www.openssl.org/source/openssl-1.0.2g.tar.gz
tar -zxf openssl-1.0.2g.tar.gz
cd nginx
./configure --with-http_ssl_module \
--with-openssl=`realpath ../openssl-1.0.2g` \
--with-http_v2_module \
#другие ваши настройки \

Перезапускаем сервер и вуаля. Для контроля можно воспользоваться сервисом

и насладиться результатом анализа