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.
Предварительные требования
Прежде чем начать, вам понадобятся несколько вещей:
- Сервер с Ubuntu 22.04, настроенный в соответствии с руководством по начальной настройке сервера Ubuntu 22.04, включая пользователя с sudo-правами и настроенный брандмауэр.
- Nginx установленный на вашем сервере, что можно сделать, следуя инструкции по установке Nginx на Ubuntu 22.04.
- A domain name configured to point to your server. You can purchase one on Namecheap or get one for free on Freenom. You can learn how to point domains to DigitalOcean Droplets by following the documentation on How To Manage Your Domain With DigitalOcean.
- A TLS/SSL certificate configured for your server. You have two options:
- Вы можете получить бесплатный сертификат от Let’s Encrypt, следуя инструкции по обеспечению безопасности Nginx с помощью Let’s Encrypt на Ubuntu 22.04.
- Вы также можете создать и настроить самоподписанный сертификат, следуя Как создать самоподписанный SSL-сертификат для Nginx в Ubuntu 22.04.
- Nginx настроен на перенаправление трафика с порта
80
на порт443
, что должно быть охвачено предыдущими предварительными условиями. - Nginx настроен на использование ключа Эфемерного Диффи-Хеллмана (DHE) с длиной 2048 бит или выше, что также должно быть охвачено предыдущими предварительными условиями.
Шаг 1 — Включение поддержки HTTP/2
Если вы следовали настройке блока сервера в руководстве по установке Nginx, у вас должен быть блок сервера для вашего домена в /etc/nginx/sites-available/ваш_домен
с уже правильно установленной директивой server_name
. Первое изменение, которое мы сделаем, будет заключаться в том, чтобы изменить блок сервера вашего домена для использования HTTP/2.
Откройте файл конфигурации вашего домена с помощью nano
или вашего предпочтительного редактора:
В файле найдите переменные listen
, связанные с портом 443
:
...
listen [::]:443 ssl ipv6only=on;
listen 443 ssl;
...
Первый используется для соединений IPv6. Второй – для всех соединений IPv4. Мы включим HTTP/2 для обоих.
Измените каждую директиву listen
, чтобы добавить http2
:
...
listen [::]:443 ssl http2 ipv6only=on;
listen 443 ssl http2;
...
Это указывает Nginx использовать HTTP/2 с поддерживаемыми браузерами.
Сохраните файл конфигурации и выйдите из текстового редактора. Если вы используете nano
, нажмите Ctrl+X
, затем, когда будет запрос, Y
, а затем Enter.
Всегда, когда вы вносите изменения в файлы конфигурации Nginx, вы должны проверить конфигурацию на наличие ошибок, используя флаг -t
, который запускает встроенную команду проверки синтаксиса Nginx:
Если синтаксис безошибочный, вы получите вывод, подобный следующему:
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
, и закомментируйте ее, добавив символ #
в начале строки:
# 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
в вашем текстовом редакторе:
Найдите следующую строку:
...
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;
Сохраните файл и закройте ваш редактор.
Еще раз проверьте конфигурацию на наличие синтаксических ошибок с помощью команды nginx -t
:
Если вы столкнетесь с какими-либо ошибками, устраните их и выполните повторную проверку.
После того как ваша конфигурация пройдет проверку синтаксиса, перезапустите Nginx с помощью команды systemctl
:
После перезапуска сервера давайте убедимся, что он работает.
Шаг 3 — Проверка включения HTTP/2
Давайте убедимся, что сервер работает с протоколом HTTP/2.
Используйте команду curl
, чтобы сделать запрос на ваш сайт и просмотреть заголовки:
Вы получите вывод, подобный следующему:
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:
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
в конце строки, как показано здесь:
add_header Strict-Transport-Security "max-age=15768000; includeSubDomains" always;
Сохраните файл и закройте редактор.
Еще раз проверьте конфигурацию на наличие синтаксических ошибок:
Наконец, перезапустите сервер Nginx, чтобы применить изменения.
Заключение
Ваш сервер Nginx теперь обслуживает страницы HTTP/2. Если вы хотите протестировать надежность вашего SSL-соединения, пожалуйста, посетите Qualys SSL Lab и выполните тест на вашем сервере. Если все настроено правильно, вы должны получить оценку A+ по безопасности.
Чтобы узнать больше о том, как Nginx разбирает и применяет правила блоков серверов, попробуйте прочитать Понимание алгоритмов выбора блоков серверов и местоположений в Nginx.