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

Вступление

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

Одним из поддерживаемых протоколов является относительно новый HTTP / 2, который был опубликован в мае 2015 года. Основным преимуществом HTTP / 2 является высокая скорость передачи для богатых контентом сайтов.

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

Предпосылки

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

Это все. Если у вас есть все перечисленное выше, вы готовы к работе.

Различия между HTTP 1.1 и HTTP / 2

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.

[[step-1 -—- install-the-latest-version-of-nginx]] == Шаг 1. Установка последней версии Nginx

Поддержка протокола HTTP / 2 была введена в Nginx 1.9.5. К счастью, репозиторий по умолчанию в Ubuntu 16.04 содержит версию выше этой, поэтому нам не нужно добавлять сторонний репозиторий.

Сначала обновите список доступных пакетов в системе упаковки apt:

sudo apt-get update

Затем установите Nginx:

sudo apt-get install nginx

После завершения процесса установки вы можете проверить версию Nginx, набрав:

sudo nginx -v

Вывод должен быть похож на следующее:

Вывод sudo nginx -v

nginx version: nginx/1.10.0 (Ubuntu)

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

[[шаг-2 -—- изменение-прослушивающий порт-и-включение-http-2]] == Шаг 2 - изменение порта прослушивания и включение HTTP / 2

Первое изменение, которое мы сделаем, - изменим порт прослушивания с80 на443.

Давайте откроем файл конфигурации:

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

По умолчанию Nginx настроен на прослушивание порта 80, который является стандартным портом HTTP:

/etc/nginx/sites-available/default

listen 80 default_server;
listen [::]:80 default_server;

Как видите, у нас есть две разные переменныеlisten. Первый предназначен для всех подключений IPv4. Второй - для соединений IPv6. Мы включим шифрование для обоих.

Измените порт прослушивания на443, который используется протоколом HTTPS:

/etc/nginx/sites-available/default

listen 443 ssl http2 default_server;
listen [::]:443 ssl http2 default_server;

Обратите внимание, что в дополнение кssl мы также добавили в строкуhttp2. Эта переменная указывает Nginx использовать HTTP / 2 с поддерживаемыми браузерами.

[[step-3 -—- change-the-server-name]] == Шаг 3 - Изменение имени сервера

Мы используем записьserver_name, чтобы указать, какой домен должен быть связан с файлом конфигурации. Найдите записьserver_name в файле конфигурации.

По умолчанию дляserver_name установлено значение_ (подчеркивание), что означает, что файл конфигурации отвечает за все входящие запросы. Измените_ на свой фактический домен, например:

/etc/nginx/sites-available/default

server_name example.com;

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

Всякий раз, когда вы вносите изменения в файлы конфигурации 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

[[шаг-4-— добавление-SSL-сертификатов]] == Шаг 4 - Добавление сертификатов SSL

Далее вам необходимо настроить Nginx для использования вашего SSL-сертификата. Если вы не знаете, что такое SSL-сертификат или в настоящее время его не имеет, следуйте одному из руководств в разделе «Предварительные условия» этой статьи.

Создайте каталог для хранения ваших сертификатов SSL внутри каталога конфигурации Nginx:

sudo mkdir /etc/nginx/ssl

Скопируйте свой сертификат и закрытый ключ в это место. Мы также переименуем файлы, чтобы показать, с каким доменом они связаны. Это пригодится в будущем, когда с этим сервером связано несколько доменов. Заменитеexample.com своим фактическим именем хоста:

sudo cp /path/to/your/certificate.crt /etc/nginx/ssl/example.com.crt
sudo cp /path/to/your/private.key /etc/nginx/ssl/example.com.key

Теперь давайте снова откроем наш файл конфигурации и настроим SSL.

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

В новых строках внутри блокаserver определите расположение ваших сертификатов:

/etc/nginx/sites-available/default

ssl_certificate /etc/nginx/ssl/example.com.crt;
ssl_certificate_key /etc/nginx/ssl/example.com.key;

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

[[step-5 -—- избегание-old-cipher-suites]] == Шаг 5 - Избегание старых наборов шифров

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

Мы будем использовать действительно популярный набор шифров, безопасность которого была одобрена такими интернет-гигантами, как CloudFlare. Он не позволяет использовать шифрование MD5 (которое было известно как небезопасное с 1996 года, но, несмотря на это, его использование широко распространено и по сей день).

Откройте следующий файл конфигурации:

sudo nano /etc/nginx/nginx.conf

Добавьте эту строку послеssl_prefer_server_ciphers on;.

/etc/nginx/nginx.conf

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

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

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

sudo nginx -t

[[step-6 -—- Повышение-безопасности-обмена-ключами]] == Шаг 6 - Повышение безопасности обмена ключами

Первым шагом в установлении безопасного соединения является обмен секретными ключами между сервером и клиентом. Проблема в том, что до этого момента связь между ними не шифруется - это означает, что передача данных видна любой третьей стороне. Вот почему нам нужен алгоритм Диффи – Хеллмана – Меркла. Технические детали того, как это работает, - сложный вопрос, который нельзя объяснить в двух словах, но если вас действительно интересуют детали, вы можете посмотретьthis YouTube video.

