Что такое 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, балансирует нагрузку и защищает бэкенд. За скорость отвечает событийная архитектура с небольшим числом рабочих процессов. Дальше мы разберём эту архитектуру детально и научимся писать конфигурацию.