Решение проблемы

Не работает http/2 на nginx в chrome


Недавно я перевел свой сайт на https протокол. В этом не было большой необходимости, но гугл настойчиво толкает нас в сторону https, повышая ранжирование сайтов на защищенном протоколе. Решил не отставать от тренда и выполнить переход. После этого было логичным включить новый протокол http/2, что я и сделал. Но столкнулся с неожиданными трудностями.

Рассказывать про переход на https я не буду. В интернете много статей на эту тему. Я без проблем все нашел и сделал. Нужно только в поисковиках аккуратно зарегистрироваться с новым сайтом, чтобы не вылететь из выдачи. Об этом тоже хорошо рассказано, не буду акцентировать внимание. Я использую веб сервер nginx на Сentos 7 и все дальнейшее повествование будет про эту конфигурацию.

Если кто не знает, то бесплатный сертификат на 3 года можно получить у StartSSL. Моя статья немного устарела, так как на сайте изменился дизайн, но смысл весь тот же самый. Я без проблем на днях получил от них сертификат и установил на свой веб сервер. Можете сами в этом убедиться в адресной строке браузера.

Для работы новой версии протокола http/2 необходимо в обязательном порядке настроенное шифрование. До перехода на https я не мог его включить. А теперь появилась возможность, и я решил ей воспользоваться. Про отличие новой версии протокола от 1-й в интернете много информации, почитайте сами. Главное отличие — обещают прирост отклика и скорости загрузки сайта до 30%. Скажу сразу, у себя я не проводил замеров до и после. Планирую в панелях вебмастеров яндекса и гугла через некоторое время посмотреть среднее время загрузки страницы.

Настроить http/2 в nginx не просто, а очень просто. Добавляем соответствующую запись в секции server:

listen 443 ssl http2;

Перезапускаем nginx. Этого достаточно для работы http2. Стоит только учесть, что должна быть более ли менее свежая версия nginx. Он примерно год поддерживает новый протокол, я не знаю, с какой версии точно началась поддержка. Я регулярно обновляюсь, так что у меня все более ли менее свежее, и вопрос с версией не вставал.

Протокол http/2 я включил, перезапустил nginx и стал думать, а как, собственно, проверить, что все работает так как надо, и мой сайт теперь летает на максимальной скорости. Способа нашел 3:

  1. Сайт с онлайн проверкой — https://tools.keycdn.com/http2-test
  2. Расширение для хрома — HTTP/2 and SPDY indicator.
  3. С помощью Chrome Developer Tools. Для этого нужно добавить столбец protocol в панели отладки в разделе Network.

Проверка работы протокола http/2

И здесь начались странности. Первый сервис показывал, что http/2 работает. Расширение для хрома, что нет. И сам хром показывал, что я гружу сайт по http/1.1. Стал разбираться в ситуации, почему так. Проблему нашел достаточно быстро, в том числе на самом сайте nginx — https://www.nginx.com/blog/supporting-http2-google-chrome-users/

Не буду вдаваться в подробности, по ссылке все рассказано. Если кто не силен в английском, вот здесь — https://victor.4devs.io/ru/architecture/nginx-http2-does-not-work.html автор рассказал своими словами о проблеме. Суть в том, что в какой-то момент chrome перестал поддерживать устаревшую технологию, требуя обновления. С теми, кто не обновится, хром не будет работать по http/2, а продолжит по старой версии протокола. В принципе, это все не критично и можно было бы забить. Но раз уж я решил перейти на http/2 и проверить, изменится ли время загрузки страниц сайта, решил идти до конца и разбираться с проблемой.

У меня на сервере стоит CentOS 7. У нее системная библиотека openssl версии 1.0.1

# openssl version

OpenSSL 1.0.1e-fips 11 Feb 2013

Nginx должен работать с OpenSSL версии не ниже 1.0.2, чтобы chrome мог работать с сайтом по протоколу http2. В обоих приведенных выше ссылках предлагается единственное решение, если нет системного обновления для OpenSSL, собирать вручную nginx из исходников с нужной версией openssl. Мне не хотелось этим заниматься, так как такой подход будет приводить к регулярным проблемам во время обновления. Нужно будет каждый раз вручную все собирать и проверять, чтобы не было никаких проблем. Мне не хотелось этим заниматься. Стал искать другое решение.

Я его нашел. Существует репозиторий brouken.repo, в котором есть свежии версии nginx, уже собранные с OpenSSL 1.0.2. Все, что нам нужно, это подключить репозиторий и обновить с него nginx. Сделаем это.

# yum -y install yum-utils

# yum-config-manager --add-repo https://brouken.com/brouken.repo
# yum update nginx

После этого перезапускаем nginx и еще раз проверяем всеми средствами, работает ли ваш сайт по http/2. У меня заработал. Остался не понятен только один момент. При просмотре протокола загрузок в Chrome Developer Tools, у меня только сам адрес страницы загружается по http2, а все остальное (картинки, css, скрипты) грузится по http/1.1. Это видно на скриншоте, который я приводил выше. Надоело разбираться с темой, решил отложить на потом этот вопрос. Может кто в комментариях подскажет, почему так получается. Посмотрел другие сайты, у многих похожая картина, но не у всех.

Буду рад в комментариях подсказкам по этой теме. Вопрос актуальный. Гугл в обязательном порядке толкает нас двигаться вперед по заданному им пути, вынуждая подстраиваться. Не нравится эта тенденция, но что поделаешь. Он фактически монополист с самым популярным поиском и браузером в мире. Мы вынуждены с ним считаться.


СМОТРИ ТАКЖЕ