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

A previous version of this tutorial was written by Sergey Zhukaev.

Введение

Nginx – быстрый и надежный веб-сервер с открытым исходным кодом. Он завоевал популярность благодаря низкому потреблению памяти, высокой масштабируемости, простоте настройки и поддержке широкого спектра протоколов.

HTTP/2 – это новая версия Протокола передачи гипертекста, который используется в Интернете для передачи страниц с сервера на браузер. HTTP/2 является первым крупным обновлением HTTP за почти два десятилетия: HTTP1.1 был представлен общественности еще в 1999 году, когда размеры веб-страниц были намного меньше. Интернет значительно изменился с тех пор, и сейчас мы сталкиваемся с ограничениями HTTP 1.1. Протокол ограничивает потенциальные скорости передачи для большинства современных веб-сайтов, потому что он загружает части страницы по очереди – предыдущая часть должна полностью загрузиться, прежде чем начнется загрузка следующей части – а средняя современная веб-страница загружает десятки отдельных ресурсов CSS, javascript и изображений.

HTTP/2 решает эту проблему, потому что он вносит несколько фундаментальных изменений:

  • Все запросы загружаются параллельно, а не по очереди
  • Заголовки HTTP сжимаются
  • Страницы передаются в виде двоичных данных, а не как текстовый файл, что более эффективно
  • Серверы могут «продвигать» данные даже без запроса пользователя, что улучшает скорость для пользователей с высокой задержкой

Хотя HTTP/2 не требует шифрования, разработчики двух самых популярных браузеров, Google Chrome и Mozilla Firefox, заявили, что по соображениям безопасности они будут поддерживать HTTP/2 только для HTTPS-соединений. Следовательно, если вы решите настроить серверы с поддержкой HTTP/2, вы также должны обеспечить их безопасность с помощью HTTPS.

Этот учебник поможет вам настроить быстрый и безопасный сервер Nginx с поддержкой HTTP/2.

Предварительные требования

Прежде чем начать, вам понадобятся несколько вещей:

Шаг 1 — Включение поддержки HTTP/2

Если вы следовали настройке блока сервера в руководстве по установке Nginx, у вас должен быть блок сервера для вашего домена в /etc/nginx/sites-available/ваш_домен с уже правильно установленной директивой server_name. Первое изменение, которое мы сделаем, будет заключаться в том, чтобы изменить блок сервера вашего домена для использования HTTP/2.

Откройте файл конфигурации вашего домена с помощью nano или вашего предпочтительного редактора:

  1. sudo nano /etc/nginx/sites-enabled/your_domain

В файле найдите переменные listen, связанные с портом 443:

/etc/nginx/sites-enabled/your_domain
...
    listen [::]:443 ssl ipv6only=on; 
    listen 443 ssl; 
...

Первый используется для соединений IPv6. Второй – для всех соединений IPv4. Мы включим HTTP/2 для обоих.

Измените каждую директиву listen, чтобы добавить http2:

/etc/nginx/sites-enabled/your_domain
...
    listen [::]:443 ssl http2 ipv6only=on; 
    listen 443 ssl http2; 
...

Это указывает Nginx использовать HTTP/2 с поддерживаемыми браузерами.

Сохраните файл конфигурации и выйдите из текстового редактора. Если вы используете nano, нажмите Ctrl+X, затем, когда будет запрос, Y, а затем Enter.

Всегда, когда вы вносите изменения в файлы конфигурации Nginx, вы должны проверить конфигурацию на наличие ошибок, используя флаг -t, который запускает встроенную команду проверки синтаксиса Nginx:

  1. sudo nginx -t

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

Output of sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Затем вы настроите ваш сервер Nginx на использование более строгого списка шифров для улучшения безопасности сервера.

Шаг 2 — Удаление старых и небезопасных наборов шифров

У HTTP/2 есть черный список старых и небезопасных шифров, которые следует избегать. Наборы шифров – это криптографические алгоритмы, которые описывают, как данные должны быть зашифрованы во время передачи.

Метод, который вы будете использовать для определения шифров, зависит от того, как вы настроили ваши сертификаты TLS/SSL для Nginx.

Если вы использовали Certbot для получения своих сертификатов, он также создал файл /etc/letsencrypt/options-ssl-nginx.conf, который содержит шифры, недостаточно безопасные для HTTP/2. Однако изменение этого файла предотвратит применение обновлений Certbot в будущем, поэтому мы просто скажем Nginx не использовать этот файл, а мы сами укажем наш список шифров.

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

sudo nano /etc/nginx/sites-enabled/your_domain

Найдите строку, которая включает файл options-ssl-nginx.conf, и закомментируйте ее, добавив символ # в начале строки:

/etc/nginx/sites-enabled/your_domain

# include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot

