Недавно я перевел свой сайт на https протокол. В этом не было большой необходимости, но гугл настойчиво толкает нас в сторону https, повышая ранжирование сайтов на защищенном протоколе. Решил не отставать от тренда и выполнить переход. После этого было логичным включить новый протокол http/2, что я и сделал. Но столкнулся с неожиданными трудностями.
Научиться настраивать MikroTik с нуля или систематизировать уже имеющиеся знания можно на углубленном онлайн-курcе по администрированию MikroTik. Автор курcа – сертифицированный тренер MikroTik Дмитрий Скоромнов. Более 40 лабораторных работ по которым дается обратная связь. В три раза больше информации, чем в MTCNA.
Рассказывать про переход на 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:
- Сайт с онлайн проверкой - https://tools.keycdn.com/http2-test
- Расширение для хрома - HTTP/2 and SPDY indicator.
- С помощью Chrome Developer Tools. Для этого нужно добавить столбец protocol в панели отладки в разделе Network.
И здесь начались странности. Первый сервис показывал, что 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. Это видно на скриншоте, который я приводил выше. Надоело разбираться с темой, решил отложить на потом этот вопрос. Может кто в комментариях подскажет, почему так получается. Посмотрел другие сайты, у многих похожая картина, но не у всех.
Буду рад в комментариях подсказкам по этой теме. Вопрос актуальный. Гугл в обязательном порядке толкает нас двигаться вперед по заданному им пути, вынуждая подстраиваться. Не нравится эта тенденция, но что поделаешь. Он фактически монополист с самым популярным поиском и браузером в мире. Мы вынуждены с ним считаться.
Научиться настраивать MikroTik с нуля или систематизировать уже имеющиеся знания можно на углубленном онлайн-курcе по администрированию MikroTik. Автор курcа – сертифицированный тренер MikroTik Дмитрий Скоромнов. Более 40 лабораторных работ по которым дается обратная связь. В три раза больше информации, чем в MTCNA.
Приветствую.
Обновление nginx этим способом из brouken.repo не требует правки конфигов, настройки те же остаются?
Не хочется экспериментировать на живом сайте.
Статья старая. Я не знаю, что сейчас в этом репозитории. На живом сайте я бы не экспериментировал. В общем случае формат конфига у всех версий nginx одинаковый.
Ну в общем я рискнул, обновился вроде без проблем, теперь сайт подключается по http2.
Спасибо за статью.
Благодарность, за статью!)
Давно делал подобное, но через пересборку nginx. Если backend apache, то скрываем от него протокол добавив в конфиг nginx:
proxy_hide_header Upgrade;
Не уверен поможет ли это, т.к. проблемы с отдачей статики по httpv2 не было. Да и прироста в производительности на глаз не заметил, но это уже отдельная тема, по которой есть много в сети.
Таже хрень, стал интересен новый протокол http2, в итоге наткнулся на грабли в виде нерабочего http2 под хромом и оперой, а вот на Яндекс браузере и фаерфоксе все работает идеально, весь контент грузится через http2, с чем связан косяк в хроме с оперой, пока мне неизвестно, продолжаю экспериментировать...
У меня же описано, с чем это связано :)) И как исправить.
Изменил сертификат на https://letsencrypt.org/
StartSSL стали блокировать некоторые браузеры.
Я тоже так считаю, не еще не знаю.
а можно по подробнее, у меня сертификат от стартов теперь заблочен после их махинаций.
В интернете много инструкций по let's encrypt. Не хочется повторяться. Без проблем ищется через поисковики.
На Firefox Developer не работает сайт http://imgur.com/n26hqR2
В других браузерах все нормально
Это явно какая-то локальная проблема конкретного браузера. Статистика сайта показывает, что со всех современных браузеров все нормально работает.