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

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

7 min read DevOps Обновлено 26 Nov 2025
Сборка Nginx из исходников на CentOS 7
Сборка Nginx из исходников на CentOS 7

Обложка: установка и сборка Nginx из исходных файлов на сервере

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

В этом руководстве подробно показано, как собрать 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

Страница справки 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.

Стандартная стартовая страница 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/

Подсветка синтаксиса Nginx в 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-сборок с предсобранными модулями.

Краткая методология принятия решения

  1. Нужен новый OpenSSL / TLS 1.3 -> собрать из исходников с указанной версией OpenSSL.
  2. Нужны нестандартные модули -> собрать из исходников или подключить динамически.
  3. Нужна быстрая установка/обновление -> использовать пакеты репозитория.

Факты и ключевые числа

  • Пример версии 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)

  1. Обновить систему и установить Development Tools.
  2. Скачать исходники Nginx и необходимые версии PCRE/zlib/OpenSSL.
  3. Распаковать все архивы и запустить ./configure с нужными опциями.
  4. make && sudo make install.
  5. Создать systemd-юнит, пользователя nginx, права на логи и директории.
  6. Запустить nginx, проверить nginx -t и curl -I.
  7. Настроить logrotate и бэкап конфигов.

Когда нужно пересобирать Nginx

  • Вы хотите обновить OpenSSL для TLS 1.3 или новых шифров.
  • Добавлены/удалены модули, влияющие на ABI.
  • Было найдено критическое уязвимость в используемой библиотеке.

Итог и контрольные точки

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

Важно: если вы используете собственную сборку OpenSSL — отслеживайте CVE и своевременно пересобирайте Nginx при необходимости.

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

  • Сборка из исходников — отличный путь, если вам нужен современный стек TLS или нестандартные модули.
  • Если важна простота обновления — используйте пакеты дистрибутива или контейнеры.

Примечание: примеры в руководстве используют конкретные версии исходников. Перед выполнением обновите номера версий под актуальные релизы.

Поделиться: 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 быстро