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

 

Об обновленном протоколе http2 рассказывать не буду, есть для этого википедия и хабрахабр, поэтому считаю, что вы перед собой поставили цель перевести сайты на новый протокол и знаете для чего это нужно.

Сервер работает со следующим ПО: centos 6.Х, панель управления ISPmanager 5, php-fpm и nginx, для домена уже установлен и настроен ssl сертификат.

Большинство инструкций настройки http2 в nginx содержат малоинформативную информацию, которая сводится к добавлению буквоцифр http2 в секцию server конфигурационного файла nginx. В нашем случае у вас уже имеется сконфигурированный файл snginx.conf для работы домена по защищенному протоколу https, где после ssl всего-то нужно добавить знакомые нам http2, как это указано на скриншоте ниже.

mcedit /home/admin/conf/web/snginx.conf

Далее было бы достаточно выйти из редактирования файла с сохранением и перезапустить nginx (но не в нашем случае)

service nginx restart

Этот способ может быть хорош для других панелей управления сервером или для серверов, где все настроено руками, но даже не пытайтесь с установленным плагином HTTP/2 and SPDY indicator разглядеть синюю молнию. Всему виной OpenSSL 1.0.1e-fips 11 Feb 2013 - библиотека, которая устанавливается с nginx/1.10.1 при инсталляции панели Vesta. Проверить это можно командой

nginx -V

Для исправления проблемы нам понадобится OpenSSL не ниже 1.0.2, а для этого нужно пересобрать nginx. Воспользуемся вышеуказанной командой

[root@132011 ~]# nginx -V
nginx version: nginx/1.10.2
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-17) (GCC)
built with OpenSSL 1.0.1e-fips 11 Feb 2013
TLS SNI support enabled
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 arguments: до самого конца, он нам понадобится позже.

Установим зависимости

yum install gc gcc gcc-c++ pcre-devel zlib-devel make wget openssl-devel libxml2-devel libxslt-devel gd-devel perl-ExtUtils-Embed GeoIP-devel gperftools gperftools-devel libatomic_ops-devel perl-ExtUtils-Embed -y

Перейдем в каталог src

cd /usr/local/src/

Скачаем самую свежую версию openssl и nginx, для этого последовательно вводите и выполняйте следующие команды:

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

tar -xzvf openssl-1.1.0c.tar.gz

NGINX_VERSION=1.10.2

wget http://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz

tar -xvzf nginx-${NGINX_VERSION}.tar.gz

wget http://hg.nginx.org/njs/archive/1c50334fbea6.zip

unzip 1c50334fbea6.zip

Перейдем в каталог с нашей версией nginx

cd nginx-${NGINX_VERSION}/

Остановим nginx

service nginx stop

Сконфигурируем nginx, для этого возьмите часть кода, которую сохранили вначале и добавим в него три фрагмента (выделены жирным шрифтом):

./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 --add-dynamic-module=/usr/local/src/njs-1c50334fbea6/nginx --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=/usr/local/src/openssl-1.1.0c

Затем поочередно выполним следующие команды

make

make install

Запустим nginx

service nginx start

Теперь проверьте результат командой

nginx -V

После указанных действий даже Google Chrome определит, что ваш сайт отдает контент по новому протоколу http2

В финале отключим обновление nginx командой yum update, так как это может нарушить работу сервера. Теперь рекомендуется обновлять nginx тем же способом, что мы прошли в данной статье. Для этого отключим репозиторий nginx.repo проставив в секции enebled=0, как указано на скриншоте.

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

Выходим из редактирования файла с сохранением. Перезапускаем NGINX

Альтернативный вариант отключения обновлений NGINX

nano /etc/yum.conf

и добавить в конце сторочку

exclude=*nginx*