Установка Nginx, Angie и OpenResty: пакеты, версии, Docker

Рейтинг: 80.6% · 16 голосов
Самый подробный курс по Nginx - от первого конфига до production API-gateway. Архитектура и event loop, контексты и location, виртуальные хосты, статика, reverse proxy и upstream-балансировка, кэширование, HTTPS и TLS (post-quantum), HTTP/2 и HTTP/3 QUIC, безопасность и rate limiting, realip, JSON-логи и сквозная трассировка, метрики, тюнинг и траблшутинг. Плюс OpenResty (Lua, фазы, JWT, динамика) и Angie (нативные Prometheus, ACME, dynamic upstream). На основе эталонного gateway и лучших практик. Для новичков и SRE/DevOps. Актуально на 2026 (nginx 1.30/1.31, Angie, ingress-nginx EOL -> Gateway API).
Ответить
Аватара пользователя
Igor_NgINX
Сообщения: 44
Зарегистрирован: 11 май 2026, 05:31

Установка Nginx, Angie и OpenResty: пакеты, версии, Docker

Сообщение Igor_NgINX »

Оглавление курса (44)
  1. Что такое Nginx и почему он захватил веб
  2. Установка Nginx, Angie и OpenResty: пакеты, версии, Docker (вы здесь)
  3. Первый конфиг с нуля: минимальный сервер за 5 минут
  4. Архитектура процессов: master, worker и event loop
  5. Анатомия конфигурации: контексты, наследование и модульность
  6. Виртуальные хосты: server и server_name
  7. Директива location: матчинг и приоритеты по шагам
  8. Раздача статики: root, alias, try_files, sendfile
  9. Переменные, map и блок if
  10. rewrite, return и канонизация URL
  11. Работа с заголовками: add_header и proxy_set_header
  12. Модель доверия прокси-заголовков: realip и защита от спуфинга
  13. Сжатие: gzip, brotli и zstd
  14. Reverse proxy: proxy_pass и проброс запроса
  15. upstream и балансировка нагрузки
  16. Таймауты, повторы и устойчивость прокси
  17. FastCGI и PHP: nginx + PHP-FPM (и uwsgi/scgi)
  18. WebSocket, gRPC и стриминг через Nginx
  19. Кэширование ответов: proxy_cache и микрокэш
  20. HTTPS и TLS: сертификаты, протоколы, шифры (2026)
  21. Let's Encrypt и ACME: certbot, acme.sh, нативный ACME Angie
  22. HTTP/2 и HTTP/3 (QUIC) в 2026
  23. Безопасность: заголовки, скрытие версии, ограничения
  24. Rate limiting и защита от перегрузки
  25. Контроль доступа: allow/deny, auth_basic, auth_request и mTLS
  26. Логирование: access_log, форматы и структурированный JSON
  27. Сквозная трассировка запросов и OpenTelemetry
  28. Метрики и мониторинг Nginx
  29. Производительность и тюнинг под нагрузку
  30. Траблшутинг: 502, 504, 403, 404 и debug-лог
  31. OpenResty: Nginx как платформа на LuaJIT
  32. Фазы обработки запроса и Lua-хуки
  33. Lua API: ngx.*, shared dict, cosocket и lua-resty-core
  34. Практика OpenResty: авторизация, JWT, кэш, Redis
  35. Angie: современный форк Nginx 2026
  36. Динамическая конфигурация и service discovery
  37. Nginx как API-gateway и Kubernetes Gateway API
  38. Динамические модули, njs и WAF
  39. Stream-модуль: проксирование TCP и UDP
  40. Деплой, перезагрузка и конфиг как код
  41. Сценарий: статика, SPA и кэширование за CDN
  42. Сценарий: микросервисный gateway по образцу ngx-trace-gateway
  43. Капстоун: собираем production-gateway с нуля
  44. Чек-лист безопасности, CVE 2026 и аудит конфигурации
Ты собираешься построить шлюз, который выдержит боевой трафик. Но прежде чем писать первый location, надо ответить на скучный с виду, но коварный вопрос: какой именно nginx у тебя стоит и с чем он собран? Девять из десяти проблем новичка - "директива не работает", "модуль не подключается", "HTTP/3 не поднимается", "TLS 1.3 ведёт себя странно" - это не баги, а следствие того, что поставили не ту версию или не из того источника. Ubuntu из коробки даёт тебе nginx, которому может быть полтора-два года, без свежих модулей и с дырами, которые давно закрыли. Поэтому первый профессиональный навык - осознанно выбрать дистрибутив, ветку и способ установки. Разберём это до винтика: где взять, чем отличаются nginx, Angie и OpenResty, как их поставить на Debian и RHEL, как запустить в Docker и как по выводу одной команды понять, на что твой бинарник вообще способен.

Три разных продукта: nginx, Angie, OpenResty - и зачем они нужны

Все трое - это веб-серверы и обратные прокси на общем коде, но решают разные задачи, и путать их нельзя.

nginx - оригинал, теперь под крылом F5. Это база, эталон, на нём построены оба остальных. В 2026 году актуальны две ветки: stable 1.30.x (на момент написания 1.30.2) и mainline 1.31.x (1.31.1). Это важно зафиксировать в голове: никаких 1.27 и 1.25 - они устарели. Отдельно держи в уме freenginx - форк Максима Дунаева, одного из ключевых разработчиков nginx; он живой, выпускает свои security-релизы (stable 1.30.1, mainline 1.31.2) и не заброшен. Для большинства задач ты ставишь именно nginx с nginx.org.

Angie - форк nginx от части бывшей команды, который бесплатно и нативно даёт то, за что в nginx исторически просили деньги или городили костыли: активные health checks для апстримов, slow_start, детальный REST API /status с JSON по зонам и апстримам, метрики Prometheus, нативный ACME прямо в конфиге (выпуск сертификатов без certbot), нативный Zstd-сжатие, динамическое управление апстримами через API без reload, автообнаружение контейнеров по меткам Docker. Версии 2026 - около 1.11.6 (база nginx 1.29.x) и ветка 1.12 (база 1.31.1). Если тебе нужен зрелый шлюз с мониторингом из коробки - смотри на Angie.

OpenResty - это nginx, в который встроили LuaJIT (свой форк openresty/luajit2 с GC64) и десятки Lua-модулей. Превращает сервер в программируемую платформу: ты пишешь логику обработки запроса прямо на Lua внутри конфига. Версия 2026 - 1.31.1.1 (вышла 5 июня 2026). Именно на OpenResty строят полноценные API-gateway, к чему мы и придём в конце курса. Эталонный проект нашего курса - ngx-trace-gateway - крутится как раз на образе openresty/openresty.

Изображение

Установить nginx: дистрибутивный пакет против официального репозитория

Когда ты делаешь установку nginx через apt из штатных репозиториев Ubuntu или Debian, ты получаешь версию, которую заморозил мейнтейнер дистрибутива. Это удобно (одна команда, автообновления с системой), но версия старая. На свежей Ubuntu это может быть 1.28.x или старше - без части модулей и фич 2026 года. Для теста сойдёт, для прода - почти всегда нет.

Профессиональный путь - официальный репозиторий nginx.org. Там и stable, и mainline, всегда свежие. Вот полная nginx установка ubuntu/debian из официального источника:

Код: Выделить всё

# зависимости
sudo apt update
sudo apt install -y curl gnupg2 ca-certificates lsb-release debian-archive-keyring

# импортируем ключ подписи в отдельный keyring (так правильно в 2026, не apt-key)
curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
  | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null

# подключаем STABLE-ветку (для Debian замени ubuntu на debian)
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
http://nginx.org/packages/ubuntu $(lsb_release -cs) nginx" \
  | sudo tee /etc/apt/sources.list.d/nginx.list

# для MAINLINE - вместо packages/ubuntu пиши packages/mainline/ubuntu

# пиннинг: чтобы пакет тянулся именно с nginx.org, а не из дистрибутива
echo -e "Package: *\nPin: origin nginx.org\nPin: release o=nginx\nPin-Priority: 900\n" \
  | sudo tee /etc/apt/preferences.d/99nginx

sudo apt update
sudo apt install -y nginx
Разберём ключевые места. Ключ кладём в /usr/share/keyrings и ссылаемся на него через signed-by - это современная схема, apt-key объявлен устаревшим. Пиннинг с Pin-Priority 900 нужен, чтобы apt предпочитал пакет с nginx.org, даже если в дистрибутиве версия с большим номером. Без него после очередного apt upgrade тебя может молча перекинуть на дистрибутивную сборку. lsb_release -cs подставляет кодовое имя релиза (например noble, bookworm) - репозиторий собран по релизам.

На RHEL-семействе (RHEL, Rocky, Alma, Fedora) - через dnf и .repo-файл:

Код: Выделить всё

# /etc/yum.repos.d/nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx.org.key
module_hotfixes=true

# затем
sudo dnf install -y nginx
Строка module_hotfixes=true важна на RHEL 8/9: без неё dnf-модули могут перекрыть репозиторий nginx и поставить дистрибутивную версию. Переменные $releasever и $basearch dnf подставляет сам.

Установка Angie и OpenResty: отдельные репозитории

Angie ставится из своего репозитория - схема та же, но домен и ключ другие. Принцип: добавляешь репозиторий angie.software, импортируешь их ключ, ставишь пакет angie. Базовый пакет даёт ядро, а вот фичи вроде /status-консоли и Prometheus уже встроены в основной бинарник - доплачивать или докачивать сторонние модули не нужно, в этом и фишка. Проверь установку так же, как nginx: angie -v и angie -V (бинарник называется angie, но конфиг-синтаксис совместим с nginx, и многие зовут его через симлинк).

OpenResty установка - тоже отдельный репозиторий, бинарник лежит в /usr/local/openresty/ и называется openresty (это обёртка над nginx с вкомпилированным LuaJIT):

Код: Выделить всё

# Debian/Ubuntu, кратко
curl -fsSL https://openresty.org/package/pubkey.gpg | sudo gpg --dearmor \
  -o /usr/share/keyrings/openresty.gpg
echo "deb [signed-by=/usr/share/keyrings/openresty.gpg] \
http://openresty.org/package/ubuntu $(lsb_release -cs) main" \
  | sudo tee /etc/apt/sources.list.d/openresty.list
sudo apt update && sudo apt install -y openresty

# проверка - в выводе должно быть LuaJIT
openresty -V
# nginx version: openresty/1.31.1.1
# built with OpenSSL ...
# --with-luajit ... --with-http_ssl_module ...
Если в выводе openresty -V ты видишь LuaJIT и --with-luajit - значит Lua-фазы (вроде content_by_lua, access_by_lua, balancer_by_lua) тебе доступны. Это твой будущий рабочий инструмент для API-gateway.

nginx docker: образы, которые экономят часы

Для контейнерных стендов и CI ничего ставить руками не надо. nginx docker - это официальные образы с Docker Hub. Три семейства, которые надо знать:
  • nginx - официальный образ. Теги nginx:1.30 (stable), nginx:1.31 (mainline), nginx:latest, плюс лёгкие nginx:1.30-alpine на musl-базе (меньше размер).
  • openresty/openresty - образ OpenResty с LuaJIT и Lua-модулями. На нём построен наш эталонный ngx-trace-gateway.
  • -otel образы - сборки с официальным модулем телеметрии ngx_otel_module внутри. Важно: этот модуль open-source (не Plus-only), доступен с nginx 1.25.3, а с 1.27.5 включён в -otel-образы по умолчанию. Даёт распределённую трассировку через OTLP/gRPC с W3C trace context.
Минимальный запуск и проверка:

Код: Выделить всё

# поднять nginx stable, прокинуть свой конфиг только на чтение (ro)
docker run -d --name gw \
  -p 80:80 \
  -v $(pwd)/nginx.conf:/etc/nginx/nginx.conf:ro \
  nginx:1.30

# проверить версию и флаги сборки внутри контейнера
docker exec gw nginx -V

# проверить синтаксис конфига (это же делает healthcheck в эталонном проекте)
docker exec gw nginx -t
В эталонном ngx-trace-gateway тома монтируются именно с флагом :ro (read-only), а healthcheck контейнера - это nginx -t. Логика простая: контейнер не должен иметь права менять свой конфиг, а оркестратор должен считать контейнер здоровым только если конфиг валиден. Запомни этот паттерн, мы будем им пользоваться весь курс.

nginx -V: как прочитать паспорт своего бинарника

Это самая важная диагностическая команда курса. nginx -v (маленькая) показывает только версию. А nginx -V (большая) - это паспорт: версия, компилятор, версия OpenSSL и полный список флагов ./configure, с которыми бинарник собран. Именно отсюда ты узнаёшь, что твой nginx умеет:

Код: Выделить всё

