Архитектура Nginx
Master и worker процессы
Nginx работает как master + worker'ы:
master process (1 штука)
├── worker process 1
├── worker process 2
├── worker process 3
└── worker process 4
Master — управляет. Читает конфиг, следит за worker'ами, реагирует на сигналы.
Worker'ы — обслуживают запросы. Каждый worker — один процесс, обрабатывающий тысячи соединений одновременно через event loop (неблокирующий I/O).
Сколько worker'ов
По умолчанию — по числу CPU-ядер:
worker_processes auto;
Правило: worker_processes = количество ядер.
Проверь сколько ядер:
nproc
# 4
4 ядра → 4 worker'а.
Соединения на worker
worker_connections 1024;
Максимум соединений = worker_processes × worker_connections.
4 ядра × 1024 = 4096 соединений одновременно.
Для веба этого хватает с запасом.
Event-driven модель
Как Apache (thread per connection):
- Каждое соединение = отдельный поток
- 1000 соединений = 1000 потоков = много RAM
Как Nginx (event loop):
- Один worker обслуживает много соединений по очереди
- 1000 соединений = 1 поток, много раз быстрее и экономнее
Это причина, почему Nginx держит нагрузку лучше Apache.
Как обрабатывается запрос
Клиент → master → worker → обработка → ответ
Что делает worker:
- Принимает соединение
- Читает HTTP-запрос
- Определяет, какой server-блок отвечает
- Применяет location-правила
- Отдаёт файл / проксирует / редиректит
- Отправляет ответ
Конфиг nginx.conf
Основной файл — /etc/nginx/nginx.conf:
user www-data;
worker_processes auto;
pid /run/nginx.pid;
events {
worker_connections 1024;
multi_accept on;
}
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
gzip on;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
Разбор директив
user www-data; — от кого работают worker'ы. Критично для прав к файлам.
worker_processes auto; — по числу ядер.
multi_accept on; — worker принимает несколько соединений сразу.
sendfile on; — отдача файлов через ядро, быстрее.
tcp_nopush on; — отправляет HTTP-заголовки одним пакетом.
tcp_nodelay on; — без буферизации, для keepalive.
keepalive_timeout 65; — держать соединение 65 секунд.
types_hash_max_size 2048; — размер хеша MIME-типов.
gzip on; — сжатие. Дальше разберём глубже.
Проверка worker'ов
ps aux | grep nginx
Вывод:
root 1234 nginx: master process /usr/sbin/nginx
www-data 1235 nginx: worker process
www-data 1236 nginx: worker process
www-data 1237 nginx: worker process
www-data 1238 nginx: worker process
Логи
/var/log/nginx/access.log — все запросы
/var/log/nginx/error.log — ошибки
Смотреть:
tail -f /var/log/nginx/access.log
tail -f /var/log/nginx/error.log
Как перечитать конфиг
После изменений:
sudo nginx -t
sudo systemctl reload nginx
nginx -t обязателен. Если конфиг сломан — reload не применится, Nginx продолжит работать на старом.
Проверка нагрузки
# сколько соединений сейчас
ss -tn state established '( sport = :80 or sport = :443 )' | wc -l
# активные соединения через Nginx
curl -s http://127.0.0.1/nginx_status
Для второго — нужно включить stub_status:
location /nginx_status {
stub_status;
allow 127.0.0.1;
deny all;
}
Итог
Nginx быстрый, потому что event-driven и экономный. Для веба это идеальный вариант.
Дальше — конфигурация nginx.conf.