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

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

Требования

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 содержат только устаревшую версию 1.4.6.

Однако разработчики Nginx предоставляют свой собственный apt-репозиторий для Ubuntu. Здесь всегда можно найти последние версии пакетов. Добавьте этот репозиторий.

Сначала нужно получить PGP-ключ репозитория, чтобы убедиться, что все пакеты в репозитории подлинны и подписаны разработчиками.

wget -qO - http://nginx.org/keys/nginx_signing.key | sudo apt-key add -

После этого можно добавить репозиторий в систему.

sudo echo -e "deb http://nginx.org/packages/mainline/ubuntu/ `lsb_release -cs` nginx\ndeb-src http://nginx.org/packages/mainline/ubuntu/ `lsb_release -cs` nginx" | sudo tee /etc/apt/sources.list.d/nginx.list

Теперь менеджер пакетов apt имеет доступ к новому репозиторию. Обновите индекс пакетов и установите последнюю версию Nginx:

sudo apt-get update
sudo apt-get install nginx

Проверьте версию:

sudo nginx –v

Команда должна вернуть:

nginx version: nginx/1.9.x.

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

2: Настройка порта

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

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

sudo nano /etc/nginx/conf.d/default.conf

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

listen 80;

Но у большинства пользователей протокол HTTP/2 не будет работать, если он будет слушать HTTP-соединения. Измените номер порта на 443, который используется для HTTPS.

listen 443 ssl http2;

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

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

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

server_name example.com;

Сохраните и закройте файл (Ctrl+O, Ctrl+X).

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 на HTTPS

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

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

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

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

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

server {
listen       443 ssl http2;
server_name  example.com;
ssl_certificate /etc/nginx/ssl/example.com.crt;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
location / {
root   /usr/share/nginx/html;
index  index.html index.htm;
}
}
server {
listen         80;
server_name    example.com;
return         301 https://$server_name$request_uri;
}

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

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

Чтобы обновить настройки Nginx, нужно перезапустить веб-сервер:

sudo service nginx restart

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

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

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

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

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

7: Оптимизация производительности 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 ограничивает время хранения сессии в кэше. Не рекомендуется устанавливать очень большое значение; одного часа будет вполне достаточно.

Оптимизация наборов шифров

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

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

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

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

Включение 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;

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

8: Настройка безопасности обмена ключами

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

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

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

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

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

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

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

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

Перезапустите Nginx:

sudo service nginx restart

Заключение

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

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

Tags: , , , ,

Добавить комментарий