Сборка Nginx из исходников на Debian 9 (stretch)
Собрать Nginx из исходников на Debian 9 — значит получить контролируемый, оптимизированный бинарник с нужными модулями и собственной версией OpenSSL (например, с поддержкой TLS 1.3). В статье подробно описаны требования, команды для скачивания зависимостей, конфигурация сборки, установка systemd-юнита, настройки прав и проверки. Приведены чек-листы, критерии приёмки и альтернативы, когда сборка не подходит.

О чём эта инструкция
Эта инструкция шаг за шагом показывает, как скачать, собрать и установить Nginx (mainline) из исходников на Debian 9 (stretch). Она охватывает обязательные зависимости, опции ./configure, создание systemd-сервиса, базовую безопасность и проверки. Подход подходит, когда нужна собственная версия OpenSSL, дополнительные модули или тонкая настройка функционала.
Важно: в тексте используются примеры версии на момент написания — Nginx 1.15.8 и OpenSSL 1.1.1a. Перед началом проверьте свежие релизы и при необходимости обновите номера версий в командах.
Основные понятия в одну строку
- Nginx — быстрый веб-сервер и обратный прокси, написан на C.
- Mainline — ветка с последними фичами; Stable — ветка с акцентом на проверенную стабильность.
- Модули: core (родные) и сторонние; статические и динамические.
Stable vs mainline
- Mainline — последние функции и исправления. Часто самая свежая поддержка протоколов и оптимизаций, но может включать экспериментальные изменения.
- Stable — медленнее обновляется, но стремится к большей предсказуемости для продакшена.
Выбор: для тестов и доступа к новым фичам — mainline. Для строгой консервативной среды — stable.
Типы модулей
- Core (встроенные) — разрабатываются основной командой Nginx.
- Third-party — создаются сообществом (PageSpeed, ModSecurity, RTMP, Lua и т.д.).
- Статические модули собираются в бинарник при компиляции.
- Динамические модули можно подключать/отключать через load_module в nginx.conf (появились в 1.9.11+).
Требования для сборки
Обязательные зависимости (общая рекомендация):
- Компилятор: build-essential (GCC и инструменты сборки).
- Криптография: OpenSSL (или LibreSSL/BoringSSL). Пример в инструкции — OpenSSL 1.1.1a.
- Zlib (например 1.2.11).
- PCRE (например 8.42) — для регулярных выражений.
Опционально (по потребности): Perl, LibGD, MaxMind GeoIP Legacy C Library, libxml2, libxslt.
Примечание: Nginx можно собирать против LibreSSL или BoringSSL вместо OpenSSL.
Требования к окружению
- Сервер с Debian 9 (stretch).
- Пользователь с sudo-привилегиями (не рекомендуется собирать и запускать под root).
Первые шаги
Проверьте версию Debian:
lsb_release -ds
# Debian GNU/Linux 9.6 (stretch) Установите базовые утилиты:
apt install -y wget curl sudoНастройте часовой пояс:
sudo dpkg-reconfigure tzdata Обновите пакеты системы:
apt update && apt upgrade -yСборка Nginx из исходников — пошагово
- Установите инструменты сборки и утилиты:
sudo apt install -y build-essential git tree software-properties-common dirmngr apt-transport-https ufw- Скачайте исходники Nginx (mainline в примере) и распакуйте:
wget https://nginx.org/download/nginx-1.15.8.tar.gz && tar zxvf nginx-1.15.8.tar.gz- Скачайте исходники обязательных библиотек и распакуйте:
# PCRE version 8.42
wget https://ftp.pcre.org/pub/pcre/pcre-8.42.tar.gz && tar xzvf pcre-8.42.tar.gz
# zlib version 1.2.11
wget https://www.zlib.net/zlib-1.2.11.tar.gz && tar xzvf zlib-1.2.11.tar.gz
# OpenSSL version 1.1.1a
wget https://www.openssl.org/source/openssl-1.1.1a.tar.gz && tar xzvf openssl-1.1.1a.tar.gz- Установите опциональные зависимости (если нужны модули):
sudo apt install -y perl libperl-dev libgd3 libgd-dev libgeoip1 libgeoip-dev geoip-bin libxml2 libxml2-dev libxslt1.1 libxslt1-dev- Очистите архивы tar.gz (необязательно, но удобно):
rm -rf *.tar.gz- Перейдите в каталог с исходниками Nginx:
cd ~/nginx-1.15.8Для обзора структуры можно использовать tree:
tree -L 2 .- Установите man-страницу Nginx:
sudo cp ~/nginx-1.15.8/man/nginx.8 /usr/share/man/man8
sudo gzip /usr/share/man/man8/nginx.8
ls /usr/share/man/man8/ | grep nginx.8.gz
# Проверка: man nginx
- Получите справку по опциям компиляции:
./configure --help
# Чтобы увидеть, какие core-модули можно скомпилировать как dynamic, выполните:
./configure --help | grep -F =dynamic- Пример конфигурации, сборки и установки (внимательно проверьте пути и версии в своих условиях):
./configure --prefix=/etc/nginx \
--sbin-path=/usr/sbin/nginx \
--modules-path=/usr/lib/nginx/modules \
--conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--pid-path=/var/run/nginx.pid \
--lock-path=/var/run/nginx.lock \
--user=nginx \
--group=nginx \
--build=Debian \
--builddir=nginx-1.15.8 \
--with-select_module \
--with-poll_module \
--with-threads \
--with-file-aio \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_addition_module \
--with-http_xslt_module=dynamic \
--with-http_image_filter_module=dynamic \
--with-http_geoip_module=dynamic \
--with-http_sub_module \
--with-http_dav_module \
--with-http_flv_module \
--with-http_mp4_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_auth_request_module \
--with-http_random_index_module \
--with-http_secure_link_module \
--with-http_degradation_module \
--with-http_slice_module \
--with-http_stub_status_module \
--with-http_perl_module=dynamic \
--with-perl_modules_path=/usr/share/perl/5.24.1 \
--with-perl=/usr/bin/perl \
--http-log-path=/var/log/nginx/access.log \
--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 \
--with-mail=dynamic \
--with-mail_ssl_module \
--with-stream=dynamic \
--with-stream_ssl_module \
--with-stream_realip_module \
--with-stream_geoip_module=dynamic \
--with-stream_ssl_preread_module \
--with-compat \
--with-pcre=../pcre-8.42 \
--with-pcre-jit \
--with-zlib=../zlib-1.2.11 \
--with-openssl=../openssl-1.1.1a \
--with-openssl-opt=no-nextprotoneg \
--with-debug
make
sudo make install- Вернитесь в домашний каталог, создайте символьную ссылку для модулей и проверьте версию:
cd ~
sudo ln -s /usr/lib/nginx/modules /etc/nginx/modules
sudo nginx -V
# Пример вывода: nginx version: nginx/1.15.8 (Debian)
# built with OpenSSL 1.1.1a 20 Nov 2018- Создайте системную группу и пользователя для nginx:
sudo adduser --system --home /nonexistent --shell /bin/false --no-create-home --disabled-login --disabled-password --gecos "nginx user" --group nginx- Проверьте синтаксис конфигурации и создайте каталоги временных файлов:
sudo nginx -t
# Возможная ошибка: mkdir() "/var/cache/nginx/client_temp" failed (2: No such file or directory)
sudo mkdir -p /var/cache/nginx/client_temp /var/cache/nginx/fastcgi_temp /var/cache/nginx/proxy_temp /var/cache/nginx/scgi_temp /var/cache/nginx/uwsgi_temp
sudo chmod 700 /var/cache/nginx/*
sudo chown nginx:root /var/cache/nginx/*
sudo nginx -t- Создайте systemd unit для Nginx:
sudo vim /etc/systemd/system/nginx.serviceВставьте (точно) следующий текст как содержимое файла:
[Unit]
Description=nginx - high performance web server
Documentation=https://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/var/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t -c /etc/nginx/nginx.conf
ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
[Install]
WantedBy=multi-user.target- Включите автозапуск и запустите nginx:
sudo systemctl enable nginx.service
sudo systemctl start nginx.serviceПроверка статуса:
sudo systemctl is-enabled nginx.service
# enabled
sudo systemctl status nginx.service
# или
ps aux | grep nginx
# или
curl -I 127.0.0.1Откройте браузер и перейдите на IP/домен — если отображается стартовая страница, Nginx работает.

- Создайте профиль приложения UFW для Nginx (удобно для управления брандмауэром):
sudo vim /etc/ufw/applications.d/nginxВставьте:
[nginx HTTP]
title=Web Server (nginx, HTTP)
description=Small, but very powerful and efficient web server
ports=80/tcp
[nginx HTTPS]
title=Web Server (nginx, HTTPS)
description=Small, but very powerful and efficient web server
ports=443/tcp
[nginx Full]
title=Web Server (nginx, HTTP + HTTPS)
description=Small, but very powerful and efficient web server
ports=80,443/tcpПроверьте список приложений в ufw:
sudo ufw app list
# Available applications:
# nginx Full
# nginx HTTP
# nginx HTTPS- Удалите файлы *.default в /etc/nginx:
sudo rm /etc/nginx/*.default- Подсветка синтаксиса для Vim (удобно при редактировании):
# Для обычного пользователя
mkdir ~/.vim/
cp -r ~/nginx-1.15.8/contrib/vim/* ~/.vim/
# Для root
sudo mkdir /root/.vim/
sudo cp -r ~/nginx-1.15.8/contrib/vim/* /root/.vim/
- Создайте стандартные каталоги и установите права логов:
sudo mkdir /etc/nginx/{conf.d,snippets,sites-available,sites-enabled}
sudo chmod 640 /var/log/nginx/*
sudo chown nginx:adm /var/log/nginx/access.log /var/log/nginx/error.log- Настройка logrotate:
sudo vim /etc/logrotate.d/nginxВставьте:
/var/log/nginx/*.log {
daily
missingok
rotate 52
compress
delaycompress
notifempty
create 640 nginx adm
sharedscripts
postrotate
if [ -f /var/run/nginx.pid ]; then
kill -USR1 `cat /var/run/nginx.pid`
fi
endscript
}- Удалите папки с исходниками, если они больше не нужны:
cd ~
rm -rf nginx-1.15.8/ openssl-1.1.1a/ pcre-8.42/ zlib-1.2.11/Готово. Вы получили собственно собранный Nginx, статически связанный с выбранными библиотеками (частично или полностью), с контролем наборов модулей и опций сборки.
Почему стоит собирать Nginx из исходников
- Возможность связать конкретную версию OpenSSL (например, 1.1.1) и получить TLS 1.3 и современные шифры (CHACHA20_POLY1305).
- Включение/исключение нужных модулей для уменьшения поверхности атаки и экономии памяти.
- Возможность собрать экспериментальные или сторонние модули, отсутствующие в дистрибутивных пакетах.
Когда сборка из исходников не нужна или не подходит
- Если вы не хотите поддерживать обновления вручную. Пакетный менеджер автоматически решает вопросы CVE и фиксов.
- Если у вас ограниченные ресурсы по сопровождению: поддержка и тестирование кастомной сборки требует времени.
- В облачных или контейнерных окружениях иногда проще использовать официальный образ или дистрибутивный пакет.
Альтернативы
- Установка через apt (nginx, nginx-full, nginx-extras) — проще и безопаснее для большинства случаев.
- Использование контейнеров (официальный image nginx в Docker) — удобнее для CI/CD.
- Использование конфигурационных менеджеров (Ansible, Puppet) с управлением пакетами.
Чек-листы
Чек-лист для администратора (быстрая проверка перед релизом):
- nginx -t проходит без ошибок
- присутстует systemd-юнит и он включён
- каталоги /var/cache/nginx/* существуют и принадлежат nginx:root
- права на логи корректны (640) и владелец nginx:adm
- создана политика logrotate
- базовый health-check (curl -I localhost) — 200/301
Чек-лист для разработчика модулей:
- модуль собирается как dynamic при необходимости
- load_module прописан в /etc/nginx/nginx.conf (если динамический модуль)
- unit-тесты конфигураций выполняются
Критерии приёмки
- Nginx успешно стартует и принимает соединения на нужных портах.
- Конфигурация проходит тест (nginx -t) на целевой машине.
- TLS-Handshake соответствует ожидаемому (если используются HTTPS): поддержка TLS 1.2/1.3 как требуется.
- Логи пишутся и logrotate корректно вращает файлы.
Тестовые случаи и приёмочные проверки
- Проверка старта: systemctl start/stop/reload и отсутствие ошибок.
- Проверка производительности: базовый ab/wrk тест (пиковая нагрузка) — сравнить с системным пакетом.
- Проверка модулей: отправка запросов, использующих специфичный модуль (например, image_filter или Lua).
- Проверка TLS: openssl s_client -connect domain:443 -tls1_3 (проверить поддерживаемые шифры).
Полезная шпаргалка: часто используемые опции –with
- –with-http_ssl_module — добавляет SSL/TLS для HTTP
- –with-http_v2_module — включение HTTP/2
- –with-stream=dynamic — включить stream-модули динамически
- –with-pcre=../pcre-8.42 — собрать с внутренним PCRE
- –with-openssl=../openssl-1.1.1a — собрать с конкретной версией OpenSSL
Факты (key numbers)
- Минимум зависимостей по умолчанию: OpenSSL/LibreSSL/BoringSSL, Zlib, PCRE.
- Динамические модули появились в Nginx 1.9.11 (февраль 2016).
- Пример использованной версии Nginx в статье: 1.15.8.
Быстрое руководство принятия решения (Mermaid)
flowchart TD
A[Нужна конкретная версия OpenSSL или модуль] --> B{Да?}
B -- Да --> C[Собрать из исходников]
B -- Нет --> D[Использовать пакет дистрибутива или контейнер]
C --> E{Требуется поддержка обновлений}
E -- Да --> F[Автоматизировать сборку и тесты 'CI']
E -- Нет --> G[Проверять обновления вручную]Риски и рекомендации по безопасности
- Риск: вы теряете автоматическое обновление CVE из репозиториев — настройте мониторинг уязвимостей.
- Рекомендация: автоматизируйте сборку и тестирование в CI/CD, чтобы быстро выпускать патчи.
- Рекомендация: минимизируйте набор включённых модулей и используйте статическую или динамическую привязку в зависимости от потребности.
Короткая методика обновления кастомного Nginx
- Подготовьте репозиторий с вашими флагами configure и патчами.
- В CI собирайте новую версию и запускайте тесты интеграции.
- Тестируйте производительность на staging.
- Разворачивайте на production в режиме канареечного релиза.
Краткое резюме
Сборка Nginx из исходников даёт гибкость и контроль: вы можете привязать конкретные версии библиотек, включить нужные модули и оптимизировать бинарник под свои требования. Это требует дополнительных усилий по поддержке и автоматизации, поэтому выбирайте такой путь, если преимущества перевешивают затраты на сопровождение.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента