Предыдущая версия этого руководства была написана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 настроен для вашего сервера. У вас есть три варианта:
-
Вы можете получить бесплатный сертификат отLet’s Encrypt, подписавшись наHow to Secure Nginx with Let’s Encrypt on Ubuntu 18.04.
-
Вы также можете создать и настроить самоподписанный сертификат, выполнивHow to Create a Self-signed SSL Certificate for Nginx in Ubuntu 18.04.
-
Вы можетеbuy one from another provider и настроить Nginx для его использования, выполнив шаги 2–6 изHow to Create a Self-signed SSL Certificate for Nginx in Ubuntu 18.04.
-
-
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 (View →Developer →Developer Tools) и перезагрузите страницу (View →Reload This Page). Перейдите на вкладкуNetwork, щелкните правой кнопкой мыши строку заголовка таблицы, которая начинается сName, и выберите опциюProtocol во всплывающем меню.
Вы увидитеh2
(что означает HTTP / 2) в новом столбцеProtocol, указывая, что HTTP / 2 работает.
На данный момент вы готовы обслуживать контент по протоколу 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 + для безопасности.