# nginx

> Высокопроизводительный веб-сервер и обратный прокси с событийной архитектурой, созданный Игорем Сысоевым; один из самых распространённых веб-серверов в мире.

Источник: https://llmdocs.ru/wiki/nginx/ · обновлено 2026-11-09 · лицензия CC BY-SA 4.0

- **Тип**: веб-сервер, обратный прокси, балансировщик, почтовый и TCP/UDP-прокси
- **Автор**: Игорь Сысоев
- **Первый публичный выпуск**: октябрь 2004
- **Язык**: C
- **Лицензия**: BSD-2-Clause
- **Архитектура**: событийная, асинхронная, несколько рабочих процессов
- **Владелец торговой марки**: F5 (с 2019, ранее Nginx, Inc.)
- **Форки**: freenginx (2024), Angie (2022)
**nginx** (произносится «энджин-икс», от *engine x*) — веб-сервер и [обратный прокси](https://llmdocs.ru/wiki/reverse-proxy.md) с открытым исходным кодом. Его отличает **событийная архитектура**: небольшое число рабочих процессов обслуживает десятки тысяч одновременных соединений, расходуя мало памяти. nginx отдаёт статические файлы, завершает [TLS](https://llmdocs.ru/wiki/tls.md), проксирует запросы к приложениям, балансирует нагрузку, кэширует ответы и проксирует TCP и UDP.

nginx — один из самых распространённых веб-серверов в мире; он работает на огромной доле самых посещаемых сайтов, а его производные используются как Ingress-контроллеры [Kubernetes](https://llmdocs.ru/wiki/kubernetes.md) и основа многих CDN.

## История

Игорь Сысоев, системный администратор компании «Рамблер», начал писать nginx в 2002 году, чтобы решить **проблему C10K** — обслуживание десяти тысяч одновременных соединений на одном сервере, с которой плохо справлялся Apache с моделью «процесс или поток на соединение».[5] Первый публичный выпуск состоялся в октябре 2004 года под лицензией BSD.

В 2011 году Сысоев с соратниками основал компанию Nginx, Inc., выпустившую коммерческую версию NGINX Plus; в 2019 году её купила американская F5 Networks. В 2022 году Сысоев покинул проект. Часть бывших разработчиков создала совместимый форк **Angie**, а в 2024 году один из ключевых разработчиков, Максим Дунин, запустил некоммерческий форк **freenginx**.[6]

## Архитектура

Главный процесс читает конфигурацию и управляет **рабочими процессами** — обычно по одному на ядро процессора. Каждый рабочий процесс в цикле событий (epoll в Linux, kqueue в BSD) неблокирующе обрабатывает тысячи соединений: пока один клиент медленно получает данные, процесс обслуживает остальных. Это та же идея, что у [asyncio](https://llmdocs.ru/wiki/asyncio.md) и Node.js (см. [Конкурентность и параллелизм](https://llmdocs.ru/wiki/concurrency-parallelism.md)). Конфигурацию можно перечитать без разрыва соединений: `nginx -s reload` запускает новые рабочие процессы, а старые дорабатывают текущие запросы.

## Конфигурация

Конфигурация — иерархия блоков: `http` содержит блоки `server` (виртуальные хосты), а те — блоки `location` для путей.[2]

```nginx
# /etc/nginx/conf.d/example.conf
server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://example.com$request_uri;        # всё на HTTPS
}

server {
    listen 443 ssl;
    http2 on;
    server_name example.com;

    ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    root /var/www/example;
    index index.html;

    gzip on;
    gzip_types text/css application/javascript application/json;

    location / {
        try_files $uri $uri/ =404;                      # статический сайт
    }

    location /api/ {
        proxy_pass http://127.0.0.1:8000;               # приложение
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}
```

Выбор блока `server` идёт по порту, затем по имени из заголовка `Host` или [SNI](https://llmdocs.ru/wiki/sni.md), а `location` — по правилам: точное совпадение `=`, затем самый длинный префикс, затем регулярные выражения по порядку.[4]

```bash
sudo nginx -t                 # проверить синтаксис конфигурации
sudo systemctl reload nginx   # применить без простоя
sudo tail -f /var/log/nginx/error.log
```

## Основные возможности

- **Статика** — отдача файлов с помощью `sendfile`, кэширующие заголовки, сжатие.
- **Проксирование** — HTTP, [WebSocket](https://llmdocs.ru/wiki/websocket.md), gRPC, FastCGI (PHP), uwsgi.
- **Балансировка** — группы `upstream` с алгоритмами round robin, `least_conn`, `ip_hash`, `hash` и пассивной проверкой здоровья.[3]
- **Кэш ответов** бэкенда на диске (`proxy_cache`).
- **Ограничения** — частоты запросов (`limit_req`), числа соединений, размера тела запроса.
- **TCP/UDP-прокси** (модуль `stream`) — для баз данных, DNS и маршрутизации TLS по SNI без расшифровки.
- **HTTP/2 и HTTP/3** — HTTP/3 поверх [QUIC](https://llmdocs.ru/wiki/quic.md) поддерживается с версии 1.25 (2023).

Сертификаты [Let's Encrypt](https://llmdocs.ru/wiki/lets-encrypt-acme.md) обычно выпускает и продлевает Certbot, умеющий сам править конфигурацию nginx.

## Типичные ошибки

- `proxy_pass http://app/` с косой чертой в конце и без неё ведут себя по-разному: с косой чертой префикс `location` вырезается из пути.
- Директива `if` внутри `location` работает неочевидно («if is evil»); для перенаправлений лучше `return` и `try_files`.
- Забытый `client_max_body_size` — загрузка файлов больше 1 МБ падает с кодом 413.
- Без `proxy_set_header Host` бэкенд получает имя upstream вместо домена сайта.
- Ошибки 502 и 504 обычно означают проблемы бэкенда, а не nginx: смотрите `error.log` и логи приложения ([journald и логи](https://llmdocs.ru/wiki/journald-logs.md)).

## nginx и альтернативы

[Caddy](https://llmdocs.ru/wiki/caddy.md) проще в настройке и сам получает сертификаты; HAProxy специализируется на балансировке; Traefik и Envoy рассчитаны на динамические окружения с контейнерами. Apache HTTP Server остаётся популярным благодаря `.htaccess` и модулям. nginx же сочетает зрелость, производительность и огромное количество готовых примеров конфигурации; полная справка по директивам — в официальной документации.[1]

## См. также

- [Обратный прокси (reverse proxy)](https://llmdocs.ru/wiki/reverse-proxy.md)
- [Caddy](https://llmdocs.ru/wiki/caddy.md)
- [TLS](https://llmdocs.ru/wiki/tls.md)
- [Let's Encrypt и ACME](https://llmdocs.ru/wiki/lets-encrypt-acme.md)
- [HTTP](https://llmdocs.ru/wiki/http.md)

## Источники

1. [nginx — документация](https://nginx.org/en/docs/)
2. [nginx — Beginner's Guide](https://nginx.org/en/docs/beginners_guide.html)
3. [nginx — ngx_http_upstream_module](https://nginx.org/en/docs/http/ngx_http_upstream_module.html)
4. [nginx — How nginx processes a request](https://nginx.org/en/docs/http/request_processing.html)
5. [Dan Kegel — The C10K problem](http://www.kegel.com/c10k.html)
6. [freenginx](https://freenginx.org/)
