8.4 KiB
Сборка пакета
Сборка бинарного файла с использованием docker-образа
Для сборки образа скачайте и разархивируйте nginx в корень проекта: Например так:
wget https://nginx.org/download/nginx-1.26.3.tar.gz
tar xvf nginx-1.26.3.tar.gz
Далее соберите образ, используя Dockerfile в корне проекта (сборка под almalinux:9):
docker build -t nginx-mod_rewrite .
Получаем образ с nginx и собранным mod_rewrite.
Для запуска образа необходимо выполнить команду:
docker run --name nginx-mod_rewrite -p 8080:80 -p 8081:8081 nginx-mod_rewrite
Сборка пакета под заданную операционную систему
В корне проекта расположен скрипт package_preparer.sh, который позволяет собрать rpm или deb пакет под определенную операционную систему. Под какую операционную систему и нативную версию nginx будет собран пакет, зависит от используемого образа.
Для сборки пакета необходимо запустить команду:
bash package_preparer.sh prepare "almalinux:9"
Сборка проверялась на образах:
- almalinux:9
- almalinux:8
- rockylinux:9
- ubuntu:24.04
- debian:stable
После сборки собранные пакеты появятся в каталоге tmpbuild:
$ ls -1 tmpbuild/*.rpm
tmpbuild/nginx-mod-rewrite-0.1-1.el9.src.rpm
tmpbuild/nginx-mod-rewrite-0.1-1.el9.x86_64.rpm
tmpbuild/nginx-mod-rewrite-debuginfo-0.1-1.el9.x86_64.rpm
tmpbuild/nginx-mod-rewrite-debugsource-0.1-1.el9.x86_64.rpm
или
$ ls -1 tmpbuild/nginx-mod-rewrite*
tmpbuild/nginx-mod-rewrite_0.1-1_amd64.buildinfo
tmpbuild/nginx-mod-rewrite_0.1-1_amd64.changes
tmpbuild/nginx-mod-rewrite_0.1-1_amd64.deb
tmpbuild/nginx-mod-rewrite_0.1-1.dsc
tmpbuild/nginx-mod-rewrite_0.1-1.tar.gz
tmpbuild/nginx-mod-rewrite-0.1.tar.gz
tmpbuild/nginx-mod-rewrite-dbgsym_0.1-1_amd64.deb
Для того чтобы команда
bash -x package_preparer.sh prepare "os-image"
работала корректно, в системе должны быть установлены и доступны следующие утилиты (каждая из которых берётся из пакета, поставляемого в вашем дистрибутиве Linux):
| Утилита | Что делает в prepare‑разделе |
Пакет (Debian/Ubuntu) |
|---|---|---|
bash |
Запуск самого скрипта | уже установлен |
rm, mkdir, cp, find, head, gzip, tee |
Очистка/создание каталогов, копирование файлов, поиск, сжатие, логирование | coreutils |
sed (GNU sed) |
Параметризация шаблонов, удаление/замена строк | sed (GNU sed, пакет sed из coreutils) |
awk |
Извлечение версии из CHANGELOG, генерация changelog‑файла |
gawk (или awk‑пакет) |
tar |
Создание tar‑архива, добавление файлов | tar |
docker (команды docker build, docker run, docker rmi) |
Построение временного образа, запуск контейнера, очистка | docker.io / docker-ce + работающий daemon |
Замечание по
sed
В скрипте используются расширенные регулярные выражения (sed -E) и модификация файла на месте (sed -i). Это GNU‑вариантsed. На системах, гдеsed– BSD‑вариант (например, macOS), командаsed -E -iне будет работать, поэтому в таких окружениях нужно установить GNU‑sed(gsed) и заменить вызовы наgsed.
Docker‑демон должен быть запущен, и пользователь должен иметь права на его использование (или быть в группе docker).
Основная сборка происходит в docker‑контейнере, поэтому основная система не засоряется лишними пакетами. Основной набор утилит, используемых скриптом, присутствует в дистрибутиве по умолчанию, поэтому необходимо только установить docker.
Сборщик анализирует версию nginx, установленную в дистрибутиве, и производит сборку в окружении исходных файлов аналогичной версии nginx дистрибутива, а также командами, аналогичными, которые использовались при сборке nginx из дистрибутива.
Ручная сборка из исходников
Если же необходимо собрать модуль самостоятельно, необходимо выполнить следующие команды.
Привожу пример для Almalinux 9.
Установите необходимые пакеты для сборки:
dnf -y install openssl-devel pcre-devel zlib-devel gcc gcc-c++ make wget
В корне проекта:
bash package_preparer.sh download 1.22.1
В качестве версии можно задать любую доступную на сайте https://nginx.org/ru/download.html, она будет скачана и распакована в текущий каталог.
Далее перейти в папку nginx-1.22.1:
cd nginx-1.22.1
и задать конфигурацию сборки. Я привожу пример конфигурации, она может отличаться; данный пример — это типичная конфигурация:
./configure \
--with-compat \
--add-dynamic-module=../modules/mod_rewrite \
--prefix=/etc/nginx \
--sbin-path=/usr/sbin/nginx \
--modules-path=/etc/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/lib/nginx/body \
--http-proxy-temp-path=/var/lib/nginx/proxy \
--http-fastcgi-temp-path=/var/lib/nginx/fastcgi \
--http-uwsgi-temp-path=/var/lib/nginx/uwsgi \
--http-scgi-temp-path=/var/lib/nginx/scgi \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_gzip_static_module \
--with-http_stub_status_module \
--with-http_slice_module \
--with-http_dav_module \
--with-http_auth_request_module \
--with-http_secure_link_module \
--with-stream \
--with-stream_ssl_module \
--with-stream_realip_module \
--with-stream_ssl_preread_module \
--with-pcre-jit
Во время выполнения команды должно появиться:
adding module in ../modules/mod_rewrite
+ ngx_http_apache_rewrite_module was configured
Можно добавить --add-dynamic-module=../modules/mod_rewrite в свою конфигурацию nginx.
Далее:
make modules
данная команда соберет модуль:
# ls -1 objs/ngx_http_apache_rewrite_module.so
objs/ngx_http_apache_rewrite_module.so
Далее его можно переложить в каталог модулей nginx:
cp objs/ngx_http_apache_rewrite_module.so /etc/nginx/modules/
и подключить модуль в файле конфигурации nginx:
cat /etc/nginx/nginx.conf
load_module modules/ngx_http_apache_rewrite_module.so;
...
server {
...
HtaccessEnable on;
RewriteEngine On;
location / {
RewriteEngine On;
}
}