Что такое Nginx и зачем он нужен

Nginx — это «вахтёр» вашего сайта: он первым встречает каждый запрос, отдаёт картинки и CSS сам, а всё остальное вежливо передаёт вашему приложению.
«Любой запрос из интернета сначала стучится в Nginx, и только потом — если Nginx так решит — попадает к вашему коду.»

Представь, что ты написал сайт на Python, Node.js или PHP. Локально он работает: запускаешь python manage.py runserver — и страница открывается на localhost:8000. Но как только дело доходит до настоящего интернета и тысяч пользователей, выясняется, что встроенный сервер приложения не предназначен для этого: он медленно отдаёт статику, не умеет в HTTPS толком, падает под нагрузкой и держит по одному потоку на соединение.

Здесь и появляется Nginx (читается «энджин-икс») — лёгкий и невероятно быстрый веб-сервер. Он умеет три ключевые вещи: раздавать статические файлы (картинки, CSS, JS), работать обратным прокси (принимать запрос и пересылать его твоему приложению) и балансировать нагрузку между несколькими копиями приложения. Плюс — терминировать HTTPS, кешировать ответы, ограничивать частоту запросов и защищать от части атак.

Зачем ставить Nginx перед приложением

Главная идея — разделение труда. Приложение должно заниматься бизнес-логикой, а не тратить драгоценные потоки на отдачу логотипа в формате PNG. Nginx отдаёт статику в десятки раз быстрее и при этом разгружает бэкенд. Вот типичная схема, которую мы будем разбирать весь курс:

        Интернет (тысячи клиентов)
                  |
                  v
        +-------------------+
        |      Nginx        |  <- статика, TLS, кеш, лимиты
        +-------------------+
           |            |
   (статика сам)   proxy_pass
                        |
                        v
              +-------------------+
              | Приложение (app)  |  <- только логика
              +-------------------+

Nginx стоит «на входе» (edge) и решает, что делать с каждым запросом: отдать файл с диска самому или передать дальше — на бэкенд. Бэкенд при этом вообще не виден из интернета напрямую, что само по себе плюс к безопасности.

Как работает под капотом

Секрет скорости Nginx — событийная (event-driven) архитектура. Старые серверы вроде классического Apache (в режиме prefork) создавали отдельный процесс или поток на каждое соединение. Тысяча клиентов — тысяча потоков, гора памяти и постоянное переключение контекста. Nginx устроен иначе: небольшое число рабочих процессов (обычно по одному на ядро CPU) обслуживают тысячи соединений каждый, используя неблокирующий ввод-вывод и системные механизмы вроде epoll на Linux. Один процесс крутит цикл событий и реагирует только тогда, когда на сокете реально что-то происходит. Подробно это разберём в следующих уроках.

Частые ошибки

  • «Зачем мне Nginx, у меня и так работает». На runserver или node app.js можно показать демо, но это не прод: нет нормальной отдачи статики, нет защиты, один процесс — одна точка отказа.
  • Путать прямой и обратный прокси. Прямой (forward) прокси работает на стороне клиента и скрывает клиента. Обратный (reverse) — на стороне сервера и скрывает серверы. Nginx — это про обратный.
  • Считать Nginx «тяжёлым». Наоборот: пустой Nginx занимает единицы мегабайт памяти и стартует мгновенно.

Best practices

  • С самого начала проектируй так, будто Nginx стоит перед приложением — так ты не будешь хардкодить абсолютные URL и порты.
  • Приложение слушает только 127.0.0.1 (локальный адрес), наружу смотрит только Nginx.
  • Статику (CSS, JS, изображения) всегда отдавай через Nginx, а не через фреймворк.

Где это встречается на практике

Почти любой современный сайт, который ты открываешь, скорее всего проходит через Nginx или подобный ему сервер. Интернет-магазины ставят его перед каталогом, чтобы мгновенно отдавать фотографии товаров. SaaS-сервисы прячут за ним десятки микросервисов, и снаружи это выглядит как один домен. Стриминговые платформы используют его для раздачи кусков видео. Даже если ты деплоишь маленький pet-проект на одном виртуальном сервере, связка «Nginx спереди + приложение на localhost» — это стандарт де-факто, с которого начинают.

Важно понимать и альтернативы, чтобы видеть место Nginx. Apache HTTP Server исторически был королём, но его процессно-поточная модель хуже держит массу одновременных соединений. Caddy привлекателен автоматическим HTTPS из коробки. HAProxy силён именно как балансировщик, но не раздаёт статику. Traefik удобен в мире контейнеров и Kubernetes. Nginx же — золотая середина: он и быстрый веб-сервер, и проверенный временем прокси, и балансировщик, и при этом потребляет минимум ресурсов. Поэтому, освоив его, ты получаешь инструмент, который пригодится практически в любом стеке — от классического сервера до контейнеров, где Nginx часто работает ingress-контроллером.

Итоги

Nginx — это быстрый веб-сервер и обратный прокси, который ставят «на входе» перед приложением. Он раздаёт статику, терминирует HTTPS, балансирует нагрузку и защищает бэкенд. За скорость отвечает событийная архитектура с небольшим числом рабочих процессов. Дальше мы разберём эту архитектуру детально и научимся писать конфигурацию.

Проверьте себя
1. Какую роль чаще всего выполняет Nginx в продакшене?
AКомпилирует код приложения в машинный
BОбратный прокси и веб-сервер на входе перед приложением
CБаза данных для хранения сессий
DСреда выполнения JavaScript на сервере
2. Чем обратный (reverse) прокси отличается от прямого (forward)?
AНичем, это синонимы
BОбратный работает на стороне сервера и скрывает бэкенды, прямой — на стороне клиента
CОбратный медленнее
DПрямой умеет HTTPS, а обратный нет