Настройка поддержки HTTP / 2 Nginx в Ubuntu 18

Nginx шустрый веб-сервер с открытым исходным кодом, заслуживший доверие. Его предпочитают за незначительное потребление памяти, легкость настройки и поддержку большого количества протоколов. HTTP/2 — бинарная усовершенствованная версия протокола для быстрой передачи данных от сервера к пользователю.

Поскольку HTTP 1.1 — это протокол с ограниченным количеством одновременных подключений, который увеличивал задержку загрузки тяжелых страниц из-за последовательной загрузки. Вот спустя почти 20 лет, было принято решение избавиться от элементов, которые препятствовали повышению производительности.

HTTP/2 решает проблему путем параллельной загрузки данных (а не поочередной, как было ранее), сжатием полей заголовков HTTP.

В основу обновленного протокола легло мультиплексирование потоков, что являет собой расстановку приоритетов между более тяжелыми потоками — это важно в условиях ограничения ресурсов.

Помимо ускорения загрузки страниц сайта, переход на протокол HTTP/2 также повысит и безопасность передачи данных между сервером и посетителями, поскольку во всех современных браузерах обязательным условием поддержки протокола HTTP/2 является шифрование соединений между клиентом и сервером (сайт должен работать по HTTPS, то есть иметь установленный SSL сертификат).

Далее рассмотрим процесс перехода на HTTP/2

У вас есть сервер Ubuntu 18.04 с root-доступом и установленным Nginx.

Доменное имя, для которого настраиваем работу по HTTP/2, должно быть направлено на ваш сервер. Зарегистрировать новый домен, перевести существующий к нам на обслуживание или направить домен у вашего регистратора по A-записи на ваш сервер.

Также для этого домена на сервер необходимо установить SSL сертификат:

Это может быть бесплатный Let’s Encrypt или Вы можете выбрать и приобрести один из платных сертификатов (работу production’a на самоподписном сертификате не рассматриваем).
Также для корректной работы сайта по HTTP/2 необходимо настроить перенаправление трафика с 80 на 443 порт (автоматическое перенаправление запросов с HTTP на HTTPS протокол).

Подключение поддержки HTTP/2

В случае, если во время установки Nginx вы выполнили настройки блока server, то задаем следующие параметры для использования HTTP/2 вашим доменом.

Первым делом внесем в конфигурационный файл настройки непосредственно отвечающие за HTTP/2

Откроем конфигурационный файл, настраиваемого домена:

vim /etc/nginx/sites-available/ваш_домен

Далее подключим HTTP/2 для IPv6 соединений и IPv4 подключений в секции listen для порта 443:

listen [::]:443 ssl http2 ipv6only=on;

listen 443 ssl http2;

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

nginx -t

Если ошибки допущены не были, мы получим следующий вывод:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok

nginx: configuration file /etc/nginx/nginx.conf test is successful

Ограничим использование небезопасных шифров на сервере.

Шифр (Cipher Suites) — алгоритмы выполнения криптографических функций для шифрования передачи данных.
На следующем шаге проведем очистку неактуальных и небезопасных шифров, например, исключим использование шифрования MD5, которое считается небезопасным.

Открываем необходимый конфигурационный файл

vim /etc/nginx/sites-available/ваш_домен

Приводим опцию ssl_ciphers к следующему виду:

ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;

Сохраняем внесенные изменения и выходим.
И ещё раз проверяем, что не допустили синтаксических ошибок.

nginx -t

Перезагружаем веб-сервер после внесенных настроек.

systemctl restart nginx.service

Удостоверимся, что протокол HTTP/2 корректно работает

Начнем с самого простого метода проверка в консоли при помощи curl. Выполняем запрос

curl -I -L https://ваш_домен

и получаем примерно следующий вывод:

HTTP/2 200 

server: nginx/1.14.0 (Ubuntu)

date: Mon, 15 Jun 2020 20:28:01 GMT

content-type: text/html

content-length: 240

last-modified: Fri, 12 Jun 2020 10:50:34 GMT

etag: "5ee35dfa-f0"

accept-ranges: bytes 

Также, можно выполнить проверку при помощи Google Chrome: Настройки управления — Инструменты разработчика (или кликаем F12), переходим на вкладку Network, правой кнопкой кликаем по заголовку таблицы и выбираем опцию Protocol. В случае, если все настроено правильно, в новом столбике отобразится значение h2 (сокращение от HTTP/2)

В итоге, контент будет обслуживаться сервером по защищенному протоколу HTTP/2.

У нас уже есть настроенный редирект с HTTP на HTTPS. Добавим также заголовок HTTP Strict Transport Security, дабы исключить приоритет этих перенаправлений. Таким образом, если браузер обнаружит HSTS-заголовок, он не станет подключаться через HTTP. Обмен данными будет происходить исключительно по защищенному соединению HTTPS.

Откроем конфигурационный файл:

style="font-weight: 400;">vim /etc/nginx/nginx.conf 

В конфигурационном файле Nginx в текстовом редакторе прописываем:

http {

...

##

# Virtual Host Configs

##

include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
add_header Strict-Transport-Security "max-age=15768000" always;
}
...

Значение max age устанавливаем в секундах.

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

add_header Strict-Transport-Security "max-age=15768000; includeSubDomains" always;

Вы уже знаете, что после сохранения и выхода из текстового редактора, мы обязательно проверяем синтаксис и перезапускаем веб-сервер.

nginx -t
systemctl restart nginx.service

Заключение

После подключения вы сможете на себе проверить надежность, скорость и безопасность HTTP/2 протокола.