Первый конфиг с нуля: минимальный сервер за 5 минут

Рейтинг: 64% · 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

Первый конфиг с нуля: минимальный сервер за 5 минут

Сообщение 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 и аудит конфигурации
Теория - штука хорошая, но руки помнят лучше головы. Поэтому в этом уроке мы не будем разбирать контексты, модули, фазы обработки и прочую механику - всё это придёт в следующих главах. Сейчас задача одна: написать nginx первый конфиг своими руками, без include, без globals, без копипасты чужих гигантских файлов, запустить его и увидеть в браузере свою страницу. Один короткий файл, который реально работает. Это твой nginx hello world.

Боль, которую мы лечим, простая. Новичок открывает любой "боевой" nginx.conf и видит сорок include, десяток map, зоны лимитов, проксирование, TLS, кэш - и сразу тонет. Кажется, что nginx это что-то необъятное. На самом деле минимально рабочий веб-сервер на nginx - это примерно десять строк. Когда ты их напишешь сам и поймёшь каждую, дальше будет легко наращивать сложность. Так устроен и официальный beginners guide на nginx.org - сначала запусти, потом разбирайся.

nginx минимальный конфиг: из чего он состоит

Запомни одну вещь: главный конфиг nginx обязан содержать два блока верхнего уровня. Первый -

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

events { }
, даже пустой. Без него nginx просто не стартует, потому что ему нужно знать, как обрабатывать соединения (там живут настройки воркеров и лимитов). Второй -

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

http { }
, внутри которого мы описываем веб-сервера. Всё, что отдаёт HTTP, живёт внутри http.

Внутри http мы кладём блок

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

server { }
- это и есть один виртуальный сервер. У него два ключевых параметра: (какой порт слушать) и

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

server_name
(на какое имя хоста отвечать). А уже внутри server лежит

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

location { }
- правило "что делать с таким-то путём URL". Вот и вся иерархия для старта: events рядом с http, server внутри http, location внутри server. Три уровня вложенности - и сервер готов.

Давай напишем самый честный nginx простой конфиг, который только отдаёт текст, без всяких файлов и папок:

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

events { }

http {
    server {
        listen       80;
        server_name  localhost;

        location / {
            return 200 "Hello from nginx!\n";
        }
    }
}
Разберём построчно, потому что в этом весь смысл урока.

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

listen 80;
- слушаем стандартный HTTP-порт 80.

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

server_name localhost;
- отвечаем, когда в запросе хост localhost (а заодно это просто имя сервера для нас).

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

location / { ... }
- правило для всех путей, начинающихся со слеша, то есть для любого URL.

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

return 200 "...";
- не лезем ни в какие файлы, а сразу возвращаем код 200 и строку текста. Директива return - самый быстрый способ проверить, что nginx вообще жив, не заводя ни одной HTML-страницы. Это твой первый nginx пример конфига, который можно потрогать руками.

Изображение

nginx настройка с нуля для начинающих: запуск и проверка через curl

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

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

nginx -t
. Она не запускает сервер, а только читает конфиг и говорит, всё ли в нём в порядке. Привыкай делать это всегда - так ты ловишь опечатку до того, как уронишь работающий сервер.

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

# проверка синтаксиса конфигурации
nginx -t
Если всё хорошо, увидишь две строки:

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

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Слово successful - это зелёный свет. Теперь запускаем. Если nginx ещё не работает - просто команда (или

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

systemctl start nginx
на системах с systemd). Проверим результат не браузером, а через curl - так нагляднее, потому что видно не только тело ответа, но и заголовки. Ключ показывает заголовки ответа:

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

curl -i http://localhost/
Ответ будет такой:

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

HTTP/1.1 200 OK
Server: nginx/1.30.2
Date: Wed, 17 Jun 2026 10:00:00 GMT
Content-Type: text/plain
Content-Length: 18
Connection: keep-alive

Hello from nginx!
Вот тут остановись и посмотри внимательно. Строка

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

HTTP/1.1 200 OK
- сервер ответил успешно.

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

Server: nginx/1.30.2
- это актуальная стабильная версия nginx на 2026 год (stable-ветка 1.30, mainline уже 1.31.x).

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

Content-Length: 18
nginx посчитал сам. Если ты это видишь - поздравляю, ты только что подняла работающий веб-сервер на десяти строках. Это уже не теория, это твой сервер отвечает по сети.

Отдаём свою страницу: root, index и второй location

Возвращать строку - забавно, но настоящий веб-сервер отдаёт файлы. Сделаем так, чтобы nginx брал HTML с диска. Создадим папку и страницу:

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

mkdir -p /var/www
printf '<h1>Моя первая страница на nginx</h1>\n' > /var/www/index.html
Теперь перепишем конфиг так, чтобы он отдавал эту папку. Появляются две новые директивы - (где на диске лежат файлы сайта) и (какой файл отдавать, когда запросили каталог, а не конкретный файл):

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

events { }

http {
    server {
        listen       80;
        server_name  localhost;

        location / {
            root   /var/www;
            index  index.html;
        }

        location /ping {
            return 200 "pong\n";
        }
    }
}
Что здесь происходит. Когда приходит запрос на , nginx берёт root (/var/www), приклеивает к нему путь из URL и ищет файл. Запросили корень - значит каталог, поэтому в дело вступает index и nginx отдаёт /var/www/index.html. Запросили /style.css - nginx будет искать /var/www/style.css. Это и есть фундаментальная механика статики: итоговый путь к файлу = root + URI. Запомни эту формулу, она лежит в основе всей отдачи статики в nginx.

Второй блок

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

location /ping
- демонстрация того, что location-ов может быть много, и nginx выбирает наиболее подходящий по URL. Запрос на /ping попадёт сюда и вернёт pong, а всё остальное уйдёт в location /. То есть один location отдаёт файлы, другой - служебный ответ для проверки живости. Так в реальных конфигах и делают health-check эндпоинты.

nginx -s reload: применяем правки без простоя

Конфиг изменился - надо применить. Здесь новички совершают типичную ошибку: убивают процесс и запускают заново, ловя секунду недоступности. Правильно - перечитать конфиг на лету командой reload. Но сначала, как всегда,

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

nginx -t
, а уже потом reload:

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

nginx -t && nginx -s reload
Связка через - это не просто красиво. Reload выполнится только если проверка прошла успешно. Если в конфиге ошибка, nginx -t вернёт ненулевой код, и reload даже не запустится - старый рабочий конфиг останется в строю. Это твоя страховка от выстрела в ногу. Запомни этот шаблон навсегда: проверил, потом перечитал.

Как reload работает под капотом (на пальцах, без глубин): мастер-процесс читает новый конфиг, поднимает новых воркеров с новыми правилами, а старым воркерам говорит доработать текущие запросы и завершиться. Поэтому ни одно соединение не рвётся - это graceful reload, плавная перезагрузка. Проверим, что правка применилась:

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

curl http://localhost/
curl http://localhost/ping
Первая команда отдаст HTML твоей страницы, вторая - pong. Сервер ожил по-новому, и никто из посетителей этого не заметил.

Читаем ошибки при старте: что говорит nginx, когда что-то не так

Самое полезное умение новичка - не паниковать от красного текста, а читать его. nginx -t почти всегда точно показывает строку и причину. Разберём три классические грабли, на которые натыкаются все.

Грабля 1 - забыл точку с запятой. Каждая простая директива в nginx заканчивается на . Пропустил - получишь:

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

nginx: [emerg] directive "listen" is not terminated by ";" in /etc/nginx/nginx.conf:5
nginx: configuration file /etc/nginx/nginx.conf test failed
Слово emerg (emergency) и номер строки - идёшь на пятую строку и ставишь точку с запятой. failed вместо successful - значит конфиг не применился, ничего страшного не сломалось.

Грабля 2 - порт уже занят. Если на 80-м порту уже сидит другой процесс (например, Apache или ещё один nginx), при старте увидишь:

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

nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
Лечится либо остановкой того, кто занял порт, либо сменой порта в listen (например, на 8080). Кто держит порт, подскажет

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

ss -ltnp | grep :80
.

Грабля 3 - права на root-папку или нет файла. Конфиг при этом валиден (nginx -t скажет successful), но в браузере прилетит 403 Forbidden или 404 Not Found. Тогда смотрим не в nginx -t, а в лог ошибок:

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

