Сборка Nginx из исходников на CentOS 7

О чём эта инструкция
В этом руководстве подробно показано, как собрать Nginx из исходников на CentOS 7, включая:
- подготовку системы и зависимостей;
- загрузку исходников Nginx и требуемых библиотек (OpenSSL, PCRE, zlib);
- конфигурацию опций сборки для включения стандартных и динамических модулей;
- установку, создание системного юнита systemd и базовую настройку логов/прав;
- рекомендации по безопасности, проверке и отладке.
Важно: в примерах используется mainline-версия Nginx 1.15.7 (на момент написания). Обновляйте версии по мере необходимости.
Что такое Nginx в двух строках
Nginx — быстрый и лёгкий веб-сервер и обратный прокси, разработанный для высокой конкуренции соединений. Модули Nginx могут быть встроенными (core) или внешними (third-party). Начиная с 1.9.11 доступна поддержка динамических модулей.
Варианты использования (интенция статьи)
Primary intent: сборка nginx из исходников Related variants: nginx сборка на centos, nginx с openssl, nginx dynamic modules, nginx mainline vs stable, компиляция nginx
Краткая разница между mainline и stable
- Mainline — новейшие возможности и исправления; может содержать экспериментальные модули.
- Stable — отложенные изменения, более консервативна, обычно предпочитается в production с консервативным циклом обновлений.
Типы модулей
- Core (встроенные) — пишутся командой разработчиков Nginx и входят в состав дистрибутива.
- Third-party — создаются сообществом для расширения функционала (PageSpeed, ModSecurity, RTMP, Lua и т. п.).
- Static vs Dynamic — статические модули встраиваются в бинарник при компиляции; динамические подключаются через директиву load_module.
Требования к сборке
Обязательные библиотеки и инструменты:
- GCC (группа Development Tools);
- OpenSSL (или LibreSSL/BoringSSL) версии 1.0.2—1.1.1 (в примере — OpenSSL 1.1.1a);
- zlib 1.1.3—1.2.11 (в примере — 1.2.11);
- PCRE 4.4—8.42 (в примере — 8.42).
Опционально: Perl, LibGD, MaxMind GeoIP Legacy, libxml2, libxslt.
Примечание: при компиляции можно указать собственные исходники зависимостей, чтобы получить нужные версии криптографии и ускорения (JIT для PCRE).
Подготовка сервера (CentOS 7)
Требования к окружению:
- Сервер с CentOS 7;
- Непользователь root: учётная запись с sudo.
Проверка версии CentOS:
cat /etc/centos-release
# CentOS Linux release 7.6.1810 (Core)
Установка часового пояса (пример):
timedatectl list-timezones
sudo timedatectl set-timezone 'Region/City'
Обновление пакетов:
sudo yum update -y
Установка вспомогательных утилит:
sudo yum install -y vim curl wget treeСборка Nginx — шаг за шагом
Установка инструментов сборки:
sudo yum groupinstall -y 'Development Tools'Загрузка исходников Nginx (пример mainline 1.15.7) и распаковка:
wget https://nginx.org/download/nginx-1.15.7.tar.gz && tar zxvf nginx-1.15.7.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Установка опциональных зависимостей (если нужны модули libxslt, GD, GeoIP и т.п.):
sudo yum install -y perl perl-devel perl-ExtUtils-Embed libxslt libxslt-devel libxml2 libxml2-devel gd gd-devel GeoIP GeoIP-develОчистка загруженных архивах (необязательно, можно сделать позже):
rm -rf *.tar.gzПереходим в директорию исходников Nginx:
cd ~/nginx-1.15.7Для обзора структуры исходников (рекомендуется):
tree -L 2 .Копирование man-страницы Nginx в систему:
sudo cp ~/nginx-1.15.7/man/nginx.8 /usr/share/man/man8
sudo gzip /usr/share/man/man8/nginx.8
ls /usr/share/man/man8/ | grep nginx.8.gz
# Check that Man page for Nginx is working:
man nginx
Список доступных опций конфигурации сборки:
./configure --help
# To see want core modules can be build as dynamic run:
./configure --help | grep -F =dynamicПример конфигурации сборки, компиляции и установки (с подробным набором опций):
./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 \
--pid-path=/var/run/nginx.pid \
--lock-path=/var/run/nginx.lock \
--user=nginx \
--group=nginx \
--build=CentOS \
--builddir=nginx-1.15.7 \
--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/lib64/perl5 \
--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 ~Создайте символьную ссылку из /usr/lib64/nginx/modules в /etc/nginx/modules (стандартное место для модулей):
sudo ln -s /usr/lib64/nginx/modules /etc/nginx/modulesПроверка версии и аргументов сборки:
sudo nginx -V
# nginx version: nginx/1.15.7 (CentOS)
# built by gcc 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC)
# built with OpenSSL 1.1.1a 20 Nov 2018
# TLS SNI support enabled
# configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules
# . . .
# . . .Создание системной учётной записи nginx:
sudo useradd --system --home /var/cache/nginx --shell /sbin/nologin --comment "nginx user" --user-group nginxПроверка конфигурации на синтаксис:
sudo nginx -t Создание systemd-юнита
Откройте файл для создания юнита:
sudo vim /etc/systemd/system/nginx.serviceВставьте (или скорректируйте) следующее содержимое. Обратите внимание: пути PID и бинарника зависят от опций –prefix/–sbin-path в configure.
[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Включите и запустите сервис:
sudo systemctl enable nginx.service
sudo systemctl start nginx.serviceПроверка автозапуска и статуса:
sudo systemctl is-enabled nginx.service
# enabled
sudo systemctl status nginx.service
# or
ps aux | grep nginx
# or
curl -I 127.0.0.1Откройте в браузере IP/домен сервера — вы должны увидеть страницу приветствия Nginx.

Удалите .default файлы, которые Nginx мог создать в /etc/nginx:
sudo rm /etc/nginx/*.defaultПодсветка синтаксиса Nginx для Vim (полезно для редактирования конфигов):
# For regular non-root user
mkdir ~/.vim/
cp -r ~/nginx-1.15.7/contrib/vim/* ~/.vim/
# For root user
sudo mkdir /root/.vim/
sudo cp -r ~/nginx-1.15.7/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.7/ openssl-1.1.1a/ pcre-8.42/ zlib-1.2.11/Преимущества сборки из исходников
- Контроль версий OpenSSL/Pcre/zlib — можно получить TLS 1.3 и новые шифры (например, CHACHA20_POLY1305) раньше, чем в системных пакетах.
- Точная настройка модулей и возможность собрать только нужные компоненты.
- Поддержка динамических модулей и их тонкая миграция.
Когда сборка из исходников не подходит
- Если важна простота обновлений и автоматические обновления безопасности — предпочтительней используемый репозиторий (yum/DNF) или пакеты от дистрибутива.
- Когда у команды нет опыта поддержки собственной сборки (тогда возникает операционная нагрузка на поддержку обновлений OpenSSL/переустановок).
Альтернативные подходы
- Установка пакета nginx из EPEL/official nginx repo (yum) — проще, автоматические обновления.
- Использование Docker-образов nginx с нужными модулями (хорошо для контейнерной инфраструктуры).
- Использование готовых RPM-сборок с предсобранными модулями.
Краткая методология принятия решения
- Нужен новый OpenSSL / TLS 1.3 -> собрать из исходников с указанной версией OpenSSL.
- Нужны нестандартные модули -> собрать из исходников или подключить динамически.
- Нужна быстрая установка/обновление -> использовать пакеты репозитория.
Факты и ключевые числа
- Пример версии Nginx: 1.15.7 (mainline).
- OpenSSL в примере: 1.1.1a — поддерживает TLS 1.3.
- PCRE JIT ускоряет регулярные выражения и рекомендуем при высоких нагрузках.
Checklist: роль администратора
- Проверить версии ОС и доступность места на диске.
- Установить Development Tools и зависимости.
- Загрузить и проверить контрольные суммы архивов (если возможно).
- Скомпилировать и протестировать конфигурацию nginx -t.
- Настроить systemd юнит и logrotate.
- Закрыть ненужные порты и проверить SELinux/AppArmor политики.
Критерии приёмки
- Nginx запускается как systemd-сервис без ошибок.
- nginx -t возвращает OK для основного конфига.
- Доступна стартовая страница по IP/домену.
- Логи корректно ротируются и права доступа установлены.
Рекомендации по безопасной конфигурации
- Всегда запускать nginx от непривилегированного пользователя (nginx).
- Ограничить доступ к конфигам (chmod 640 /etc/nginx/*).
- Включить TLS 1.2+ и по возможности TLS 1.3; отключить устаревшие шифры.
- Регулярно обновлять OpenSSL и пересобирать при критических уязвимостях.
- Использовать заголовки безопасности (HSTS, X-Frame-Options) в конфиге.
Пример минимальных рекомендаций для ssl_protocols и ssl_ciphers (настройка в server блоке):
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers 'TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:...';(Подберите список шифров в соответствии с поддерживаемыми библиотеками OpenSSL.)
Отладка частых ошибок и пути их решения
- “./configure: error: no acceptable C compiler found” — установить Development Tools (yum groupinstall).
- Ошибка поиска PCRE/zlib/openssl — убедитесь, что у вас распакованы исходники и пути в –with-pcre/–with-zlib/–with-openssl указаны корректно.
- “nginx: [emerg] bind() to 0.0.0.0:80 failed” — порт 80 занят; остановите сервис, использующий порт или поменяйте порт в конфиге.
- Проблемы при загрузке динамического модуля — проверьте директиву load_module и соответствие версии ABI (опция –with-compat помогает совместимости).
Советы по миграции и совместимости
- Если собираете модули динамически, храните копии .so модулей в /etc/nginx/modules и используйте load_module в верхнем уровне nginx.conf.
- При обновлении Nginx сравните опции ./configure и при необходимости пересоберите модули.
- Для бесшовного отката сохраняйте старые бинарники и конфиги; тестируйте в staging-среде.
Пример playbook для быстрой сборки (краткий SOP)
- Обновить систему и установить Development Tools.
- Скачать исходники Nginx и необходимые версии PCRE/zlib/OpenSSL.
- Распаковать все архивы и запустить ./configure с нужными опциями.
- make && sudo make install.
- Создать systemd-юнит, пользователя nginx, права на логи и директории.
- Запустить nginx, проверить nginx -t и curl -I.
- Настроить logrotate и бэкап конфигов.
Когда нужно пересобирать Nginx
- Вы хотите обновить OpenSSL для TLS 1.3 или новых шифров.
- Добавлены/удалены модули, влияющие на ABI.
- Было найдено критическое уязвимость в используемой библиотеке.
Итог и контрольные точки
- Собранный вручную Nginx даёт гибкость и контроль над зависимостями, но требует сопровождения.
- Для production-серверов оцените затраты на поддержку против преимуществ новых возможностей.
Важно: если вы используете собственную сборку OpenSSL — отслеживайте CVE и своевременно пересобирайте Nginx при необходимости.
Короткое резюме:
- Сборка из исходников — отличный путь, если вам нужен современный стек TLS или нестандартные модули.
- Если важна простота обновления — используйте пакеты дистрибутива или контейнеры.
Примечание: примеры в руководстве используют конкретные версии исходников. Перед выполнением обновите номера версий под актуальные релизы.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента