Гид по технологиям

Сборка Nginx из исходников на Debian 9 (stretch)

• 6 min read • DevOps • Обновлено 26 Nov 2025
Сборка Nginx из исходников на Debian 9
Сборка Nginx из исходников на Debian 9

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

Логотип Nginx на экране

О чём эта инструкция

Эта инструкция шаг за шагом показывает, как скачать, собрать и установить 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 из исходников — пошагово

  1. Установите инструменты сборки и утилиты:
sudo apt install -y build-essential git tree software-properties-common dirmngr apt-transport-https ufw
  1. Скачайте исходники Nginx (mainline в примере) и распакуйте:
wget https://nginx.org/download/nginx-1.15.8.tar.gz && tar zxvf nginx-1.15.8.tar.gz
  1. Скачайте исходники обязательных библиотек и распакуйте:
# 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
  1. Установите опциональные зависимости (если нужны модули):
sudo apt install -y perl libperl-dev libgd3 libgd-dev libgeoip1 libgeoip-dev geoip-bin libxml2 libxml2-dev libxslt1.1 libxslt1-dev
  1. Очистите архивы tar.gz (необязательно, но удобно):
rm -rf *.tar.gz
  1. Перейдите в каталог с исходниками Nginx:
cd ~/nginx-1.15.8

Для обзора структуры можно использовать tree:

tree -L 2 .
  1. Установите 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

Man-страница Nginx

  1. Получите справку по опциям компиляции:
./configure --help  
# Чтобы увидеть, какие core-модули можно скомпилировать как dynamic, выполните:  
./configure --help | grep -F =dynamic
  1. Пример конфигурации, сборки и установки (внимательно проверьте пути и версии в своих условиях):
./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
  1. Вернитесь в домашний каталог, создайте символьную ссылку для модулей и проверьте версию:
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
  1. Создайте системную группу и пользователя для nginx:
sudo adduser --system --home /nonexistent --shell /bin/false --no-create-home --disabled-login --disabled-password --gecos "nginx user" --group nginx
  1. Проверьте синтаксис конфигурации и создайте каталоги временных файлов:
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
  1. Создайте 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
  1. Включите автозапуск и запустите 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 работает.

Nginx welcome page

  1. Создайте профиль приложения 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
  1. Удалите файлы *.default в /etc/nginx:
sudo rm /etc/nginx/*.default
  1. Подсветка синтаксиса для 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/

Подсветка синтаксиса конфигурации Nginx в Vim

  1. Создайте стандартные каталоги и установите права логов:
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
  1. Настройка 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
}
  1. Удалите папки с исходниками, если они больше не нужны:
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

  1. Подготовьте репозиторий с вашими флагами configure и патчами.
  2. В CI собирайте новую версию и запускайте тесты интеграции.
  3. Тестируйте производительность на staging.
  4. Разворачивайте на production в режиме канареечного релиза.

Краткое резюме

Сборка Nginx из исходников даёт гибкость и контроль: вы можете привязать конкретные версии библиотек, включить нужные модули и оптимизировать бинарник под свои требования. Это требует дополнительных усилий по поддержке и автоматизации, поэтому выбирайте такой путь, если преимущества перевешивают затраты на сопровождение.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро