Если вы читаете эту статью, значит, вы уже познакомились с Nginx, установили его и даже успели полюбоваться его приветственной страницей. Отличное начало! Но чтобы стать настоящим мастером Nginx, важно понять, как он работает изнутри. Сегодня мы разберем архитектуру Nginx и познакомимся с его модулями. Это как открыть капот мощной машины: сначала немного страшно, но потом приходит осознание – всё не так уж сложно.
Архитектура Nginx: почему он такой быстрый?
Главное, что отличает Nginx от других веб-серверов, – это его event-driven архитектура (событийно-ориентированная). Что это значит?
Сравнение с традиционной моделью Apache
Многие старые серверы, например Apache, работают по простой схеме: на каждый входящий запрос создаётся новый процесс или поток. Это хорошо, пока запросов немного. Но если их тысячи, сервер начинает тормозить. Он просто задыхается, пытаясь обслужить всех.
Event-driven подход Nginx
Nginx работает по-другому. Вместо того чтобы запускать кучу процессов, он использует один главный процесс (master) и несколько рабочих процессов (worker). Каждый worker может обрабатывать тысячи запросов одновременно, используя механизм событий.
Когда приходит запрос, worker не ждёт, пока, например, завершится загрузка файла. Он сразу переключается на обработку следующего события. Это похоже на официанта в ресторане, который берёт заказы у нескольких столиков, не тратя время на ожидание приготовления блюд.
Master и Worker процессы
Вот как это выглядит:
- Master процесс: главный руководитель. Он запускает и контролирует worker-процессы.
- Worker процессы: «рабочие лошадки», которые обрабатывают запросы пользователей.
Такой подход делает Nginx не только быстрым, но и очень экономным с точки зрения памяти и ресурсов.
Основные модули Nginx
Теперь перейдём к самому интересному. Вся мощь Nginx скрыта в его модулях. Это как плагины для браузера: хотите больше функций – просто подключаете нужный модуль.
HTTP-модуль
Этот модуль отвечает за работу с HTTP-запросами, то есть то, ради чего Nginx и создавался.
Что умеет:
- Обслуживать статические файлы (HTML, CSS, JS).
- Работать с прокси-запросами (reverse proxy).
- Настраивать редиректы, кэширование и многое другое.
server {
listen 80;
server_name example.com;
location / {
root /var/www/html;
index index.html;
}
}
Stream-модуль
Этот модуль используется для обработки трафика, который не относится к HTTP. Например, для TCP/UDP соединений. Он отлично подходит для настройки прокси-сервера для базы данных или VPN.
stream {
server {
listen 3306;
proxy_pass 192.168.1.100:3306;
}
}
Mail-модуль
Да, Nginx может даже проксировать почтовый трафик! Если у вас есть почтовый сервер (SMTP, IMAP или POP3), этот модуль поможет настроить безопасное соединение.
mail {
server_name mail.example.com;
auth_http localhost:9000/auth;
server {
listen 587;
protocol smtp;
proxy on;
}
}
Модули для сжатия и кэширования
- gzip: сжимает данные перед отправкой, чтобы страница загружалась быстрее.
- proxy_cache: кэширует ответы от бэкенда, чтобы ускорить повторные запросы.
gzip on;
gzip_types text/plain text/css application/json application/javascript;
gzip_min_length 1000;
Модули безопасности
- ngx_http_access_module: позволяет ограничить доступ по IP.
- ngx_http_auth_basic_module: добавляет базовую HTTP-аутентификацию.
location /admin {
deny all; # Запретить доступ всем
allow 192.168.1.0/24; # Разрешить только локальной сети
}
Как модули взаимодействуют между собой?
Nginx использует модульный подход: каждый модуль выполняет свою задачу, но вместе они создают мощную систему. Например:
- HTTP-модуль принимает запрос.
- Модуль gzip сжимает ответ.
- Модуль proxy передаёт запрос на бэкенд.
Каждый модуль отвечает только за свою часть работы, и это делает конфигурацию гибкой и простой в понимании.
Логирование: смотрим, что происходит
Чтобы понять, как работает Nginx, важно уметь читать его логи. Они хранятся в /var/log/nginx/ на Linux.
- access.log: здесь записываются все запросы, которые обрабатывает сервер.
- error.log: сюда попадают ошибки (например, если файл не найден).
192.168.1.1 - - [22/Nov/2024:12:00:00 +0000] "GET /index.html HTTP/1.1" 200 1234
Задание для самостоятельной практики
- Откройте файл /etc/nginx/nginx.conf и посмотрите, какие модули уже подключены.
- Попробуйте включить gzip для своего сайта, чтобы страницы загружались быстрее.
- Настройте прокси для другого сервера, например, если у вас есть локальный бэкенд (Node.js или FastAPI).
Теперь вы знаете, как устроен Nginx и какие модули делают его таким мощным. В следующей статье мы поговорим о том, как настроить Nginx для работы со статическими сайтами. Вы научитесь обслуживать HTML, CSS и JavaScript так, чтобы всё летало.