Как настроить Nginx с поддержкой HTTP/2 на Ubuntu 18.04

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 в Ubuntu nginx

Вы уже готовы обслуживать контент по протоколу 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-соединения.

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

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