Как настроить Nginx с поддержкой HTTP/2 в Ubuntu 18.04
Предыдущая версия этого руководства была написана Сергеем Жукаевым.
Введение
Nginx — это быстрый и надежный веб-сервер с открытым исходным кодом. Он завоевал свою популярность благодаря небольшому объему памяти, высокой масштабируемости, простоте настройки и поддержке большого количества протоколов.
HTTP/2 — это новая версия протокола передачи гипертекста, который используется в Интернете для доставки страниц с сервера в браузер. HTTP/2 — это первое крупное обновление HTTP почти за два десятилетия: HTTP1.1 был представлен публике еще в 1999 году, когда веб-страницы обычно представляли собой один файл HTML со встроенной таблицей стилей CSS. Интернет сильно изменился с тех пор, и теперь мы сталкиваемся с ограничениями HTTP 1.1 — протокол ограничивает потенциальную скорость передачи для большинства современных веб-сайтов, потому что он загружает части страницы в очереди (предыдущая часть должна быть загружена полностью, прежде чем будет загружена последняя). начинается следующая часть), и в среднем современная веб-страница требует для загрузки около 100 запросов (каждый запрос представляет собой изображение, файл js, файл css и т. д.).
HTTP/2 решает эту проблему, поскольку вносит несколько фундаментальных изменений:
- Все запросы загружаются параллельно, а не в очередь.
- Заголовки HTTP сжаты
- Страницы передаются как двоичные, а не как текстовые файлы, что более эффективно
- Серверы могут «отправлять» данные даже без запроса пользователя, что повышает скорость для пользователей с высокой задержкой.
Несмотря на то, что HTTP/2 не требует шифрования, разработчики двух самых популярных браузеров, Google Chrome и Mozilla Firefox, заявили, что из соображений безопасности они будут поддерживать HTTP/2 только для HTTPS-соединений. Следовательно, если вы решите настроить серверы с поддержкой HTTP/2, вы также должны защитить их с помощью HTTPS.
Это руководство поможет вам настроить быстрый и безопасный сервер Nginx с поддержкой HTTP/2.
Предпосылки
Прежде чем мы начнем, нам понадобится несколько вещей:
- Один сервер Ubuntu 18.04, настроенный в соответствии с руководством по первоначальной настройке сервера Ubuntu 18.04, включая пользователя без полномочий root и брандмауэр.
- Nginx установлен на вашем сервере, что вы можете сделать, следуя инструкциям по установке Nginx в Ubuntu 18.04.
- Доменное имя, настроенное так, чтобы оно указывало на ваш сервер. Вы можете приобрести его на странице Как управлять своим доменом с помощью DigitalOcean.
- Сертификат TLS/SSL, настроенный для вашего сервера. У вас есть три варианта:
- Вы можете получить бесплатный сертификат из статьи Как защитить Nginx с помощью Let’s Encrypt в Ubuntu 18.04.
- Вы также можете создать и настроить самозаверяющий сертификат, следуя инструкциям Как создать самозаверяющий SSL-сертификат для Nginx в Ubuntu 18.04.
- Вы можете узнать, как создать самозаверяющий SSL-сертификат для Nginx в Ubuntu 18.04.
Шаг 1 — Включение поддержки HTTP/2
Если вы выполнили шаг настройки блока сервера в руководстве по установке Nginx, у вас должен быть блок сервера для вашего домена в
/etc/nginx/sites-available/your_domain
с директиваserver_name
уже установлена соответствующим образом. Первым изменением, которое мы внесем, будет изменение блока сервера вашего домена для использования HTTP/2.Откройте файл конфигурации для вашего домена:
- sudo nano /etc/nginx/sites-available/your_domain
В файле найдите переменные
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 с поддерживаемыми браузерами.
Сохраните файл конфигурации и выйдите из текстового редактора.
Всякий раз, когда вы вносите изменения в файлы конфигурации 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 имеет черный список старых и небезопасных шифров, поэтому мы должны избегать их. Наборы шифров — это криптографические алгоритмы, которые описывают, как должны быть зашифрованы передаваемые данные.
Метод, который вы будете использовать для определения шифров, зависит от того, как вы настроили сертификаты TLS/SSL для Nginx.
Если вы использовали 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 reload nginx
Перезапустив сервер, давайте проверим, работает ли он.
Шаг 3 — Проверка того, что HTTP/2 включен
Давайте удостоверимся, что сервер работает и работает с HTTP/2.
Используйте команду
curl
, чтобы сделать запрос на ваш сайт и просмотреть заголовки:- curl -I -L https://your_domain
Вы увидите следующий вывод:
OutputHTTP/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://ваш_домен
. Откройте инструменты разработчика Chrome (Просмотр -> Разработчик -> Инструменты разработчика) и перезагрузите страницу (Просмотр -> Перезагрузить эту страницу). Перейдите на вкладку «Сеть», щелкните правой кнопкой мыши строку заголовка таблицы, начинающуюся с «Имя», и выберите параметр «Протокол» во всплывающем меню.Вы увидите
h2
(что означает HTTP/2) в новом столбце протокола, что указывает на то, что HTTP/2 работает.На этом этапе вы готовы обслуживать контент по протоколу HTTP/2. Давайте повысим безопасность и производительность, включив HSTS.
Шаг 4 — Включение HTTP Strict Transport Security (HSTS)
Несмотря на то, что ваши HTTP-запросы перенаправляются на HTTPS, вы можете включить Строгую транспортную безопасность HTTP (HSTS), чтобы избежать таких переадресаций. Если браузер находит заголовок 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 reload nginx
Заключение
Ваш сервер Nginx теперь обслуживает страницы HTTP/2. Если вы хотите проверить надежность вашего SSL-соединения, посетите Qualys SSL Lab и запустите тест на своем сервере. Если все настроено правильно, вы должны получить оценку A+ по безопасности.