По умолчанию Nginx использует 1028-битный ключ DHE (эфемерный Диффи-Хеллман), который относительно легко расшифровать. Чтобы обеспечить максимальную безопасность, мы должны создать наш собственный, более безопасный ключ DHE.

Для этого выполните следующую команду:

sudo openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048

[.note] # Помните, что мы должны генерировать параметры DH в той же папке, что и наши сертификаты SSL. В этом руководстве сертификаты расположены в/etc/nginx/ssl/. Причина этого в том, что Nginx всегда ищет предоставленный пользователем ключ DHE в папке сертификатов и использует его, если он существует.
#

Переменная после пути к файлу (в нашем случае это2048) указывает длину ключа. Ключ длиной 2048 бит является достаточно безопасным и имеетrecommended by the Mozilla Foundation, но если вы ищете еще большее шифрование, вы можете изменить его на4096.

Процесс генерации займет около 5 минут.

После завершения откройте файл конфигурации Nginx по умолчанию:

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

В новой строке внутри блокаserver определите местоположение вашего настраиваемого ключа DHE:

/etc/nginx/sites-available/default

ssl_dhparam  /etc/nginx/ssl/dhparam.pem;

[[step-7 -—- redirecting-all-http-request-to-https]] == Шаг 7. Перенаправление всех HTTP-запросов на HTTPS

Поскольку мы заинтересованы в обслуживании контента только через HTTPS, мы должны сообщить Nginx, что он должен делать, если сервер получает HTTP-запрос.

В нижней части нашего файла мы создадим новый блок сервера для перенаправления всех HTTP-запросов на HTTPS (обязательно замените имя сервера на ваше фактическое доменное имя):

/etc/nginx/sites-available/default

server {
       listen         80;
       listen    [::]:80;
       server_name    example.com;
       return         301 https://$server_name$request_uri;
}

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

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

sudo nginx -t

[[step-8 -—- reloading-nginx]] == Шаг 8. Перезагрузка Nginx

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

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

/etc/nginx/sites-available/default

server {
        listen 443 ssl http2 default_server;
        listen [::]:443 ssl http2 default_server;

        root /var/www/html;

        index index.html index.htm index.nginx-debian.html;

        server_name example.com;

        location / {
                try_files $uri $uri/ =404;
        }

        ssl_certificate /etc/nginx/ssl/example.com.crt;
        ssl_certificate_key /etc/nginx/ssl/example.com.key;
        ssl_dhparam /etc/nginx/ssl/dhparam.pem;
}


server {
       listen         80;
       listen    [::]:80;
       server_name    example.com;
       return         301 https://$server_name$request_uri;
}

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

sudo systemctl restart nginx

[[step-9 -—- verifying-the-changes]] == Шаг 9 - Проверка изменений

Давайте проверим, что наш сервер запущен и работает. Откройте свой веб-браузер и перейдите в свой домен (заменитеexample.com на свое фактическое доменное имя):

example.com

Если все настроено правильно, вы должны быть автоматически перенаправлены на HTTPS. Теперь давайте проверим, что HTTP / 2 работает: откройте Инструменты разработчика Chrome (ViewDeveloperDeveloper Tools) и перезагрузите страницу (ViewReload This Pageс). Затем перейдите на вкладкуNetwork, щелкните строку заголовка таблицы, которая начинается сName, щелкните ее правой кнопкой мыши и выберите параметрProtocol.

Теперь вы должны увидетьh2 (что означает HTTP / 2) в новом столбце вашего веб-сайта, обслуживающего контент HTTP / 2.

Chrome Developer Tools HTTP/2 check

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

[[step-10 -—- optimizing-nginx-for-best-performance]] == Шаг 10 - Оптимизация Nginx для лучшей производительности

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

Прежде всего, давайте откроемnginx.conf, набрав в консоли следующее:

sudo nano /etc/nginx/nginx.conf

Включение кэширования учетных данных подключения

По сравнению с HTTP HTTPS требует относительно больше времени для установления начального соединения между сервером и пользователем. Чтобы минимизировать эту разницу в скорости загрузки страницы, мы включим кэширование учетных данных подключения. Это означает, что вместо создания нового сеанса на каждой запрошенной странице сервер будет использовать вместо этого кэшированную версию учетных данных.

Чтобы включить кеширование сеанса, добавьте эти строки в конец блокаhttp вашего файлаnginx.conf:

/etc/nginx/nginx.conf

ssl_session_cache shared:SSL:5m;
ssl_session_timeout 1h;

ssl_session_cache указывает размер кеша, который будет содержать информацию о сеансе. 1 МБ памяти может хранить около 4000 сеансов. Значение по умолчанию 5 МБ будет более чем достаточно для большинства пользователей, но если вы ожидаете действительно большой трафик, вы можете соответственно увеличить это значение.

ssl_session_timeout ограничивает время хранения определенных сеансов в кеше. Это значение не должно быть слишком большим (более часа), но установка слишком низкого значения также не имеет смысла.

Включение HTTP Strict Transport Security (HSTS)

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

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

Добавьте эту строку вnginx.conf:

/etc/nginx/nginx.conf

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 restart nginx

Заключение

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

Related