Ниже этой строки добавьте эту строку, чтобы определить допустимые шифры:

/etc/nginx/sites-enabled/your_domain

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

Сохраните файл и выйдите из редактора.

Если вы использовали самоподписанные сертификаты или сертификат от третьей стороны и настроили его в соответствии с предварительными требованиями, откройте файл /etc/nginx/snippets/ssl-params.conf в вашем текстовом редакторе:

  1. sudo nano /etc/nginx/snippets/ssl-params.conf

Найдите следующую строку:

/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;
...

Измените ее, чтобы использовать следующий список шифров:

/etc/nginx/snippets/ssl-params.conf

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

Сохраните файл и закройте ваш редактор.

Еще раз проверьте конфигурацию на наличие синтаксических ошибок с помощью команды nginx -t:

  1. sudo nginx -t

Если вы столкнетесь с какими-либо ошибками, устраните их и выполните повторную проверку.

После того как ваша конфигурация пройдет проверку синтаксиса, перезапустите Nginx с помощью команды systemctl:

  1. sudo systemctl reload nginx.service

После перезапуска сервера давайте убедимся, что он работает.

Шаг 3 — Проверка включения HTTP/2

Давайте убедимся, что сервер работает с протоколом HTTP/2.

Используйте команду curl, чтобы сделать запрос на ваш сайт и просмотреть заголовки:

  1. curl -I -L --http2 https://your_domain

Вы получите вывод, подобный следующему:

HTTP/2 200
**Server**: nginx/1.18.0 (Ubuntu)
**Date**: Tue, 21 Jun 2022 22:19:09 GMT
**Content-Type**: text/html
**Content-Length**: 612
**Last-Modified**: Tue, 21 Jun 2022 22:17:56 GMT
**Connection**: keep-alive
**ETag**: "62b24394-264"
**Accept-Ranges**: bytes

Вы также можете проверить, что HTTP/2 используется в Google Chrome. Откройте Chrome и перейдите по адресу https://ваш_домен. Откройте инструменты разработчика Chrome (Вид -> Разработчик -> Инструменты разработчика) и перезагрузите страницу (Вид -> Перезагрузить эту страницу). Перейдите на вкладку Сеть, щелкните правой кнопкой мыши по строке заголовка таблицы, начинающейся с Имя, и выберите опцию Протокол из всплывающего меню.

У вас будет новый столбец Протокол, содержащий h2 (что означает HTTP/2), указывающий на то, что HTTP/2 работает.

На этом этапе вы готовы предоставлять контент через протокол HTTP/2. Давайте улучшим безопасность и производительность, включив HSTS.

Шаг 4 — Включение HTTP Strict Transport Security (HSTS)

Несмотря на то что ваши запросы HTTP перенаправляются на HTTPS, вы можете включить HTTP Strict Transport Security (HSTS), чтобы избежать необходимости этих перенаправлений. Если браузер обнаруживает заголовок HSTS, он больше не будет пытаться подключаться к серверу через обычный HTTP в течение определенного периода времени. В любом случае он будет обмениваться данными только через зашифрованное соединение HTTPS. Этот заголовок также защищает от атак типа снижение протокола.

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

sudo nano /etc/nginx/your_domain

Добавьте эту строку в тот же блок файла, содержащий шифры SSL, чтобы включить HSTS:

/etc/nginx/your_domain
server {
...
    ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
    add_header Strict-Transport-Security "max-age=15768000" always;
}
...

Значение max-age указывается в секундах. Значение 15768000 эквивалентно 6 месяцам.

По умолчанию этот заголовок не добавляется к запросам поддоменов. Если у вас есть поддомены и вы хотите, чтобы HSTS применялся ко всем, вы должны добавить переменную includeSubDomains в конце строки, как показано здесь:

/etc/nginx/your_domain
add_header Strict-Transport-Security "max-age=15768000; includeSubDomains" always;

Сохраните файл и закройте редактор.

Еще раз проверьте конфигурацию на наличие синтаксических ошибок:

  1. sudo nginx -t

Наконец, перезапустите сервер Nginx, чтобы применить изменения.

  1. sudo systemctl reload nginx.service

Заключение

Ваш сервер Nginx теперь обслуживает страницы HTTP/2. Если вы хотите протестировать надежность вашего SSL-соединения, пожалуйста, посетите Qualys SSL Lab и выполните тест на вашем сервере. Если все настроено правильно, вы должны получить оценку A+ по безопасности.

Чтобы узнать больше о том, как Nginx разбирает и применяет правила блоков серверов, попробуйте прочитать Понимание алгоритмов выбора блоков серверов и местоположений в Nginx.

Source:
https://www.digitalocean.com/community/tutorials/how-to-set-up-nginx-with-http-2-support-on-ubuntu-22-04