Установка Nginx из исходников на Fedora 29
Короткое описание
Nginx (произносится как “engine x”) — это лёгкий и высокопроизводительный веб‑сервер с модульной архитектурой. Он может работать как HTTP/HTTPS сервер, обратный прокси, почтовый прокси, балансировщик нагрузки, TLS‑терминатор и кэш‑сервер. Модули Nginx бывают встроенные (core) и внешние (third‑party). Сборка из исходников даёт гибкость: вы выбираете точные модули и версию OpenSSL, с которой будет скомпилирован бинарник.
В этой инструкции мы собираем open source Nginx mainline (в примере 1.15.8). Процесс для stable такой же — меняется только номер версии.
Что вы получите из этой инструкции
- Пошаговая сборка Nginx с зависимостями в исходниках (OpenSSL, PCRE, Zlib)
- Примеры конфигурации ./configure с динамическими и статическими модулями
- Systemd‑юнит, структура каталогов, rotator логов и права доступа
- Рекомендации по безопасности и отладке
Варианты релизов Nginx
- Mainline — содержит последние функции и фикс‑патчи. Подходит, если вам нужны новые возможности и вы готовы тестировать.
- Stable — более консервативен, содержит проверенные релизы. Подходит для продакшн‑систем, где критична предсказуемость.
Типы модулей
- Core (встроенные) — разрабатываются ядром Nginx и включены в пакет.
- Third‑party — сообщества и разработчики создают модули для расширения функционала.
- Static vs Dynamic — статические модули встраиваются в бинарник при компиляции; динамические можно собрать отдельно и загружать через load_module в nginx.conf.
Важно: динамические модули появились в Nginx 1.9.11+ (февраль 2016). Для сборки используйте синтаксис –with-
Краткий список требований
- ОС: Fedora 29 (в примере)
- Нерутовый пользователь с sudo
- Компилятор: GCC (пакет “Development Tools”)
- Библиотеки (минимум): OpenSSL/LibreSSL/BoringSSL, Zlib, PCRE
- Дополнительно: Perl, libxslt, libxml2, LibGD, GeoIP (опционально)
Факто‑бокс
- Минимальные обязательные библиотеки: OpenSSL, Zlib, PCRE
- Пример версии в статье: nginx 1.15.8, OpenSSL 1.1.1a, zlib 1.2.11, pcre 8.42
Начальные шаги на Fedora 29
Проверьте версию Fedora:
cat /etc/fedora-release
# Fedora release 29 (Twenty Nine)Установите часовой пояс:
timedatectl list-timezones
sudo timedatectl set-timezone 'Region/City'Обновите систему:
sudo dnf upgrade -yУстановите базовые утилиты:
sudo dnf install -y vim curl wget treeСборка Nginx из исходников
- Установите инструменты компиляции:
sudo dnf groupinstall -y 'Development Tools'- Скачайте и распакуйте исходники 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 dnf 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.8- Для обзора структуры используйте tree:
tree -L 2 .- Скопируйте man‑страницу в систему:
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
# Check that Man page for Nginx is working:
man nginx
- Узнайте доступные опции configure:
./configure --help
# To see want core modules can be build as dynamic run:
./configure --help | grep -F =dynamic- Пример конфигурации, компиляции и установки Nginx с набором модулей (пример из статьи):
./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=Fedora \
--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/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 ~
sudo ln -s /usr/lib64/nginx/modules /etc/nginx/modules- Проверка версии и аргументов конфигурации:
sudo nginx -V
# nginx version: nginx/1.15.8 (Fedora)
# built by gcc 8.2.1 20150623 (Red Hat 8.2.1-6) (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
# Если появится ошибка о /var/cache/nginx/client_temp, создайте директории:
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‑юнит для 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.targetNOTE: Местоположение PID файла и бинарника может отличаться, если 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 как визуальную проверку.

- Удалите файлы с расширением .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- Настройте логротэйт для Nginx:
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, собранный из исходников и скомпилированный против указанной версии OpenSSL. Это даёт контроль над наборами шифров и возможностью использовать TLS 1.3 и современные алгоритмы вроде CHACHA20_POLY1305 (если OpenSSL и конфигурация поддерживают).
Когда сборка из исходников — не лучший выбор
- Если вам нужна быстрая установка с поддержкой автоматических обновлений — используйте пакеты dnf/apt или контейнеры.
- Если вы не хотите заботиться об обновлениях OpenSSL — лучше использовать системные пакеты, которые обновляются через репозиторий.
- Для лёгкой масштабируемости и однородности окружений CI/CD удобнее использовать контейнеры (Docker/OCI) с готовым образом.
Альтернативные подходы
- Установка из репозиториев Fedora: sudo dnf install nginx
- Использование официальных пакетов от nginx.org (rpm) для удобных обновлений
- Docker образ nginx: быстрый запуск и консистентность среды
- Использование управляемых балансировщиков/CDN если хотите избежать управления TLS на уровне сервера
Безопасность и рекомендованные жесткие настройки
- Соберите Nginx с последней стабильной OpenSSL для поддержки TLS 1.3.
- Отключите старые шифры и TLS 1.0/1.1 в конфигурации.
- Включите HSTS и Content Security Policy в нужных сайтах.
- Ограничьте права пользователя nginx (run as nonroot user) и примените SELinux/AppArmor, если доступно.
- Регулярно обновляйте OpenSSL/сборку при появлении критичных уязвимостей.
Пример безопасного набора шифров в nginx.conf:
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:...';
ssl_prefer_server_ciphers on;Мини‑методология выбора модулей перед сборкой
- Определите требования (HTTP/2, geoip, lua, pagespeed и т.д.).
- Сверьте зависимости модулей и совместимость с версией Nginx.
- Если функционал критичен — включайте статически; если нужен гибкий lifecycle — соберите как dynamic.
- Тестируйте сборку в staging перед развёртыванием в production.
Чеклист принятия решения:
- Нужен ли модуль в каждом экземпляре сервера? Если да — статический.
- Будут ли модули обновляться отдельно? Если да — dynamic.
- Зависит ли модуль от внешних библиотек, которые меняются часто? Если да — динамический модуль упрощает обновление.
Ролевые чеклисты
Администратор сервера:
- Проверил зависимости и версии OpenSSL/PCRE/Zlib
- Собрал и установил Nginx
- Создал пользователя nginx и настроил права
- Настроил systemd и логротацию
- Проверил работу сервиса и безопасность
Разработчик / DevOps:
- Протестировал модули, необходимые приложению
- Настроил sites‑available/sites‑enabled и блокировки
- Настроил мониторинг / метрики (stub_status или Prometheus exporter)
Быстрое руководство по отладке
- Проверка синтаксиса: sudo nginx -t
- Логи: /var/log/nginx/error.log и access.log
- Процессы: ps aux | grep nginx
- Перезапуск: sudo systemctl restart nginx
- Переустановить модуль динамически: скопировать .so в /etc/nginx/modules, обновить nginx.conf с load_module и перезагрузить
Совместимость и миграция
- При миграции с системного пакета на сборку из исходников проверьте, что пути в systemd и конфигурации совпадают.
- Если у вас уже есть ssl-сертификаты, убедитесь, что права на ключи корректные и nginx может их читать.
- При смене OpenSSL проверьте поддерживаемые шифры и обратную совместимость с клиентами.
Дерево решений для выбора способа установки
flowchart TD
A[Нужна быстрая установка?] -->|Да| B[Использовать dnf или rpm пакет]
A -->|Нет| C[Нужен контроль над OpenSSL/модулями?]
C -->|Да| D[Сборка из исходников]
C -->|Нет| B
D --> E{Требуется консистентность окружений}
E -->|Да| F[Использовать Docker с кастомной сборкой]
E -->|Нет| G[Сборка на хосте и деплой]Краткий глоссарий
- mainline — ветка разработки с новыми фичами
- stable — проверенная ветка с долгосрочной поддержкой
- load_module — директива для загрузки динамических модулей
- ./configure — скрипт подготовки сборки с опциями
Примеры шаблонов и сниппетов
- Команда для проверки доступности HTTP:
curl -I 127.0.0.1- Проверка параметров сборки:
sudo nginx -V- Быстрая команда для удаления временных исходников:
rm -rf nginx-1.15.8/ openssl-1.1.1a/ pcre-8.42/ zlib-1.2.11/Критерии приёмки
- Nginx запускается без ошибок: sudo nginx -t и systemctl status nginx.service
- Стартовая страница или тестовый сайт отвечает по HTTP
- Логи пишутся и легко ротируются
- Права на каталоги /var/cache/nginx корректны
Риски и рекомендации по смягчению
- Риск: устаревший OpenSSL в системе. Мягчение: сборка с актуальной версией OpenSSL и план обновлений.
- Риск: несовместимость модулей при обновлении. Мягчение: тестирование в staging и использование динамических модулей.
- Риск: неправильные права на ключи TLS. Мягчение: проверка прав доступа и SELinux контекстов.
Итог
Сборка Nginx из исходников даёт максимальную гибкость в выборе модулей и версии криптопакета. Это полезно, если вам нужна поддержка новых протоколов или конкретных функций. Если же вы предпочитаете простоту и регулярные обновления через пакетный менеджер, используйте dnf/rpm или контейнеры. Важно тестировать сборку и иметь процесс обновления безопасности.
Короткое резюме:
- Сборка из исходников: гибкость и контроль.
- Пакеты/контейнеры: простота и автоматические обновления.
- Тестируйте и следите за безопасностью.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента