Настройка NGINX для HTTP/2 по шагам

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

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

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

По шагам:

Установка или обновление NGINX
Проверка OpenSSL
Создание сертификата
  Настройка NGINX
Тест HTTP/2

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

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

Обновление

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

nginx -v

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

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. Для этого выполняем следующую команду:

nginx -V

Находим строчку, которая начинается с 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 и смотрим ссылку на самую свежую и стабильную версию пакета:

Ссылка на последнюю стабильную версию NGINX

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

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:

nginx -V

И копируем все, что идет после 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:

nginx -V

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

...
built with OpenSSL 1.1.0c  10 Nov 2016
...

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

cd ..

И вводим:

\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.dmosk.local/CN=test"

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

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

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

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

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

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

server {
        listen 80;
        server_name test-http2.dmosk.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:

nginx -t

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

systemctl restart nginx

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

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

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

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

# NGINX # Ubuntu # UNIX # Безопасность # Интернет # Серверы
Дмитрий Моск — частный мастер
Была ли полезна вам эта инструкция?

Да            Нет