HTTP / 2 - это новая версия устаревшего протокола HTTP / 1.1, стандартизированного еще в 1999 году. С тех пор многое изменилось в Интернете. Наши приложения более сложны, чем когда-либо, поэтому, чтобы справиться с этим, было необходимо изменить базовый транспортный протокол. Самое важное в HTTP / 2 - это то, что он сделает вашу веб-страницу быстрее для конечных пользователей.
Вкратце HTTP / 2 добавляет 5 ключевых функций:
- Одно постоянное соединение
- мультиплексирование
- Сжатие заголовка
- Приоритизация ресурсов
- Защищает транспортный уровень (только для браузеров)
Объяснение всех этих функций выходит за рамки данного учебного пособия, но если вы хотите углубиться в эту тему, я могу порекомендовать отрывок из книги «Высокопроизводительные сети браузера» - отрывок HTTP / 2 .
В этом руководстве мы собираемся установить последнюю стабильную версию Nginx на Ubuntu 16.04 (Xenial), сгенерировать самозаверяющий SSL-сертификат, включить протокол HTTP / 2 в Nginx и установить текстовый браузер elinks
для работы в качестве HTTP-клиента.
Установить Nginx
Чтобы установить последнюю стабильную версию Nginx, нам нужно выполнить несколько команд:
-
Нам нужно скачать открытый ключ PGP Nginx, используемый для подписи пакетов и репозиториев, и добавить его в набор ключей, используемый менеджером пакетов для проверки подлинности пакетов, загруженных из репозитория.
wget https://nginx.org/keys/nginx_signing.key && apt-key add nginx_signing.key
-
Удалите ключ PGP из файловой системы:
rm nginx_signing.key
-
Добавить новый репозиторий
printf "deb http://nginx.org/packages/ubuntu/ xenial nginx \ndeb-src http://nginx.org/packages/ubuntu/ xenial nginx \n" >> /etc/apt/sources.list.d/nginx.list
-
Обновите список пакетов и установите Nginx:
apt update && apt install nginx -y
-
Для проверки версии Nginx мы можем использовать следующее:
nginx -v
# nginx version: nginx/1.10.1
Если все идет хорошо, вы должны увидеть шаблон, как 1.10.x
в выводе при запуске nginx -v
команды.
Самозаверяющий сертификат и HTTP / 2
Хотя спецификация HTTP / 2 не заставляет браузеры реализовывать HTTP / 2 поверх TLS, все основные браузеры решили использовать только HTTP / 2 поверх TLS, но не какую-либо версию TLS, только TLS 1.2 или выше.
Мы собираемся создать самоподписанные сертификаты для вымышленного example.com
домена, для производства вам нужен действительный домен и использовать доверенный CA.
-
Создать закрытый ключ:
openssl genrsa -aes128 -out example.com.key 2048
После выполнения этой команды вам нужно будет ввести пароль 2 раза. Поскольку парольные фразы раздражают, мы собираемся удалить их.
-
Удалить парольную фразу из закрытого ключа:
openssl rsa -in example.com.key -out example.com.key
-
Создать запрос на подпись сертификата (CSR):
openssl req -new -sha256 -key example.com.key -out cert-request.csr
Мы создаем однодоменный сертификат, поэтому нам нужно установить поле общего имени равным example.com
домену
-
Создать сертификат:
openssl x509 -req -days 365 -in cert-request.csr -signkey example.com.key -out example.com.crt
-
Разберитесь с сертификатом и закрытым ключом:
mkdir -p /etc/ssl/testing/private && mkdir /etc/ssl/testing/certs
mv example.com.key /etc/ssl/testing/private && mv example.com.crt /etc/ssl/testing/certs
-
Создайте каталоги виртуальных хостов nginx
mkdir /etc/nginx/sites-available && mkdir /etc/nginx/sites-enabled
-
Тогда беги nano /etc/nginx/nginx.conf
и найди директиву include /etc/nginx/conf.d/*.conf;
. Ниже этой директивы добавьте include /etc/nginx/sites-enabled/*;
Save ( CTRL + O ) и затем выйдите ( CTRL + X ).
##
# Virtual Hosts
##
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
-
С помощью этой команды создайте файл с именем example.com.conf
внутри /etc/nginx/sites-available
каталога nano /etc/nginx/sites-available/example.com.conf
и скопируйте / вставьте следующий код:
server {
listen 80;
listen [::]:80;
server_name example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name example.com;
root /var/www/html;
index index.nginx-debian.html;
ssl_certificate /etc/ssl/testing/certs/example.com.crt;
ssl_certificate_key /etc/ssl/testing/private/example.com.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';
ssl_prefer_server_ciphers on;
}
Поздравляем, теперь у вас есть веб-сервер с поддержкой HTTP / 2 . Добавление http2
параметра в listen
директиву внутри виртуального хоста HTTPS даст вам поддержку HTTP / 2 .
-
Создайте символическую ссылку для /etc/nginx/sites-available/example.com.conf
этой команды:
ln -s /etc/nginx/sites-available/example.com.conf /etc/nginx/sites-enabled
-
Синтаксис тестовой конфигурации
nginx -t
-
Перезапустите Nginx, чтобы применить ваши изменения:
systemctl restart nginx
-
Добавить example.com
домен в /etc/hosts
файл
echo '127.0.0.1 example.com' >> /etc/hosts
Установить elinks
Для проверки вашего виртуального хоста нам нужен текстовый браузер - elinks.
-
Для установки elinks используйте следующую команду:
apt install elinks
-
Чтобы проверить ваш example.com
виртуальный хост, выполните:
elinks https://example.com
-
Чтобы выйти из браузера elinks, нажмите q на клавиатуре, а затем Enter .
Тест HTTP / 2
Чтобы увидеть, какие протоколы сервер рекламирует, проще всего использовать openssl
инструментарий.
openssl s_client -connect example.com:443 -nextprotoneg ''
В выводе этой команды вы должны увидеть что-то вроде этого:
CONNECTED(00000003)
Protocols advertised by server: h2, http/1.1
Чтобы увидеть HTTP / 2 в действии, вы можете использовать инструменты разработчика браузера. Протокол HTTP / 2 обозначается либо идентификаторами, h2
либо HTTP/2.0
. Откройте сетевую панель в dev-tools и обновите страницу.
Вывод
Теперь вы должны знать, как «легко» включить HTTP / 2 в конфигурации Nginx, но это не вся часть общей картины. Сначала вам следует подумать о включении TLS / SSL на вашем сервере с помощью надежных наборов шифров и убедиться, что вы не используете черные списки . Только после включения надежного TLS / SSL на вашем сервере вы можете начать думать о включении HTTP / 2 .