Как настроить NGINX с поддержкой HTTP/2

Мы предоставляем услуги удаленного администрирования серверов

Как настроить NGINX с поддержкой HTTP/2

Обновлено Обновлено: Опубликовано:

В данной инструкции мы будем использовать систему CentOS 7, руководство также хорошо подойдет для Debian и Ubuntu (с заменой команды yum на apt-get).

Очень часто можно встретить вопрос: как настроить поддержку HTTP/2 без SSL (HTTPS)? Это не осуществить, так как популярные браузеры не работают по HTTP/2 без шифрования.

По шагам:

Шаг 1. Установка или обновление NGINX

Для поддержки HTTP/2 веб-сервер NGINX должен быть версии 1.9.5 и старше. В данной версии появился модуль ngx_http_v2_module.

Обновление

Если в системе уже установлен nginx, проверяем его версию следующей командой:

Если она ниже необходимой, обновляем пакет:

yum update nginx

Установка

Для этого сначала создаем файл для настройки репозитория:

vi /etc/yum.repos.d/nginx.repo

И добавляем в него следующее:

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1

После обновляем список пакетов:

yum update

И теперь можно установить nginx:

yum install nginx

Подробнее пошаговый процесс установки NGINX на CentOS.

Шаг 2. Проверка OpenSSL

Проверяем версию openssl, с которым собран установленный NGINX. Для этого выполняем следующую команду:

Находим строчку, которая начинается с built with OpenSSL, например:

built with OpenSSL 1.0.1e-fips 11 Feb 2013

* в данном примере, версия openssl 1.0.1e-fips от 11 февраля 2013.

Версия должна быть от 1.0.2. Если это так, переходим к шагу 3. Иначе, пересобираем nginx.

Для этого переходим по ссылке http://nginx.org/ru/download.html и смотрим ссылку на самую свежую и стабильную версию пакета:

Используя полученную ссылку, скачиваем исходник:

wget http://nginx.org/download/nginx-1.10.2.tar.gz

* На момент написания статьи актуальная версия nginx — 1.10.2
** Во FreeBSD вместо wget, ставим fetch.
*** Если команда wget выдает ошибку, сначала выполняем yum install wget.

Также скачиваем исходник OpenSSL:

wget —no-check-certificate https://www.openssl.org/source/openssl-1.1.0c.tar.gz

Распаковываем архивы, которые мы загрузили:

tar -xvf nginx-*.tar.gz && \rm nginx-*.tar.gz

tar -xvf openssl-*.tar.gz && \rm openssl-*.tar.gz

И переходим в распакованный nginx:

cd nginx-*

Устанавливаем пакеты, необходимые для сборки исходника:

yum install gcc pcre-devel zlib-devel openssl-devel libxml2-devel libxslt-devel gd-devel perl-ExtUtils-Embed GeoIP-devel gperftools-devel 

Теперь еще раз вводим команду для просмотра информации по установленному NGINX:

И копируем все, что идет после configure arguments: — в моем случае было:

—prefix=/etc/nginx —sbin-path=/usr/sbin/nginx —modules-path=/usr/lib64/nginx/modules —conf-path=/etc/nginx/nginx.conf —error-log-path=/var/log/nginx/error.log —http-log-path=/var/log/nginx/access.log —pid-path=/var/run/nginx.pid —lock-path=/var/run/nginx.lock —http-client-body-temp-path=/var/cache/nginx/client_temp —http-proxy-temp-path=/var/cache/nginx/proxy_temp —http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp —http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp —http-scgi-temp-path=/var/cache/nginx/scgi_temp —user=nginx —group=nginx —with-file-aio —with-threads —with-ipv6 —with-http_addition_module —with-http_auth_request_module —with-http_dav_module —with-http_flv_module —with-http_gunzip_module —with-http_gzip_static_module —with-http_mp4_module —with-http_random_index_module —with-http_realip_module —with-http_secure_link_module —with-http_slice_module —with-http_ssl_module —with-http_stub_status_module —with-http_sub_module —with-http_v2_module —with-mail —with-mail_ssl_module —with-stream —with-stream_ssl_module —with-cc-opt=’-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector —param=ssp-buffer-size=4 -m64 -mtune=generic’

И выполняем конфигурирование исходника командой:

