Nginx

Материал из Энциклопедия интернет-маркетинга MarketWiki

Nginx (произносится как «энжин-икс») - высокопроизводительный веб-сервер, обратный прокси-сервер, почтовый прокси-сервер, а также система для балансировки нагрузки и кэширования контента. Nginx разработан Игорем Сысоевым и впервые выпущен в 2004 году. Архитектура Nginx ориентирована на обработку большого количества одновременных соединений с минимальными затратами ресурсов.

В интернет-маркетинге и SEO Nginx используется для обеспечения высокой скорости загрузки сайтов, обработки пиковых нагрузок, настройки редиректов и управления логами сервера.

История

[править]

Nginx был создан Игорем Сысоевым для решения проблемы C10k - одновременной обработки 10 тысяч соединений, с которой не справлялись существующие веб-серверы. Первая публичная версия вышла в 2004 году.

В 2019 году компания Nginx Inc. была приобретена F5 Networks. Несмотря на это, разработка продолжается, и Nginx остаётся одним из самых популярных веб-серверов в мире, используясь на миллионах сайтов, включая крупнейшие проекты.

Архитектура

[править]

Nginx построен на событийно-ориентированной архитектуре, которая принципиально отличается от процессно-ориентированной архитектуры Apache.

Асинхронная обработка

[править]

В отличие от Apache, который создаёт отдельный поток или процесс для каждого соединения, Nginx использует 1 процесс для обработки множества соединений одновременно. Это позволяет обслуживать тысячи параллельных запросов при минимальном потреблении памяти.

Nginx имеет модульную архитектуру. Большинство функций реализовано через модули, которые можно подключать при компиляции. Основные модули:

  • Модули обработки HTTP.
  • Модули почтового прокси.
  • Модули балансировки нагрузки.
  • Модули кэширования.

Процессы

[править]

Nginx работает с несколькими типами процессов:

  • Master process - главный процесс, читает конфигурацию и управляет рабочими процессами.
  • Worker processes - рабочие процессы, которые непосредственно обрабатывают запросы.
  • Cache processes - процессы для управления кэшем.

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

[править]

Nginx предоставляет широкий спектр возможностей для веб-разработки.

Веб-сервер

[править]

Nginx может обслуживать статические файлы (HTML, CSS, JavaScript, изображения) с очень высокой скоростью. Для динамических страниц он передаёт запросы на обработку внешним сервисам (PHP-FPM, uWSGI, Node.js).

Обратный прокси (Reverse Proxy)

[править]

Nginx может принимать запросы от клиентов и перенаправлять их на внутренние серверы. Это позволяет:

  • Распределять нагрузку между несколькими серверами.
  • Скрывать внутреннюю структуру сети.
  • Обеспечивать дополнительный уровень безопасности.
  • Объединять несколько приложений под одним доменом.

Балансировка нагрузки

[править]

Nginx умеет распределять входящие запросы между несколькими серверами, используя различные алгоритмы:

  • round-robin - последовательное распределение.
  • least_conn - отправка на сервер с наименьшим количеством соединений.
  • ip_hash - привязка клиента к определённому серверу по IP-адресу.
  • weight - распределение с учётом веса серверов.

Кэширование

[править]

Nginx может кэшировать ответы от внутренних серверов и отдавать закэшированные копии без обращения к бэкенду, что значительно снижает нагрузку и ускоряет ответ.

Терминация SSL/TLS

[править]

Nginx эффективно обрабатывает SSL/TLS-шифрование, принимая HTTPS-соединения и передавая их на внутренние серверы по HTTP.

Обработка статики

[править]

Благодаря асинхронной архитектуре, Nginx исключительно быстро отдаёт статические файлы, что делает его идеальным выбором для использования в паре с более медленными серверами приложений.

Настройка Nginx

[править]

Конфигурация Nginx обычно хранится в файлах внутри директории `/etc/nginx/`.

Основные файлы конфигурации

[править]
  • nginx.conf - главный конфигурационный файл.
  • sites-available/ - директория с конфигурациями отдельных сайтов.
  • sites-enabled/ - символические ссылки на включённые сайты.
  • conf.d/ - дополнительные конфигурационные файлы.

Пример простой конфигурации

[править]
server {
    listen 80;
    server_name example.com www.example.com;
    root /var/www/example.com;

    location / {
        index index.html;
    }

    location /api {
        proxy_pass http://localhost:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

Настройка HTTPS

[править]
server {
    listen 443 ssl;
    server_name example.com;

    ssl_certificate /path/to/certificate.crt;
    ssl_certificate_key /path/to/private.key;
    ssl_protocols TLSv1.2 TLSv1.3;

    root /var/www/example.com;
}

Редиректы

[править]
# Редирект с www на без www
server {
    listen 80;
    server_name www.example.com;
    return 301 http://example.com$request_uri;
}

# Редирект с HTTP на HTTPS
server {
    listen 80;
    server_name example.com;
    return 301 https://example.com$request_uri;
}

Nginx vs Apache

[править]

Основные различия между двумя самыми популярными веб-серверами.

Параметр Nginx Apache
Архитектура Событийно-ориентированная, асинхронная Процессно-ориентированная
Обработка соединений Много соединений в одном процессе 1 процесс/поток на соединение
Потребление памяти Низкое Выше при большом количестве соединений
Обработка статики Очень высокая скорость Средняя скорость
Динамический контент Передаёт внешним процессорам (PHP-FPM) Может обрабатывать встроенными модулями
.htaccess Не поддерживает Поддерживает
Гибкость настройки Настройки на уровне сервера Можно менять для каждой директории

Nginx в продакшене

[править]

Для высоконагруженных проектов Nginx часто используется в качестве фронтенд-сервера, который принимает все входящие запросы и распределяет их между несколькими бэкенд-серверами с приложениями.

Типовая схема

[править]
  • Nginx принимает запросы (порт 80/443).
  • Отдаёт статические файлы самостоятельно.
  • Запросы к динамическим страницам передаёт на сервер приложений (PHP-FPM, Node.js, Gunicorn).
  • При необходимости кэширует ответы.
  • Балансирует нагрузку между несколькими серверами приложений.

Связанные термины

[править]