Nginx известен своей скоростью и надежностью как веб-сервер с открытым исходным кодом. Он популярен благодаря низким требованиям к памяти, высокой масштабируемости, простоте настройки и поддержке многих протоколов.
Гипертекстовый транспортный протокол — это то, откуда недавно произошел HTTP/2. Последний используется в Сети для доставки страниц от сервера к браузеру. HTTP/2 — это первое крупное обновление HTTP за почти двадцать лет. Протокол HTTP 1.1 был представлен общественности в конце XX века, когда веб-страницы представляли собой один длинный HTML-файл с встроенной таблицей стилей CSS. После этого Интернет претерпел значительные изменения, и теперь мы сталкиваемся с ограничениями HTTP 1.1. Из-за того, что он загружает части страницы в порядке очереди (загрузка следующего раздела может начаться только после завершения предыдущего), он снижает достижимую скорость передачи данных для большинства современных веб-сайтов; в среднем каждая современная веб-страница требует примерно 100 запросов для загрузки (каждый запрос — это картинка, JS-файл, CSS-файл и т. д.).
Почему HTTP/2 :
HTTP/2 позволяет решить эту проблему за счет некоторых базовых изменений:
- Загрузка запросов осуществляется параллельно, а не в порядке очереди.
- Заголовки HTTP сжимаются.
- Передача страниц осуществляется не в виде текстового файла, а в виде бинарного файла для достижения лучших результатов.
- Серверы могут «проталкивать» данные даже без запроса пользователя, что повышает скорость для пользователей с высокой задержкой.
- Серверы могут «проталкивать» данные независимо от запроса пользователя, и это полезно для пользователей с высокой задержкой, обеспечивая им большую скорость.
Несмотря на то что HTTP/2 не требует шифрования, разработчики Google Chrome и Mozilla Firefox, самых распространенных браузеров в Интернете, заявили, что в целях безопасности они будут поддерживать HTTP/2 только для HTTPS-соединений. Учитывая это, если вы решите использовать поддержку HTTP/2 для настройки серверов, вам также нужно будет защитить их с помощью HTTPS.
Мы предлагаем вам это руководство, которое поможет вам использовать поддержку HTTP/2 для создания быстрого и безопасного сервера Nginx.
Предварительные условия
Прежде всего, перед началом работы необходимо выполнить следующие действия:
- Установите один сервер Ubuntu 18.04.
- Установите Nginx на свой сервер.
- Настройте доменное имя, указывающее на ваш сервер. Вы можете зарегистрировать дешевые доменные имена здесь.
- Настройте сертификат TLS/SSL для вашего сервера. Есть три варианта:
- Получение бесплатного сертификата от Let’s Encrypt
- Генерация и настройка самоподписанного сертификата
- Покупка сертификата у другого поставщика и настройка Nginx для его использования
- Настройте Nginx на перенаправление трафика с порта 80 на порт 443, что уже описано в предварительных требованиях.
- Настройте Nginx на использование 2048-битного или более сильного эфемерного ключа Диффи-Хеллмана (DHE), что также должно быть указано в предыдущих требованиях.
Шаг 1 — Активация поддержки HTTP/2
Во-первых, ваш домен уже должен иметь серверный блок по адресу /etc/nginx/sites-available/your_domain с имя_сервера директива установлена соответствующим образом. Первым изменением будет разрешение серверному блоку вашего домена использовать HTTP/2 путем его модификации.
Запустите файл конфигурации вашего домена:
$ sudo nano /etc/nginx/sites-available/your_domain
Найдите слушать переменные, связанные с портом 443 в файле:
... listen [::]:443 ssl ipv6only=on; listen 443 ssl; ...
Первая переменная относится к соединениям IPv6, а вторая — ко всем соединениям IPv4. HTTP/2 должен быть включен для обоих.
Каждый слушать директива должна быть изменена, чтобы включать http2:
... listen [::]:443 ssl http2 ipv6only=on; listen 443 ssl http2; ...
Это запрос на использование HTTP/2 в Nginx с поддерживаемыми браузерами.
После сохранения файла конфигурации отредактируйте его в текстовом редакторе.
Каждый раз, когда вносятся изменения в конфигурационные файлы Nginx, обязательно обращайте внимание на синтаксические ошибки в конфигурации, через:
$ sudo nginx -t
Если синтаксис не содержит ошибок, будет выведено следующее сообщение:
Вывод:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful
После этого наш сервер должен быть настроен на использование более определенного списка шифров.
Шаг 2 — Удаление старых и небезопасных наборов шифров
В HTTP/2 существует черный список старых и небезопасных шифров, которых следует избегать. Наборы шифров — это криптографические алгоритмы, описывающие способ шифрования передаваемых данных.
Метод, который вы должны использовать для определения шифров, зависит от выбранной вами конфигурации сертификатов Nginx TLS/SSL.
Если вы получили сертификаты через Certbot, то файл /etc/letsencrypt/options-ssl-nginx.conf был создан и содержит шифры, недостаточно мощные для HTTP/2. К сожалению, при изменении этого файла Certbot не сможет применять обновления в будущем. В этом случае мы скажем Nginx не использовать этот файл и укажем собственный список шифров.
Запустите файл конфигурации серверного блока вашего домена:
sudo nano /etc/nginx/sites-available/your_domain
Определите строку, в которой есть символ options-ssl-nginx.conf и закомментируйте его:
# include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
Добавьте следующую строку под этой, чтобы определить разрешенные шифры:
ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
Выйдите из редактора после сохранения файла.
В текстовом редакторе откройте файл /etc/nginx/snippets/ssl-params.conf если вы использовали самоподписанные сертификаты или сертификаты сторонних производителей и настроили их в соответствии с предварительными условиями:
$ sudo nano /etc/nginx/snippets/ssl-params.conf
Найдите эту строку:
... ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
Отредактируйте ее так, чтобы она выглядела следующим образом:
... ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
Выйдите из редактора после сохранения файла.
Убедитесь, что и в этот раз вы проверили конфигурацию на наличие синтаксических ошибок:
$ sudo nginx -t
Если вы обнаружили ошибку, устраните ее, а затем протестируйте снова.
Перезапустите Nginx, когда ошибок синтаксиса больше не будет
$ sudo systemctl restart nginx
Перезапустите Nginx, когда больше не будет синтаксических ошибок
Шаг 3 — Проверка активации HTTP/2
Мы должны убедиться, что сервер запущен и может работать с HTTP/2.
Сделайте запрос к вашему сайту, используя curl и просмотрите заголовки:
$ curl -I -L https://your_domain
Появится следующий вывод:
Выходные данные:
HTTP/1.1 301 Moved Permanently Server: nginx/1.14.0 (Ubuntu) Date: Fri, 06 Jul 2018 19:07:12 GMT Content-Type: text/html Content-Length: 194 Connection: keep-alive Location: https://your_domain/ HTTP/2 200 server: nginx/1.14.0 (Ubuntu) date: Fri, 06 Jul 2018 19:07:12 GMT content-type: text/html content-length: 16 last-modified: Fri, 06 Jul 2018 16:55:37 GMT etag: "5b3f9f09-10" accept-ranges: bytes
Также можно проверить, работает ли HTTP/2 в Google Chrome. Запустите Chrome и перейдите по ссылке http://your_domain. Откройте инструменты разработчика Chrome (Посмотреть ⇒ Разработчик ⇒ Инструменты разработчика), , затем перезагрузите страницу (Посмотреть ⇒ Перезагрузить эту страницу). Перейти к Сеть вкладка, щелкните правой кнопкой мыши строку заголовка таблицы, начинающуюся с «имя», , затем выберите Протокол из всплывающего меню.
Вы увидите h2 (со ссылкой на HTTP/2) в новом Протокол столбец, который указывает на то, что HTTP/2 работает.

