19
Апр

Сборка rpm пакета nginx с поддержкой tls 1.3 и сжатием brotli для Centos 7

Последнее время я немного занимаюсь ускорением сайтов и сегодня напишу на эту тему. Я расскажу, как собрать свой rpm пакет nginx с поддержкой tls 1.3 и шифрованием brotli. Зачем все это нужно и какие сулит преимущества, читайте дальше.
Сразу перейду к сути, так как заголовок немного сбивает с толку. На самом деле nginx уже давно поддерживает tls 1.3, достаточно в параметрах указать его поддержку. Но это будет работать только на системах, с версией openssl версии 1.1.1 и выше. В Centos 7 на текущий момент с последними обновлениями у вас будет версия 1.0.2k-fips.

Купить виртуалку под VPN можно тут

[bash title=»код»]openssl version[/bash]
OpenSSL 1.0.2k-fips 26 Jan 2017

Для того, чтобы tls 1.3 заработал, nginx должен быть собран с версией openssl 1.1.1 или выше. Я как раз и хочу рассказать, как это сделать. Если вы не хотите сами разбираться во всем этом, то можете воспользоваться репозиторием, где все уже сделали за вас. Вам достаточно будет только подключить его и выполнить установку. Пример такого репозитория — https://repo.codeit.guru Я не знаю, что это за люди и какие точно изменения вносят в стандартные пакеты. Можете сами посмотреть их сайт и решить, можно им доверять или нет.

Я расскажу, как собрать свой пакет самостоятельно и добавить туда те функции, которые вам нужны. Помимо поддержки tls 1.3 я добавлю модуль для поддержки шифрования brotli, вместо стандартного gzip.

Не хочется подробно описывать, в чем смысл tls 1.3 и brotli. Если кратко — они ускоряют работу сайта. Но ускоряют не значительно. Не нужно очень сильно рассчитывать на подобное ускорение Это имеет смысл, если у вас все остальное идеально и вы хотите еще немного ускориться. Более подробно об этом можно прочитать у cloudflare:

tls 1.3 — https://blog.cloudflare.com/rfc-8446-aka-tls-1-3/
brotli — https://blog.cloudflare.com/results-experimenting-brotli/

Подводя итог, еще раз поясню, что я буду собирать rpm пакет с последней версией openssl и модулем brotli.

Подготовка к сборке своего rpm пакета

Для начала поставим все, что нам понадобится для самостоятельной сборки своего rpm пакета.
[bash title=»код»]yum groupinstall "Development Tools" yum install rpmdevtools yum-utils wget git[/bash]

Подключим репозитории nginx mainline ветки для СentOS 7. Обращаю внимание, что используется не стабильная версия stable, а основная — mainline. Она достаточно надежная, в ней все свежие обновления.
[bash title=»код»]mcedit /etc/yum.repos.d/nginx.repo[/bash]

[bash title=»код»]
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/mainline/centos/7/$basearch/
gpgcheck=0
enabled=1

[nginx-source]
name=nginx source repo
baseurl=http://nginx.org/packages/mainline/centos/7/SRPMS/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7[/bash]

Для Centos 6 просто меняем выше в репе 7 на 6

Обновите репозитории:

[bash title=»код»]yum update[/bash]

Перейдем в домашний каталог и создадим там структуру каталогов.
[bash title=»код»]cd ~
rpmdev-setuptree[/bash]

У nginx в репозитории уже есть все в готовом виде для сборки из исходников. Загрузим пакет с исходниками и установим его.
[bash title=»код»]yumdownloader —source nginx
rpm -Uvh nginx*.src.rpm[/bash]

Если работаете от root, то получите пачку предупреждений.

Для сборки пакетов рекомендуется использовать отдельного пользователя. Но это не критично.

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

[bash title=»код»]yum-builddep nginx[/bash]

Сборка rpm пакета nginx с поддержкой brotli и tls 1.3

Для сборки rpm пакета все готово. Нам нужно скачать исходники openssl и модуля brotli, которые мы будем использовать. На момент написания статьи, последняя версия openssl — 1.1.1a. Ее и будем использовать. Для этого идем на сайт https://www.openssl.org и копируем ссылку на загрузку из раздела Download.
[bash title=»код»]cd /usr/src
wget https://www.openssl.org/source/openssl-1.1.1a.tar.gz[/bash]