nginx -V
# nginx version: nginx/1.30.2
# built by gcc ...
# built with OpenSSL 3.5.0 ...
# TLS SNI support enabled
# configure arguments: --with-http_ssl_module --with-http_v2_module
#   --with-http_v3_module --with-http_realip_module
#   --with-http_stub_status_module --with-stream ...
Как это читать на практике:
  • Нет --with-http_v3_module - HTTP/3 и QUIC просто не заработают, хоть ты обпишись listen 443 quic. Надо ставить сборку с поддержкой v3.
  • Версия OpenSSL критична: пост-квантовый обмен ключей (ssl_ecdh_curve X25519MLKEM768) требует OpenSSL 3.5+; в nginx 1.29.8 завезли поддержку OpenSSL 4.0. Старый OpenSSL - нет гибридного TLS, и Chrome с Firefox не дадут тебе пост-квантовый хендшейк.
  • Нет --with-http_realip_module - и тогда $remote_addr у тебя будет адресом ближайшего прокси или CDN, а не клиента. Это ломает логи, rate-limit и geo. Модуль realip обязателен за любым балансировщиком.
  • --with-stream - нужен для проксирования TCP/UDP (L4), а не только HTTP.
Привычка номер один профессионала: на новом сервере первым делом гнать nginx -V и читать, с чем собрана конкретно эта сборка. Дистрибутивный nginx и nginx с nginx.org собраны с разным набором флагов - не предполагай, проверяй.

Структура файлов и systemd

