# Гайд по NGINX для новичков: от статики до балансировки нагрузки

Источник: https://www.youtube.com/watch?v=9t9Mp0BGnyI
Канал: freeCodeCamp.org
Опубликовано: 12.01.2024

---

Сетевая архитектура современных веб-приложений редко обходится без промежуточных звеньев между пользователем и сервером. В этом видеоуроке старший разработчик Ла Харб (La Harb) подробно разбирает NGINX — мощный инструмент, ставший стандартом индустрии для балансировки нагрузки, кэширования и обеспечения безопасности.

## 🧱 Что такое NGINX и каковы его основные функции
[[JUMP:00:27]]

На примере сервиса Airbnb Ла Харб демонстрирует, что браузер при загрузке страницы получает огромное количество контента: изображения, скрипты, текстовые данные [01:06]. Инструменты разработчика показывают, что в поле `Server` у многих запросов указан именно NGINX. Хотя его часто называют веб-сервером, технически это программное обеспечение выполняет гораздо более широкий спектр задач [02:27].

Ла Харб выделяет три ключевых сценария использования:

1.  **Обратный прокси (Reverse Proxy):** NGINX выступает посредником. Клиент отправляет запрос не напрямую к серверу приложения, а к NGINX, который передает его дальше, получает ответ и возвращает его пользователю [04:16].
2.  **Балансировщик нагрузки (Load Balancer):** Если у приложения миллионы пользователей, один сервер не справится с трафиком. NGINX распределяет входящие запросы между несколькими серверами (например, в облаке AWS), предотвращая перегрузку отдельных узлов [06:04].
3.  **Шифрование и SSL-терминация:** Вместо того чтобы настраивать HTTPS на каждом отдельном сервере приложения, можно возложить задачу дешифрования трафика на NGINX, упрощая инфраструктуру [07:34].

## ⚙️ Установка и базовая конфигурация
[[JUMP:08:13]]

Для пользователей macOS установка производится крайне просто через пакетный менеджер Homebrew командой `brew install nginx` [08:39]. Основные файлы конфигурации располагаются в директории `/usr/local/etc/nginx` (или аналогичной, в зависимости от ОС).

Главным файлом является `nginx.conf`. Ведущий предлагает очистить его содержимое, чтобы понять структуру с нуля. Конфигурация NGINX строится на двух понятиях [12:20]:

*   **Директивы (Directives):** Пары «ключ-значение» (например, `worker_processes 1;`), которые задают конкретные параметры.
*   **Контексты (Contexts):** Блоки кода, ограниченные фигурными скобками (например, `http {}` или `server {}`), внутри которых группируются связанные директивы [12:45].

## 📄 Обслуживание статического контента и MIME-типы
[[JUMP:13:11]]

Одной из базовых задач NGINX является отдача статических файлов (HTML, CSS, изображения). Для этого в контексте `http` создается блок `server`, где указываются две критически важные директивы:

*   `listen 8080;` — порт, на котором будет работать сервер [15:27].
*   `root /путь/к/файлам;` — директория на диске, где лежит ваш сайт [15:40].

### Проблема MIME-типов
При первом подключении CSS-стилей Ла Харб сталкивается с проблемой: стили не применяются, хотя файл успешно передается [18:58]. Причина кроется в заголовке `Content-Type`. Если NGINX не знает тип файла, он может отдавать CSS как обычный текст (`text/plain`), что игнорируется браузером [20:05].

Решение заключается в использовании директивы `include mime.types;` внутри контекста `http` [22:05]. Это подключает стандартную таблицу соответствий расширений файлов и их типов, корректно обрабатывая всё: от изображений до шрифтов.

## 📍 Работа с контекстом Location
[[JUMP:22:45]]

Блок `location` позволяет гибко настраивать поведение сервера в зависимости от URL-пути. Например, при обращении к `/fruits` можно отдавать контент из специфической папки. 

Ла Харб объясняет разницу между `root` и `alias`:

*   **Root** добавляет путь из `location` к основному пути на диске. Если запрошено `/fruits`, NGINX будет искать папку `.../mysite/fruits` [25:12].
*   **Alias** полностью подменяет путь. Это полезно, если вы хотите, чтобы по ссылке `/carbs` отдавался контент из папки `fruits` без её переименования [27:34].

### Директива try_files и регулярные выражения
Если в папке нет файла `index.html` (например, он называется `veggies.html`), используется директива `try_files` [29:57]. Она позволяет перечислить последовательность файлов, которые сервер должен попытаться найти, прежде чем выдать ошибку 404. Также `location` поддерживает регулярные выражения (символ `~*`), что позволяет создавать сложные правила, например, перенаправлять все запросы вида `/count/[0-9]` на главную страницу [32:39].

## 🔄 Редиректы и Rewrite (перезапись адресов)
[[JUMP:33:44]]

Ведущий демонстрирует два способа перенаправить пользователя:

1.  **Redirect (307 Temporary Redirect):** Информирует браузер, что страница временно находится по другому адресу. При запросе `/crops` пользователь видит в адресной строке изменение на `/fruits` [35:18].
2.  **Rewrite:** Происходит на стороне сервера. Пользователь запрашивает `/number/3`, в строке браузера адрес остается прежним, но NGINX «за кулисами» заменяет этот запрос на другой (например, `/count/3`) и отдает соответствующий контент [37:12].

## ⚖️ Настройка Load Balancer с помощью Docker
[[JUMP:37:39]]

В финальной и наиболее продвинутой части курса Ла Харб показывает, как превратить NGINX в балансировщик нагрузки [37:52]. Для имитации реальной среды используются Docker-контейнеры. 

Ведущий создает простое Express-приложение на Node.js и запускает четыре идентичных контейнера на разных портах (1111, 2222, 3333, 4444) [47:34].

Для настройки балансировки используется блок `upstream`:

*   Создается контекст `upstream backend_server`, где перечисляются адреса всех четырех запущенных инстансов [49:05].
*   В основном блоке `server` через директиву `proxy_pass http://backend_server;` NGINX перенаправляет входящий трафик на эти сервера [49:44].

По умолчанию NGINX использует алгоритм **Round Robin**, распределяя запросы по очереди: первый запрос — на первый сервер, второй — на второй и так далее [50:09]. Это позволяет масштабировать приложение горизонтально, просто добавляя новые серверы в список `upstream`.