Вы уже готовы обслуживать контент по протоколу HTTP/2. Давайте перейдем к повышению безопасности и производительности путем включения HSTS.
Шаг 4 — Включение HTTP Strict Transport Security (HSTS)
Вы можете включить HTTP Strict Transport Security (HSTS), чтобы избежать необходимости делать перенаправления на HTTPS, даже если ваши HTTP-запросы включают его. Если браузер обнаружит заголовок HSTS, он не будет пытаться подключиться к серверу по обычному HTTP в течение некоторого времени. Несмотря ни на что, для обмена данными он будет использовать только зашифрованное HTTPS-соединение. Этот заголовок также защищает нас от Атаки с понижением рейтинга.
В редакторе запустите файл конфигурации Nginx:
sudo nano /etc/nginx/nginx.conf
Добавьте эту строку в файл, чтобы активировать HSTS:
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 задается в секундах. Значение 15768000 эквивалентно 6 месяцам.
По умолчанию этот заголовок не добавляется к запросам субдоменов. Если у вас есть поддомены и вы хотите, чтобы к ним применялся HSTS, добавьте параметр includeSubDomains переменную в конце строки следующим образом:
add_header Strict-Transport-Security "max-age=15768000; includeSubDomains" always;
Выйдите из редактора после сохранения файла.
Проверьте синтаксические ошибки в конфигурации и на этот раз:
$ sudo nginx -t
Наконец, чтобы применить изменения, перезапустите сервер Nginx
$ sudo systemctl restart nginx
Заключение
Ваш сервер Nginx теперь обслуживает страницы HTTP/2. Запустите тест на своем сервере, если хотите проверить прочность SSL-соединения.