tail -n 20 /var/log/nginx/error.log
Там будет человеческим языком: "Permission denied" (воркер не может прочитать файл - проверь права на /var/www) или "No such file or directory" (нет index.html по указанному root). Привыкай: nginx -t ловит синтаксис, а error.log ловит проблемы во время работы. Это два разных инструмента, и оба надо держать под рукой.

Мини-лаба: собери свой сервер руками за пять минут

Повтори всё сам по шагам, не подглядывая в готовое выше. Это и есть та самая nginx настройка с нуля для начинающих, после которой страх перед конфигом пропадает.
  • Открой /etc/nginx/nginx.conf (сделай бэкап:

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

    cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak
    ) и замени его содержимое монолитным конфигом с events, http, server и одним location, который возвращает

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

    return 200 "step one\n";
    .
  • Проверь синтаксис:

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

    nginx -t
    . Добейся слова successful. Если ошибка - читай номер строки и чини.
  • Запусти ( или

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

    systemctl start nginx
    ) и проверь:

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

    curl -i http://localhost/
    . Убедись, что видишь 200 OK и step one.
  • Создай /var/www/index.html со своим текстом. Перепиши location на

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

    root /var/www; index index.html;
    .
  • Добавь второй location /ping с

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

    return 200 "pong\n";
    .
  • Примени правки правильно:

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

    nginx -t && nginx -s reload
    .
  • Проверь оба адреса:

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

    curl http://localhost/
    (твой HTML) и

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

    curl http://localhost/ping
    (pong).
  • Сломай конфиг специально - убери одну точку с запятой, прогони nginx -t и прочитай ошибку. Затем верни на место. Так ты научишься читать emerg-сообщения без страха.
Если все шаги прошли - у тебя на руках полностью рабочий, написанный руками nginx пример конфига, и ты понимаешь в нём каждую строку.

Контрольные вопросы
  • Почему даже самый минимальный nginx.conf обязан содержать пустой блок

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

    events { }
    , и что произойдёт, если его убрать?
  • Чем отличается

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

    return 200 "text";
    от связки плюс - в каком случае nginx лезет на диск, а в каком нет?
  • Зачем перед

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

    nginx -s reload
    всегда запускают

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

    nginx -t
    , и почему их соединяют через ?
  • Конфиг прошёл nginx -t с результатом successful, но в браузере 403 - где искать причину и почему nginx -t её не поймал?
Итог

Ты собрала рабочий веб-сервер из десяти строк: events и http задают каркас, server слушает порт и имя, location решает, что отдавать - строку через return или файл через root и index. Ты проверяешь конфиг через nginx -t, применяешь правки через nginx -s reload, и читаешь ошибки по слову emerg и номеру строки, а проблемы времени работы - в error.log. Это и есть твой nginx первый конфиг, написанный с нуля и понятый до буквы. На этом фундаменте дальше мы спокойно разберём контексты, наследование директив и модульную структуру больших боевых конфигов - но теперь они тебя уже не напугают.
👍4 ❤️1 🔥1 😄 🤔
Аватара пользователя
gkling
Сообщения: 1
Зарегистрирован: 12 май 2026, 21:50

Re: Первый конфиг с нуля: минимальный сервер за 5 минут

Сообщение gkling »

Снёс точку с запятой как в граблях, увидел emerg и :5 - реально показал строку. Раньше боялся красного текста, теперь читаю спокойно, спасибо за разбор.
👍 ❤️2 🔥1 😄 🤔
Аватара пользователя
apha
Сообщения: 1
Зарегистрирован: 28 май 2026, 14:32

Re: Первый конфиг с нуля: минимальный сервер за 5 минут

Сообщение apha »

А можно вместо 80 поставить listen 8080, если на 80 уже висит апач? curl тогда curl localhost:8080 получается?
👍 ❤️1 🔥 😄 🤔2
Ответить
← Предыдущая глава
Установка Nginx, Angie и OpenResty: пакеты, версии, Docker
Следующая глава →
Архитектура процессов: master, worker и event loop

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

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

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

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

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