./configure —prefix=/etc/nginx —sbin-path=/usr/sbin/nginx —modules-path=/usr/lib64/nginx/modules —conf-path=/etc/nginx/nginx.conf —error-log-path=/var/log/nginx/error.log —http-log-path=/var/log/nginx/access.log —pid-path=/var/run/nginx.pid —lock-path=/var/run/nginx.lock —http-client-body-temp-path=/var/cache/nginx/client_temp —http-proxy-temp-path=/var/cache/nginx/proxy_temp —http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp —http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp —http-scgi-temp-path=/var/cache/nginx/scgi_temp —user=nginx —group=nginx —with-file-aio —with-threads —with-ipv6 —with-http_addition_module —with-http_auth_request_module —with-http_dav_module —with-http_flv_module —with-http_gunzip_module —with-http_gzip_static_module —with-http_mp4_module —with-http_random_index_module —with-http_realip_module —with-http_secure_link_module —with-http_slice_module —with-http_ssl_module —with-http_stub_status_module —with-http_sub_module —with-http_v2_module —with-mail —with-mail_ssl_module —with-stream —with-stream_ssl_module —with-cc-opt=’-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector —param=ssp-buffer-size=4 -m64 -mtune=generic’ —with-openssl=/home/kdo/openssl-1.1.0c

* необходимо убедиться, что среди перечисленных модулей есть —with-http_v2_module. В противном случае это нужно дописать.
** обратите внимание, что мы вставили скопированный текст и добавили —with-openssl (в самом конце, выделено полужирным).
*** /home/kdo/openssl-1.1.0c — путь, по которому расположены исходники для openssl.

Теперь выполняем установку:

make install

Еще раз проверяем версию openssl, с которой собран NGINX:

В нашем примере результат должен быть такой:


built with OpenSSL 1.1.0c  10 Nov 2016

Теперь удаляем исходники — для этого сначала выходим на каталог выше:

И вводим:

\rm -R nginx-1.10.2 openssl-1.1.0c

* так как версии пакетов могут быть разные, нужно учитывать это вводя команду на удаление — папки будут называться иначе.
** сознательно не применяется конструкция nginx-*, так как в случае нахождения в каталоге других файлов и папок, начинающихся на nginx-, они будут потеряны.

Шаг 3. Создание сертификата

Поддержка HTTP/2 со стороны браузера осуществляется только по протоколу https, поэтому для работы ресурса необходим сертификат.

В данном примере будет использоваться самоподписный сертификат, но в боевой среде необходимо выпустить его с помощью локального центра сертификации или купить.

Создаем каталог, в котором будем хранить cert-файлы:

mkdir /etc/nginx/ssl

Создаем сертификаты:

openssl req -new -x509 -days 1461 -nodes -out /etc/nginx/ssl/cert.pem -keyout /etc/nginx/ssl/cert.key -subj «/C=RU/ST=SPb/L=SPb/O=Global Security/OU=IT Department/CN=test.admins24.local/CN=test»

* данная команда создаст сертификат на 4 года для URL test.admins24.local или test

Шаг 4. Настройка NGINX

Открываем/создаем файл конфигурации для виртуального домена:

vi /etc/nginx/conf.d/test.admins24.local.conf

* где test.admins24.local.conf может называться как угодно, главное — чтобы на конце было .conf.

Приводим его к следующему виду:

server {
        listen 80;
        server_name test-http2.admins24.local;
        return 301 https://$host$request_uri;
}

server {
        listen 443 ssl http2;
        ssl on;
        ssl_certificate /etc/nginx/ssl/cert.pem;
        ssl_certificate_key /etc/nginx/ssl/cert.key;

        location / {
            root /usr/share/nginx/html;
        }
}

* в первых 4 строкам мы указываем перенаправлять все http-запросы на https; /etc/nginx/ssl/ — путь, где лежат наши файлы сертификатов; /usr/share/nginx/html — корневая директория, где лежат файлы сайта.

Проверяем корректность настройки nginx:

И перезапускаем его:

systemctl restart nginx

* на более ранних системах service nginx restart.

Шаг 5. Проверка работы HTTP/2

Если ресурс внешний (доступен из сети Интернет), можно воспользоваться онлайн-сервисом https://tools.keycdn.com/http2-test

В противном случае, установить плагин для браузера, например Google Chrome, «HTTP/2 and SPDY indicator».