Настройка Nginx с поддержкой HTTP/2 в Ubuntu 16.04

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

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

Требования

  • Сервер Ubuntu 16.04.
  • Не-root пользователь с правами sudo; о настройке расширенных прав можно прочитать в этом руководстве.
  • Зарегистрированный домен. Его можно купить на Namecheap или получить бесплатно на Freenom. Не забудьте направить домен на сервер.
  • Сертификат SSL. Сгенерируйте самоподписанный сертификат, получите бесплатный от Let’s Encrypt или закажите его у другого провайдера.

HTTP 1.1 и HTTP/2: в чём разница?

HTTP/2 – новая версия транспортного протокола передачи гипертекста, который используется для передачи страниц с сервера в браузер. HTTP/2 – первое серьёзное обновление HTTP/2 за почти два десятилетия: текущая версия протокола, HTTP 1.1, была представлена еще в 1999 году, когда веб-страницы, как правило, представляли собой всего один HTML-файл с встроенной таблицей стилей CSS. За последние 16 лет сеть Интернет кардинально изменилась, и теперь пользователи часто сталкиваются с ограничениями, связанными с протоколом HTTP 1.1. В частности, протокол ограничивает потенциальную скорость передачи для большинства современных веб-сайтов, поскольку он загружает страницы по частям (предыдущая часть должна быть полностью загружена, прежде чем начнётся загрузка следующей части); кроме того, для загрузки среднестатистической современной веб-страницы требуется около 100 запросов (каждый запрос представляет собой изображение, JS-файл, CSS-файл и т.д.).

Протокол HTTP/2 устраняет эти проблемы, поскольку он имеет ряд фундаментальных изменений:

  • Запросы загружаются параллельно, а не по очереди.
  • HTTP-заголовки сжимаются.
  • Страница передаётся в виде двоичного, а не текстового файла.
  • Сервер может передавать данные даже без запроса пользователя, что позволяет повысить скорость.

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

1: Установка Nginx

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

Обновите список пакетов:

sudo apt-get update

Установите Nginx:

sudo apt-get install nginx

После завершения установки запросите версию пакета, чтобы убедиться, что всё работает:

sudo nginx -v

Команда вернёт:

nginx version: nginx/1.10.0 (Ubuntu)

Теперь можно отредактировать стандартные конфигурации веб-сервера.

2: Настройка порта и включение HTTP/2

Сначала нужно изменить номер прослушиваемого порта 80 на 443.

Откройте конфигурационный файл:

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

Укажите, какой порт должен прослушивать веб-сервер Nginx. По умолчанию он слушает порт 80, это стандартный порт HTTP.

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

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

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

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

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

3: Изменение имени сервера

После директивы listen идёт директива server_name. Она задаёт доменное имя, которое должно быть связано с конфигурационным файлом Nginx. Стандартным значением server_name является символ нижнего прочерка (_), что значит, что за все входящие запросы отвечает конфигурационный файл. Замените нижний прочерк своим доменом.

server_name example.com;

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

Проверьте синтаксис на ошибки:

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-сертификата

Теперь нужно настроить Nginx для поддержки SSL-сертификата.

Примечание: Ссылки на вспомогательные статьи можно найти в разделе «Требования».

Создайте каталог для хранения сертификатов в каталоге настроек веб-сервера:

sudo mkdir /etc/nginx/ssl

Скопируйте в него сертификат и закрытый ключ. Переименуйте эти файлы. Укажите в имени домен, к которому привязан данный сертификат:

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

Примечание: Замените условный домен example.com своим доменным именем.

Откройте конфигурационный файл и добавьте в него настойки SSL.

В блоке server определите маршрут к файлам сертификата:

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

5: Отключение устаревших шифров

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

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

Откройте файл:

sudo nano /etc/nginx/nginx.conf

Добавьте после ssl_prefer_server_ciphers on следующую строку:

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

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

sudo nginx -t

6: Повышение безопасности обмена ключами

Первый этап в установке безопасного соединения – это обмен закрытыми ключами между сервером и клиентом. Однако на момент обмена ключами соединение никак не защищено, а значит, передаваемые данные видны любому стороннему пользователю. Потому нужно настроить алгоритм Диффи-Хеллмана-Меркла.

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

Чтобы повысить защиту сервера, нужно сгенерировать новый ключ DHE.

Для этого введите:

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

Важно! Генерировать DH-ключ нужно в каталоге, который хранит сертификат SSL.

Переменная после маршрута (2048) задаёт длину ключа. 2048-битный ключ достаточно безопасен, но для максимальной безопасности можно создать 4096-битный ключ.

На генерирование ключа уйдёт около 5 минут.

После этого откройте конфигурационный файл Nginx по умолчанию:

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

В блоке server определите местонахождение ключа DHE.

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

7: Перенаправление HTTP на HTTPS

Поскольку контент будет обслуживаться только по HTTPS, нужно настроить перенаправление запросов.

В конце файла создайте новый блок server, предназначенный для перенаправления HTTP-запросов на HTTPS.

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

Примечание: Не забудьте заменить условный домен настоящим.

Проверьте синтаксис на ошибки:

sudo nginx -t

8: Перезапуск Nginx

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

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

9: Тестирование настройки

Теперь нужно убедиться, что сервер запущен и работает должным образом.

example.com

Откройте домен в браузере.

Если все настройки внесены правильно, запрос будет автоматически перенаправлен на HTTPS.

Теперь нужно убедиться, что протокол HTTP/2 работает. Откройте Chrome Developer Tools (F12, или View -> Developer -> Developer Tools) и обновите страницу (F5, или View -> Reload This Page), затем откройте вкладку Network, кликните правой кнопкой по заголовкам таблицы и выберите опцию Protocol. Если все настроено должным образом, в новом столбце вы увидите h2 (сокращение от HTTP/2).

Итак, теперь сервер готов к обслуживанию контента при помощи протокола HTTP/2. Осталось подготовить сервер к производству.

10: Оптимизация производительности Nginx

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

Откройте nginx.conf:

sudo nano /etc/nginx/nginx.conf

Кэширование учётных данных

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

Чтобы включить кэширование, добавьте в конец блока http следующие строки:

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

Строка ssl_session_cache устанавливает размер кэша для хранения данных о сессии. 1 мегабайт кэша может хранить данные о 4000 сессий. Стандартное значение (5 мегабайт) в большинстве случаев подходит, но в случае высокого трафика рекомендуется увеличить это значение.

Строка ssl_session_timeout ограничивает время хранения сессии в кэше. Не рекомендуется устанавливать очень большое значение; одного часа будет вполне достаточно.

Включение HSTS

Ранее вы настроили перенаправление HTTP на HTTPS. Теперь нужно включить Strict Transport Security, чтобы форсировать защищённое соединение через протокол HTTPS.

То есть, если браузер найдёт HSTS-заголовок, он не будет пытаться подключиться через HTTP. Обмен данными будет происходить исключительно по защищённому соединению HTTPS.

Для этого нужно просто добавить в конфигурационный файл:

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

Заключение

Теперь сервер работает по защищённому соединению и может передавать конфиденциальные данные. Чтобы проверить надёжность сертификата SSL, посетите Qualys SSL Lab.

HTTP/2 – отличное средство для улучшения скорости сервера, которое довольно просто установить.

Tags: , , , ,

1 комментарий

Добавить комментарий для Программист Отменить ответ