Thank you for reading this post, don't forget to subscribe!
Очень часто можно встретить вопрос: как настроить поддержку HTTP/2 без SSL (HTTPS)? Это не осуществить, так как популярные браузеры не работают по HTTP/2 без шифрования.
Установка или обновление 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
Проверка 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 и смотрим ссылку на самую свежую и стабильную версию пакета:
Используя полученную ссылку, скачиваем исходник:
wget http://nginx.org/download/nginx-1.10.2.tar.gz
* На момент написания статьи актуальная версия nginx — 1.10.2
* Если команда 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-, они будут потеряны.
Создание сертификата
Поддержка 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.ru/CN=test"
* данная команда создаст сертификат на 4 года для URL test.ru или test
Настройка NGINX
Открываем/создаем файл конфигурации для виртуального домена:
vi /etc/nginx/conf.d/test.test.ru.conf
* где test.test.ru.conf может называться как угодно, главное — чтобы на конце было .conf.
Приводим его к следующему виду:
[codesyntax lang="php"]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
server { listen 80; server_name test-http2.test.ru; 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; } } |
[/codesyntax]
* в первых 4 строкам мы указываем перенаправлять все http-запросы на https; /etc/nginx/ssl/ — путь, где лежат наши файлы сертификатов; /usr/share/nginx/html — корневая директория, где лежат файлы сайта.
Проверяем корректность настройки nginx:
nginx -t
И перезапускаем его:
systemctl restart nginx
* на более ранних системах service nginx restart.
Проверка работы HTTP/2
Если ресурс внешний (доступен из сети Интернет), можно воспользоваться онлайн-сервисом https://tools.keycdn.com/http2-test
В противном случае, установить плагин для браузера, например Google Chrome, «HTTP/2 and SPDY indicator».