NGINX + HTTP/2

NGINX + HTTP/2
NGINX + HTTP/2

HTTP/2 (изначально HTTP/2.0) — вторая крупная версия сетевого протокола HTTP, используемая для доступа к World Wide Web. Протокол основан на SPDY. HTTP/2 был разработан рабочей группой Hypertext Transfer Protocol working group (httpbis, где bis означает «еще раз», «повторно», «на бис») из Internet Engineering Task Force.

HTTP/2 является первой новой версией HTTP с версии HTTP 1.1, которая была стандартизирована RFC 2616 в 1999. Рабочая группа представила протокол HTTP/2 на рассмотрение IESG как Proposed Standard в декабре 2014 и IESG утвердила его к публикации как Proposed Standard 17 февраля 2015. Спецификация HTTP/2 была опубликована как RFC 7540 в мае 2015.

HTTP/2: основные нововведения

Мультиплексирование

Возможно, это самое главное преимущество HTTP/2. В HTTP/1.1 для каждого запроса требуется устанавливать отдельное TCP-соединение. Мультиплексирование же позволяет браузеру выполнять множество запросов в рамках одного TCP-соединения:

Мультиплексирование
Мультиплексирование

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

Приоритеты

Ещё одно нововведение HTTP/2 — это приоритизация. Каждому запросу можно назначить приоритет. Существует два подхода к назначению приоритетов: на основе веса и на основе зависимостей.

В первом подходе каждый поток получает определённый вес. Потом на основе веса сервер распределяет нагрузку между потоками. Такой подход уже использовался в протоколе SPDY.

Второй метод, являющийся основным в HTTP/2, заключается в следующем: браузер просит сервер загружать определённые элементы контента в первую очередь. Например, браузер может попросить сервер сначала загрузить CSS-файлы или JavaScript, а уже потом — HTML или изображения.

В HTTP/2 приоритизация является не обязательным, а желательным методом. Однако мультиплексирование без неё работать должным образом не будет. Скорость загрузки может быть даже ниже, чем HTTP/1.1. Ресурсы с более низким приоритетом будут занимать полосу, что приведёт снижению производительности.

Сжатие HTTP-заголовков

Современная веб-страница состоит из множества элементов: изображения, JS, CSS и другие. В запросе на загрузку каждого из этих элементов браузер передаёт HTTP-заголовок. Отправляя запрошенные элементы, сервер также добавляет к ним заголовок. Всё это сопряжено с излишним расходованием ресурсов.

В HTTP/2 заголовки передаются в сжатом виде. Благодаря этому уменьшается количество информации, которой обмениваются между собой сервер и браузер. Вместо алгоритмов gzip/deflate используется HPACK. Это снижает уязвимость к атакам типа BREACH.

HTTP/2 и безопасность

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

Это нужно не только для HTTP/2. В поиске Google использование безопасного соединения является одним из критериев ранжирования. Браузеры скоро будут помечать сайты, не поддерживающие https, как «небезопасные». Добавим также, что многие возможности HTML5 ― например, геолокация ― без безопасного соединения будут недоступны.

Установка HTTP/2 NGINX

Проверяем текущую версию nginx:

root@nginx-web1:~# nginx -v
nginx version: nginx/1.10.3

Не самая свежая ((( Обновимся:

root@nginx-web1:~# wget http://nginx.org/keys/nginx_signing.key && apt-key add nginx_signing.key
root@nginx-web1:~# nano /etc/apt/sources.list

deb http://nginx.org/packages/mainline/debian/ jessie nginx
deb-src http://nginx.org/packages/mainline/debian/ jessie nginx

root@nginx-web1:~# aptitude update && aptitude upgrade
root@nginx-web1:~# aptitude remove nginx nginx-common nginx-full nginx-core && aptitude install nginx-extras

Я устанавливаю nginx-extras так как использую модуль naxsi. Если неиспользуются дополнительные модули, то лучше установить nginx.

root@nginx-web1:~# nginx -v
nginx version: nginx/1.11.10

nano /etc/nginx/sites-available/default

Включаем поддержку HTTP/2:

server {
listen *.*.*.*:443 default_server http2;
... }

root@nginx-web1:~# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Синтаксис nginx верный, но при запуске получаем ошибку:

service nginx restart
Failed to restart nginx.service: Unit nginx.service is masked.

Лечение очень простое:

systemctl unmask nginx.service
Removed symlink /etc/systemd/system/nginx.service.

Перезапускаем nginx еще раз:

service nginx restart

root@nginx-web1:~# netstat -nlp | grep nginx
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 21384/nginx -g daem
tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN 21384/nginx -g daem
root@sambuca-web1:~#

Проверяем работу HTTP/2 https://tools.keycdn.com/http2-test:

HTTP/2 тест
HTTP/2 тест
NGINX + HTTP/2
5 (100%) 2 votes

3 thoughts on “NGINX + HTTP/2”

  1. Добрый день. Добавил себе на сайте https://mobiappsystems.ru/ HTTP/2. Сервис «HTTP/2 Тест — онлайн сервис» показывает, что
    сайт поддерживает http/2. Но вот firebug в firefox в заголовках пишет Версия: HTTP/1.1
    В чем может быть проблема? Версия Nginx 1.11.6, в конфиге все указал: listen 443 ssl http2;

    1. Здравствуйте, HTTP/2 тест https://tools.keycdn.com/http2-test показывает отсутствие поддержки протокола ALPN со стороны Вашего сервера (ALPN is not supported).

      Для использования HTTP/2 протокола требуется поддержка способа переключения с обычного TLS на него. Поддержка эта реализуется со стороны браузера и сервера. Сейчас таких способов 2: NPN (Next Protocol Negotiation) и ALPN (Application-Layer Protocol Negotiation). Первый устарел и заменён вторым. Но для использования ALPN нужен OpenSSL довольно свежей версии (1.0.2+), более старые поддерживают только NPN.

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

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