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

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"]

[/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».