Что такое Nginx и как он работает как веб-сервер
Основы3 минРедакция Innovialabs
Коротко
Nginx — быстрый веб-сервер с событийной архитектурой, который отдаёт статические файлы и работает как обратный прокси, балансировщик нагрузки и кэш перед вашим приложением.
Коротко о Nginx
Nginx (произносится «энджин-икс») — программа, которая принимает HTTP-запросы от браузеров и отвечает на них. Она может сама отдать файл с диска или передать запрос вашему приложению на Node.js, Python, PHP, Go и получить ответ.
Nginx популярен по трём причинам: он быстрый, экономно расходует память при большом числе соединений и гибко настраивается одним текстовым конфигом.
Событийная архитектура
Классические серверы часто выделяли отдельный процесс или поток на каждое соединение. Тысяча медленных клиентов — тысяча потоков, каждый со своей памятью.
Nginx устроен иначе:
- Есть master-процесс: читает конфиг, запускает и перезапускает рабочие процессы.
- Есть несколько worker-процессов, обычно по числу ядер CPU.
- Каждый worker обслуживает тысячи соединений одновременно в цикле событий. Он не ждёт, пока клиент медленно скачает ответ, а переключается на другие готовые соединения.
Поэтому Nginx хорошо держит много одновременных подключений, в том числе медленных мобильных клиентов, без резкого роста потребления памяти.
Роли Nginx
Веб-сервер для статики
Отдаёт HTML, CSS, JavaScript, картинки и шрифты прямо с диска. Это его самая сильная сторона.
Обратный прокси (reverse proxy)
Стоит перед приложением и пересылает ему запросы. Попутно Nginx может:
- завершать HTTPS (TLS-терминация), чтобы приложение работало по простому HTTP;
- сжимать ответы (gzip);
- ограничивать частоту запросов и размер тела;
- скрывать внутреннюю структуру инфраструктуры.
Балансировщик нагрузки
Распределяет запросы между несколькими копиями приложения. Поддерживает разные методы: по кругу (round robin), по наименьшему числу соединений, по IP клиента.
Кэш
Сохраняет ответы приложения и отдаёт их повторно без обращения к бэкенду. Это снижает нагрузку на приложение и ускоряет ответы.
Структура базового nginx.conf
Конфиг состоит из директив и блоков (контекстов). Пример минимальной конфигурации сайта с проксированием API:
worker_processes auto;
events {
worker_connections 1024;
}
http {
include mime.types;
sendfile on;
gzip on;
upstream app {
server 127.0.0.1:3000;
server 127.0.0.1:3001;
}
server {
listen 80;
server_name example.com;
root /var/www/site;
location / {
try_files $uri $uri/ /index.html;
}
location /api/ {
proxy_pass http://app;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
}
Что здесь важно:
events— настройки обработки соединений.http— всё, что касается HTTP: типы файлов, сжатие, сайты.upstream— группа бэкендов для балансировки.server— виртуальный хост: какой домен и порт он обслуживает.location— правила для конкретных путей URL.
В реальных системах сайты обычно выносят в отдельные файлы в conf.d/ или sites-enabled/ и подключают через include.
Полезные команды
sudo nginx -t # проверить конфиг на ошибки
sudo systemctl reload nginx # применить изменения без разрыва соединений
sudo tail -f /var/log/nginx/error.log
Частые ошибки
- Перезапускать Nginx (
restart) вместоreloadи не проверять конфиг черезnginx -t. - Забывать передавать заголовки
HostиX-Real-IP— приложение видит неверный домен и IP. - Путать поведение
proxy_passсо слешем в конце адреса и без него. - Оставлять открытыми служебные пути и листинг директорий.