Nginx: как работает и для чего нужен этот веб-сервер
Nginx («Энджинкс», «Энджин-икс») — мультиплатформенный производительный веб-сервер на открытом коде. Он эффективен при работе с большим количеством одновременных соединений и статическим контентом, подходит для высоконагруженных приложений. Может использоваться как реверс-прокси и балансировщик нагрузки. Рассказываем, как с ним работать.

Как работает Nginx
Nginx может одновременно обрабатывать множество пользовательских запросов. Сервер передает запрос в отдельный процесс, но не ждет, пока он завершится, а переходит к следующему запросу. Такой подход возможен благодаря событийной модели в основе работы сервера. Nginx не создает отдельный процесс или поток под каждый запрос; вместо этого несколько worker‑процессов обрабатывают множество соединений в рамках событийного цикла.
У Nginx асинхронная архитектура, выстроенная по модульному принципу. Сервер — словно конструктор, который легко адаптировать под свой проект. Он поддерживает модули для работы с разными функциями и протоколами, поэтому становится универсальным решением для разработчиков.
Поддержка конкретных протоколов зависит от версии и наличия соответствующих модулей (например, HTTP/2 — начиная с 1.9.5 при сборке с ngx_http_v2_module).

Схема работы NginxСценарии применения Nginx
Nginx может выступать классическим веб-сервером, реверс-прокси и балансировщиком нагрузки. Опишем каждый сценарий.
Веб-сервер
В этом сценарии Nginx обрабатывает HTTP-запросы от клиента и в ответ отправляет запрашиваемые файлы. Отличие от других веб-серверов в том, что Nginx одновременно может обрабатывать большое количество запросов. Это позволяет быстрее давать ответ клиенту и оптимизировать использование ресурсов.
Реверс-прокси
В этом сценарии Nginx выступает посредником, который принимает клиентские запросы и перенаправляет на другие серверы. Такая схема используется для обеспечения безопасности и балансировки нагрузки. Реверс-прокси позволяет скрыть IP-адреса внутренних серверов, что затрудняет прямые атаки. Распределение трафика предотвращает перегрузку серверов.
Балансировка нагрузки
В этом сценарии Nginx распределяет трафик между другими серверами, используя один из алгоритмов:
Round Robin — Nginx по очереди направляет запросы на каждый доступный сервер.
Least Connections — Nginx направляет трафик тому серверу, где меньше активных подключений.
IP Hash — Nginx закрепляет клиента за конкретным сервером.
Нash (Generic Hash) — запрос распределяется на основе хеша от пользовательского ключа (например, IP-адреса, комбинации IP и порта, URI). Обеспечивает постоянную привязку одного и того же ключа к одному серверу.
Такой сценарий применения Nginx оптимален для сервисов с высокой посещаемостью, облачных платформ и систем, для которых критичны простои.
Сравнение Nginx и Apache
Apache — веб-сервер на открытом коде, который был самым популярным в России до появления Nginx. Он хорошо себя показывает в обработке динамического контента. Главное отличие от Nginx в том, что этот веб-сервер создает отдельные процессы под каждый пользовательский запрос. Другие отличия — в таблице.
Параметр | Nginx | Apache |
Тип веб-сервера | Асинхронный событийно-ориентированный сервер | Процессно-ориентированный или многопоточный сервер |
Архитектура | Событийная, асинхронная архитектура с моделью master–worker | Многопроцессная или многопоточная архитектура |
Производительность | Высокая производительность для обработки большого количества одновременных соединений | Может уступать Nginx в производительности при большом количестве одновременных соединений |
Обработка статического контента | Эффективен для обслуживания статического контента | Меньше оптимизирован для обслуживания статического контента, чем Nginx, обрабатывает его дольше |
Обработка динамического контента | Использует внешние процессоры | Обрабатывает динамический контент напрямую через собственные модули |
Поддержка многозадачности | Асинхронная модель с одним или несколькими процессами и потоками | Многопроцессная модель с отдельными процессами или потоками для каждого запроса |
Память | Экономит память за счет асинхронной модели | Меньше экономит память из-за многопроцессной модели |
Конфигурация | Конфигурационные файлы проще и более структурированы, используется один файл конфигурации | Конфигурация более сложная, требует множества файлов и директив |
Модульность | Базово Nginx использовал статически собираемые модули, но в современных версиях также поддерживает динамические модули, подключаемые через load_module при запуске. Горячая загрузка/выгрузка без перезапуска по прежнему не поддерживается | Высокая степень модульности, модули можно добавлять/удалять без перезапуска сервера |
Использование ресурсов | Оптимизация для многозадачности и одновременных соединений | Использует больше ресурсов на единицу обработки запросов |
Поддержка прокси-сервера | Прекрасно подходит для работы в качестве обратного прокси-сервера и балансировщика нагрузки | Может работать в качестве прокси-сервера, но имеет меньшую производительность по сравнению с Nginx |
SSL/TLS | Высокая производительность при обработке HTTPS | Производительность ниже при обработке HTTPS с множеством одновременных соединений |
Поддержка виртуальных хостов | Поддерживает виртуальные хосты с использованием блоков серверов в конфигурации (в Nginx виртуальные хосты реализуются через server blocks, настраиваемые по сочетанию listen и server_name) | Поддерживает виртуальные хосты, но конфигурация может быть сложнее |
Обработка ошибок | Лучше обрабатывает ошибки, избегая создания новых процессов для каждого запроса | Может создавать новые процессы или потоки для каждого запроса, что снижает эффективность при большом числе запросов |
Поддержка HTTP/2 | Поддерживает HTTP/2 (начиная с 1.9.5 при сборке с ngx_http_v2_module и при использовании TLS с ALPN, обычно listen 443 ssl http2;) | Поддерживает HTTP/2, но производительность может снижаться |
Поддержка WebSocket | Nginx без дополнительных модулей умеет проксировать WebSocket соединения при правильной конфигурации proxy директив | Apache может работать с WebSocket, но часто требует дополнительной настройки и модулей |
Скорость запуска | Быстрый запуск и перезапуск | Может требовать больше времени на запуск и перезапуск |
Технологии кеширования | Nginx имеет развитые встроенные механизмы кеширования (особенно для проксируемых запросов) | Apache поддерживает кеширование через модули, но производительность и удобство конфигурирования часто хуже на больших нагрузках |
Балансировка нагрузки | Поддержка балансировки нагрузки и работы с несколькими бэкендами | Поддерживает балансировку нагрузки через модули, но менее эффективен по сравнению с Nginx |
Совместимость с операционными системами | Поддерживает операционные системы Linux, Windows, macOS | Поддерживает операционные системы Linux, Windows, macOS |
Совместимость с PHP | Требует использования внешнего обработчика (например, PHP-FPM) | Может работать напрямую с PHP через модуль mod_php |
Логирование | Логирование запросов и ошибок происходит по стандарту, с возможностью настройки | Гибкая настройка логирования с большим количеством параметров |
Преимущества есть и у Nginx, и у Apache, поэтому можно не выбирать между решениями, а совместить их. В таком симбиозе Nginx используется для проксирования и работы со статическим контентом, Apache — для обработки динамического контента.
Преимущества Nginx
Три сильные стороны продукта:
Эффективная работа с множеством одновременных подключений. Nginx стабильно обрабатывает запросы, не теряя производительности при высоких нагрузках.
Возможность гибкой настройки под разные задачи. Nginx имеет инструменты для балансировки нагрузки, проксирования, кеширования.
Обработка больших объемов статического контента. Nginx надежно и быстро доставляет такие файлы, как HTML, CSS, JS, изображения.
При корректной конфигурации Nginx демонстрирует высокую стабильность и производительность на высоконагруженных проектах, особенно при обслуживании статического контента и большом числе одновременных соединений.
Установка и настройка Nginx
Nginx подойдет для основных дистрибутивов Linux, macOS.
Nginx под macOS через Homebrew обычно применяют как локальный веб‑сервер для разработки, в production чаще используется Linux.
Для Windows версия Nginx считается beta: не поддерживает UDP/QUIC, использует ограниченные механизмы обработки соединений, фактически работает один worker‑процесс, поэтому для production‑нагрузок рекомендованы Linux‑платформы.
Подготовка и установка Nginx
Операционная система | Процесс |
Linux (Ubuntu/Debian) | 1. Обновите систему: sudo apt update 2. Установите Nginx: sudo apt install nginx 3. Запустите сервис: sudo systemctl start nginx 4. Добавьте в автозагрузку: sudo systemctl enable nginx 5. Откройте браузер и перейдите по адресу: http://localhost |
Linux (CentOS/RHEL) | 1. Обновите систему: sudo yum update 2. Установите репозиторий EPEL: sudo yum install epel-release 3. Установите Nginx: sudo yum install nginx 4. Запустите сервис: sudo systemctl start nginx 5. Добавьте в автозагрузку: sudo systemctl enable nginx 6. Перейдите по адресу: http://localhost |
macOS | 1. Установите Homebrew, если он не установлен (инструкция на сайте: https://brew.sh) 2. Установите Nginx с помощью Homebrew: brew install nginx 3. Запустите Nginx: sudo nginx 4. Откройте через браузер http://localhost:8080 |
Windows | 1. Скачайте последнюю версию Nginx для Windows с официального сайта: https://nginx.org/en/download.html 2. Распакуйте архив в выбранную папку 3. Перейдите в папку с Nginx и запустите nginx.exe 4. Откройте браузер и перейдите по адресу: http://localhost |
Настройка Nginx
Подробно рассмотрим алгоритм для Linux-систем. Можно воспользоваться утилитой UFW (Uncomplicated Firewall). Установите ее, откройте порты:
22 для удаленного доступа по SSH;
80 для клиент-серверной связи по протоколу HTTP;
443 для клиент-серверной связи по протоколу HTTPS.
Представьте утилите доступ к веб-серверу:

Проверьте список доступных приложений:

Убедитесь, что среди приложений есть Nginx:

Внесите разрешения на все порты, которые вы открыли:

Проверьте статус портов:

Ответ будет выглядеть примерно так:

Проверьте, работает ли сервер:

Проверьте работоспособность сервера:
Ответ должен выглядеть так: Active: active (running) since….
Проверьте доступность по HTTP, открыв страницу сервера в браузере. Должно выйти такое окно:

Конфигурация Nginx
Чтобы управлять сервером, нужно знать, какие есть каталоги и где они находятся. Вот основные:
/var/www/html — стартовая страница по умолчанию в типовых пакетах для Ubuntu/Debian;
/etc/nginx — директория, где содержатся основные файлы настроек;
/etc/nginx/nginx.conf — основной конфигурационный файл;
/etc/nginx/sites-enabled — директория с конфигурациями активных сайтов;
/etc/nginx/snippets — фрагменты конфигурации для подключения к основной конфигурации сервера;
/var/log/nginx — папка, где хранятся логи событий.
Также во многих Debian/Ubuntu‑дистрибутивах используют каталоги sites-available и sites-enabled для организации виртуальных хостов; в других системах структура может отличаться.

Настройка конфигурационных файлов
Ключевые параметры конфигурации:
Параметр | Описание | Пример |
user | Определяет пользователя и группу, от имени которых будет работать Nginx | user www-data |
worker_processes | Определяет количество рабочих процессов Nginx | worker_processes auto |
error_log | Путь к файлу, в который будут записываться ошибки работы Nginx | error_log /var/log/nginx/error.log |
pid | Путь к файлу, где хранится идентификатор процесса Nginx | pid /var/run/nginx.pid |
server_name | Определяет доменные имена или IP-адреса, для которых настроен сервер | server_name example.com www.example.com |
listen | Определяет порт и IP-адрес, на которых Nginx будет слушать входящие запросы | listen 80 или listen 443 ssl |
location | Определяет обработку запросов для конкретных путей | location /images/ { root /var/www/html; } |
root | Указывает корневую директорию для хранения веб-контента | root /var/www/html |
index | Указывает файл, который будет открыт по умолчанию, например, index.html | index index.html index.htm |
ssl_certificate | Путь к SSL-сертификату для защищенных соединений (HTTPS) | ssl_certificate /etc/ssl/certs/example.com.crt |
ssl_certificate_key | Путь к приватному ключу для SSL-сертификата | ssl_certificate_key /etc/ssl/private/example.com.key |
ssl_protocols | Указывает поддерживаемые версии SSL/TLS | ssl_protocols TLSv1.2 TLSv1.3; |
proxy_pass | Указывает сервер для проксирования запросов | proxy_pass http://backend_server; |
proxy_cache_path | Настройка кеширования для проксированных запросов | proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=cache_zone:10m max_size=1g |
allow / deny | Ограничивает доступ по IP-адресам | allow 192.168.1.0/24; deny all |
access_log | Указывает путь к файлу для логирования запросов | access_log /var/log/nginx/access.log |
limit_req_zone | Устанавливает зону для ограничения частоты запросов | limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=1r/s |
limit_req | Позволяет ограничивать частоту запросов и снижать эффект простых flood атак; для защиты от масштабных распределенных DDoS обычно используют специализированные решения (например, облачные Anti DDoS сервисы) | limit_req zone=req_limit_per_ip burst=5 |
Для дополнительной защиты веб-приложений от DDoS-атак можно использовать Anti-DDoS Curator от Cloud.ru.
Заключение
Nginx играет важную роль в веб-разработке. Он позволяет сохранять производительность и распределять нагрузку на серверы, потребляя минимум ресурсов. Благодаря этому Nginx стал неотъемлемой частью глобальной веб-инфраструктуры.