После пакетной установки конфиги лежат в /etc/nginx. Раскладка:
  • /etc/nginx/nginx.conf - главный файл, точка входа. В эталонном проекте он минимален: worker_processes auto, error_log, pcre_jit on, и include на events.conf и http.conf.
  • /etc/nginx/conf.d/*.conf - сюда официальный пакет nginx.org кладёт default.conf; всё, что подключено через include conf.d/*.conf, грузится автоматически.
  • sites-available + sites-enabled - это схема Debian/Ubuntu, а не самого nginx. Конфиги сайтов лежат в sites-available, а в sites-enabled - симлинки на активные. Включить сайт = сделать симлинк, выключить = удалить симлинк, без правки файла. На сборках с nginx.org этой схемы по умолчанию нет - там conf.d. Не путай два подхода.
  • /var/log/nginx/ - access и error логи; /usr/share/nginx/html/ - дефолтный корень сайта.
Управление - через systemd:

Код: Выделить всё

sudo systemctl enable --now nginx   # включить в автозапуск и стартовать
sudo systemctl status nginx          # состояние
sudo nginx -t                         # проверить конфиг ПЕРЕД релоадом
sudo systemctl reload nginx           # мягко перечитать конфиг (без обрыва соединений)
sudo systemctl restart nginx          # жёсткий перезапуск (соединения рвутся)
Золотое правило: всегда nginx -t перед reload. reload корректен только при валидном конфиге - иначе старые воркеры продолжат работать на старом конфиге, и ты будешь думать, что изменения применились, а они нет. reload (он же сигнал SIGHUP) поднимает новые воркеры на новом конфиге, а старые доживают текущие соединения и гасятся - в этом красота nginx, релиз конфига без даунтайма.

Сборка из исходников: когда ./configure неизбежен

Пакеты закрывают 95% случаев. Но иногда нужен модуль, которого нет в готовой сборке: сторонний Brotli (ngx_brotli не встроен в nginx, это сторонний динамический модуль), или специфичный апстрим-модуль. Тогда - сборка:

Код: Выделить всё

./configure --prefix=/etc/nginx \
  --with-http_ssl_module --with-http_v2_module --with-http_v3_module \
  --with-http_realip_module --with-stream \
  --add-dynamic-module=../ngx_brotli
make && sudo make install
# модуль подключается в nginx.conf:
# load_module modules/ngx_brotli_filter_module.so;
Ключевое: версия nginx, под которую собран динамический модуль, должна точно совпадать с версией бинарника - иначе load_module откажется его грузить. Поэтому, обновляя nginx, пересобирай и сторонние модули. Это главная причина боли с самосборными сборками, и заодно довод в пользу пакетов, пока тебе реально не нужен экзотический модуль.

Типичные грабли
  • Поставил из дистрибутива, ждёшь фич 2026. http2 on вместо устаревшего listen ... http2, 103 Early Hints, sticky-сессии - это новое. На старом дистрибутивном nginx их нет. Проверь версию через nginx -v, прежде чем гуглить "почему не работает".
  • Забыл пиннинг. Без /etc/apt/preferences.d/99nginx очередной apt upgrade молча подменит твою сборку с nginx.org на дистрибутивную. Версия откатится - сюрприз в проде.
  • Меняешь конфиг в работающем контейнере. Образ собран так, что правильный путь - монтировать конфиг томом и пересоздавать контейнер, а не лезть внутрь. Том на :ro защищает от случайной правки.
  • Не смотришь nginx -V. Полдня настраиваешь HTTP/3, а модуля --with-http_v3_module в сборке нет. Минута на nginx -V сэкономила бы полдня.
  • Перепутал sites-enabled и conf.d. Положил конфиг в sites-available на сборке с nginx.org, где include идёт только на conf.d/*.conf - и сайт не подхватился. Проверь, какие include реально прописаны в твоём nginx.conf.
Мини-лаба: поднять три сервера и сравнить

Сделай руками по шагам, это закрепит всё выше:
  • 1. Подними официальный nginx stable в Docker: docker run -d --name n1 -p 8081:80 nginx:1.30. Открой http://localhost:8081 - увидишь страницу-приветствие.
  • 2. Выполни docker exec n1 nginx -V и выпиши: версию, версию OpenSSL, есть ли --with-http_v3_module и --with-http_realip_module.
  • 3. Подними OpenResty: docker run -d --name o1 -p 8082:80 openresty/openresty:latest. Сделай docker exec o1 openresty -V и найди в выводе --with-luajit - это маркер, что Lua-фазы доступны.
  • 4. Сломай конфиг намеренно: зайди docker exec -it n1 sh, допиши в /etc/nginx/conf.d/default.conf строку мусора, выполни nginx -t - получишь ошибку с номером строки. Убери мусор, nginx -t снова - syntax is ok. Так ты увидел, почему healthcheck в эталонном проекте - это именно nginx -t.
  • 5. Сравни вывод nginx -V из nginx:1.30 и nginx:1.31 - найди отличия в наборе флагов и версии. Зафиксируй для себя, что бинарники реально разные.
Контрольные вопросы
  • 1. Чем nginx -v отличается от nginx -V и какие три вещи ты узнаёшь именно из nginx -V?
  • 2. Какая ветка stable, а какая mainline на 2026 год, и почему дистрибутивный пакет - часто не лучший выбор для прода?
  • 3. Зачем нужен файл пиннинга 99nginx и что произойдёт без него после apt upgrade?
  • 4. Какие три возможности Angie даёт бесплатно и нативно, а в nginx их пришлось бы докупать или городить руками?
Итог

Ты научился осознанно выбирать между nginx, Angie и OpenResty, ставить любой из них из официального репозитория на Debian и RHEL, запускать в Docker с правильными паттернами (том на :ro, healthcheck через nginx -t) и - главное - читать паспорт бинарника через nginx -V, чтобы знать его реальные возможности до того, как полдня воюешь с конфигом. Зафиксируй на 2026: stable 1.30.x, mainline 1.31.x, OpenResty 1.31.1.1, Angie 1.11/1.12. Дальше мы напишем первый рабочий конфиг и разберём, как именно nginx маршрутизирует запрос между server и location.
👍2 ❤️2 🔥3 😄 🤔1
Аватара пользователя
NginxKun
Сообщения: 1
Зарегистрирован: 02 июн 2026, 15:39

Re: Установка Nginx, Angie и OpenResty: пакеты, версии, Docker

Сообщение NginxKun »

А если на одной машине нужен и обычный nginx и openresty - они не подерутся за порты и пути? Или лучше каждый в свой контейнер и не выдумывать?
👍 ❤️ 🔥 😄 🤔
Аватара пользователя
medicine
Сообщения: 1
Зарегистрирован: 27 май 2026, 10:37

Re: Установка Nginx, Angie и OpenResty: пакеты, версии, Docker

Сообщение medicine »

Поставил из дистрибутива и реально полдня бился почему http2 on ругается. nginx -v показал 1.26 - все вопросы отпали. Совет про пиннинг тоже золото, ловил откат после апгрейда.
👍 ❤️ 🔥 😄 🤔
Ответить
← Предыдущая глава
Что такое Nginx и почему он захватил веб
Следующая глава →
Первый конфиг с нуля: минимальный сервер за 5 минут

Все главы курса «Nginx профессионально: от первого конфига до API-gateway на OpenResty и Angie»

Поделиться темой: ✈ Telegram VK
Похожие запросы: Установка и первый конфиг nginxnginx в DockerAngie: форк nginx с нативными метрикамиOpenResty: nginx на Lua

Вернуться в «Nginx профессионально: от первого конфига до API-gateway на OpenResty и Angie»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя