Home » Linux » CentOS » Не работает http/2 на nginx в chrome

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

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

Онлайн-курс по устройству компьютерных сетей

На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.

Рассказывать про переход на 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. Это видно на скриншоте, который я приводил выше. Надоело разбираться с темой, решил отложить на потом этот вопрос. Может кто в комментариях подскажет, почему так получается. Посмотрел другие сайты, у многих похожая картина, но не у всех.

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

Онлайн-курс по устройству компьютерных сетей.

На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.

Помогла статья? Подписывайся на telegram канал автора

Анонсы всех статей, плюс много другой полезной и интересной информации, которая не попадает на сайт.

Автор Zerox

Владимир, системный администратор, автор сайта. Люблю настраивать сервера, изучать что-то новое, делиться знаниями, писать интересные и полезные статьи. Открыт к диалогу и сотрудничеству. Если вам интересно узнать обо мне побольше, то можете послушать интервью. Запись на моем канале - https://t.me/srv_admin/425 или на сайте в контактах.

13 комментариев

  1. Приветствую.
    Обновление nginx этим способом из brouken.repo не требует правки конфигов, настройки те же остаются?
    Не хочется экспериментировать на живом сайте.

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

      • Ну в общем я рискнул, обновился вроде без проблем, теперь сайт подключается по http2.
        Спасибо за статью.

  2. Благодарность, за статью!)

  3. Давно делал подобное, но через пересборку nginx. Если backend apache, то скрываем от него протокол добавив в конфиг nginx:
    proxy_hide_header Upgrade;

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

  4. Бабаян

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

  5. Изменил сертификат на https://letsencrypt.org/
    StartSSL стали блокировать некоторые браузеры.

  6. На Firefox Developer не работает сайт http://imgur.com/n26hqR2
    В других браузерах все нормально

    • Это явно какая-то локальная проблема конкретного браузера. Статистика сайта показывает, что со всех современных браузеров все нормально работает.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Нажимая кнопку "Отправить комментарий" Я даю согласие на обработку персональных данных.
Используешь Telegram? Подпишись на канал автора →
This is default text for notification bar