Сразу же распакуем:
[bash title=»код»]tar xzvf openssl-*.tar.gz[/bash]

Скачиваем модуль brotli через git.
[bash title=»код»]git clone https://github.com/eustas/ngx_brotli.git
cd ngx_brotli
git submodule update —init[/bash]

Для сборки rpm все готово. Теперь укажем в параметрах сборки нашу версию openssl и модуль brotli.
[bash title=»код»]mcedit ~/rpmbuild/SPECS/nginx.spec[/bash]

Добавляем в строку, начинающуюся с %define BASE_CONFIGURE_ARGS в самый конец к списку параметров:
[bash title=»код»]—add-module=/usr/src/ngx_brotli —with-openssl=/usr/src/openssl-1.1.1a —with-openssl-opt=enable-tls1_3[/bash]

Запускаем сборку rpm:
[bash title=»код»]cd ~/rpmbuild/SPECS/
rpmbuild -ba nginx.spec[/bash]

Устанавливаем собранный пакет:
[bash title=»код»]cd ~/rpmbuild/RPM/
rpm -Uvh nginx-1.15.7-1.el7_4.ngx.x86_64.rpm[/bash]

Проверка работы tls 1.3 и brotli в nginx

Запускаем nginx:
[bash title=»код»]systemctl start nginx[/bash]

Проверяем версию openssl и наличие brotli модуля:

[bash title=»код»]nginx -V[/bash]

Для работы нового функционала, добавляем параметры в /etc/nginx/nginx.conf:
[bash title=»код»]ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES-256-GCM-SHA384:ECDHE:!COMPLEMENTOFDEFAULT;
ssl_prefer_server_ciphers on;
ssl_stapling on;
add_header Strict-Transport-Security max-age=15768000;

brotli_static on;
brotli on;
brotli_comp_level 6;
brotli_types text/plain text/css text/xml application/javascript image/x-icon image/svg+xml;[/bash]

Обращаю внимание на настройки nginx. Если у вас в виртуальных хостах стоят разные настройки ssl, то могут возникнуть проблемы с работой tls 1.3. Изначально я тестировал все на отдельном виртуальном хосте, а остальные не трогал. Но у меня ничего не работало. Какие бы настройки ssl я не ставил, tls 1.3 не работал, только 1.2. Что я только не перепробовал — раз 10 пересобирал nginx с разными параметрами и версиями openssl.

Заработало все только после того, как я у всех виртуальных хостов убрал настройки ssl, кроме путей до сертификатов, и прописал глобальные настройки для всех в nginx.conf. После этого tls 1.3 заработал.

Проверяем конфигурацию на ошибки и перезапускаем nginx:

[bash title=»код»]nginx -t
nginx -s reload[/bash]

Открываем тестовый сайт в последней версии chrome и проверяем с помощью dev tools.

В завершении рекомендую заблокировать обновление nginx через yum, иначе вы замените свою сборку очередной новой версией из официальной репы. Для блокировки, установите пакет yum-plugin-versionlock:
[bash title=»код»]yum install yum-plugin-versionlock[/bash]

Теперь блокируем пакет nginx:
[bash title=»код»]yum versionlock nginx[/bash]

Посмотреть список заблокированных пакетов можно командой:
[bash title=»код»]yum versionlock list[/bash]

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

Взято с https://serveradmin.ru/sborka-rpm-paketa-nginx-s-podderzhkoy-tls-1-3-i-szhatiem-brotli

Обратная связь

    The average number of adverse effects was 3. T max is 23 minutes in females and 32 minutes in males. What other drugs will affect doxercalciferol Viagra natural sin receta. Archived from the original on 2009-08-14.

    Talk to your doctor before using this form of cefadroxil if you have diabetes. What should I tell my healthcare team before starting CABLIVI? There is no FDA guidance on the use of Tetracycline (oral) with respect to specific gender populations https://www.apotheke-rezeptfreie.com/. Opper K, Uder S, Song K Development of Heterogeneous and Homogeneous Platforms for Rapid Analysis of DNA-Protein Interactions.

    Contact Us