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

Предыдущая версия этого руководства была написанаSergey Zhukaev.

Вступление

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

HTTP/2 is a new version of the Hypertext Transport Protocol, which is used on the Web to deliver pages from server to browser. HTTP/2 is the first major update of HTTP in almost two decades: HTTP1.1 was introduced to the public back in 1999 when webpages were usually just a single HTML file with inline CSS stylesheet. С тех пор Интернет резко изменился, и теперь мы сталкиваемся с ограничениями HTTP 1.1 - протокол ограничивает потенциальную скорость передачи для большинства современных веб-сайтов, поскольку он загружает части страницы в очереди (предыдущая часть должна быть полностью загружена перед загрузкой начинается следующая часть), и для средней современной веб-страницы требуется около 100 запросов на загрузку (каждый запрос - это изображение, файл js, файл css и т. д.).

HTTP/2 solves this problem because it brings a few fundamental changes:

  • Все запросы загружаются параллельно, а не в очереди

  • HTTP-заголовки сжаты

  • Страницы передаются в виде двоичного файла, а не в виде текстового файла, что более эффективно

  • Серверы могут «выдвигать» данные даже без запроса пользователя, что повышает скорость для пользователей с высокой задержкой

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

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

Предпосылки

Прежде чем мы начнем, нам нужно несколько вещей:

  • Один сервер Ubuntu 18.04, настроенный следующим образомthe Ubuntu 18.04 initial server setup guide, включая пользователя sudo без полномочий root и брандмауэр.

  • Nginx установлен на вашем сервере, что вы можете сделать, выполнивHow To Install Nginx on Ubuntu 18.04.

  • Доменное имя настроено так, чтобы оно указывало на ваш сервер. Вы можете приобрести один наNamecheap или получить бесплатно наFreenom. Вы можете узнать, как указать доменам в DigitalOcean Droplets, следуя руководствуHow To Set Up a Host Name with DigitalOcean.

  • Сертификат TLS / SSL настроен для вашего сервера. У вас есть три варианта:

  • Nginx настроен для перенаправления трафика с порта80 на порт443, что должно соответствовать предыдущим предварительным требованиям.

  • Nginx настроен на использование 2048-битного ключа Ephemeral Diffie-Hellman (DHE) или выше, который также должен охватываться предыдущими предпосылками.

[[step-1 -—- enable-http-2-support]] == Шаг 1. Включение поддержки HTTP / 2

Если вы следовалиserver block set up step in the Nginx installation tutorial, у вас должен быть серверный блок для вашего домена в/etc/nginx/sites-available/your_domain с уже установленным соответствующим образом директивой server_name. Первым изменением, которое мы сделаем, будет изменение блока сервера вашего домена для использования HTTP / 2.

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

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

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

your_domain’>/etc/nginx/sites-available/your_domain

...
    listen [::]:443 ssl ipv6only=on;
    listen 443 ssl;
...

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

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

your_domain’>/etc/nginx/sites-available/your_domain

...
    listen [::]:443 ssl http2 ipv6only=on;
    listen 443 ssl http2;
...

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

Сохраните файл конфигурации и отредактируйте текстовый редактор.

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

sudo nginx -t

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

Вывод sudo nginx -t

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

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

[[step-2 -—- remove-old-and-insecure-cipher-suites]] == Шаг 2. Удаление старых и небезопасных наборов шифров

HTTP/2 has a blacklist of old and insecure ciphers, so we must avoid them. Наборы шифров - это криптографические алгоритмы, которые описывают, как передаваемые данные должны быть зашифрованы.

Метод, который вы будете использовать для определения шифров, зависит от того, как вы настроили свои сертификаты 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, и закомментируйте ее:

your_domain’>/etc/nginx/sites-available/your_domain

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

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

your_domain’>/etc/nginx/sites-available/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 в текстовом редакторе:

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;

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

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

sudo nginx -t

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

Как только вы не увидите синтаксических ошибок, перезапустите Nginx:

sudo systemctl reload nginx

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

[[step-3 -—- verifying-that-http-2-is-enabled]] == Шаг 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://your_domain. Откройте Инструменты разработчика Chrome (ViewDeveloperDeveloper Tools) и перезагрузите страницу (ViewReload This Page). Перейдите на вкладкуNetwork, щелкните правой кнопкой мыши строку заголовка таблицы, которая начинается сName, и выберите опциюProtocol во всплывающем меню.

Вы увидитеh2 (что означает HTTP / 2) в новом столбцеProtocol, указывая, что HTTP / 2 работает.

Chrome Developer Tools HTTP/2 check

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

[[step-4 -—- enable-http-strict-transport-security-hsts]] == Шаг 4. Включение строгой безопасности транспорта HTTP (HSTS)

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

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

sudo nano /etc/nginx/nginx.conf

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

/etc/nginx/nginx.conf

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 в конце строки, например:

/etc/nginx/nginx.conf

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 + для безопасности.

Related