Урок 02

Архитектура 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:

  1. Принимает соединение
  2. Читает HTTP-запрос
  3. Определяет, какой server-блок отвечает
  4. Применяет location-правила
  5. Отдаёт файл / проксирует / редиректит
  6. Отправляет ответ

Конфиг 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.