Что такое Nginx и для чего он используется?

«Что такое Nginx и для чего он используется?» — вопрос из категории DevOps, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Nginx — это высокопроизводительный веб-сервер с событийно-ориентированной (event-driven), асинхронной архитектурой. Он также широко используется как обратный прокси-сервер (reverse proxy), балансировщик нагрузки и кеширующий прокси.

Основные сценарии использования в DevOps/инфраструктуре:

  1. Веб-сервер для статического контента: Обработка HTML, CSS, JS, изображений с очень высокой скоростью и низким потреблением памяти.
  2. Обратный прокси для бэкенд-приложений: Nginx принимает HTTP-запросы от клиентов и перенаправляет их на один или несколько бэкенд-серверов (например, приложения на Go, Python, Java, PHP-FPM). Это позволяет:
    • Разгрузить бэкенд-сервисы от работы с медленными клиентами.
    • Выполнять SSL/TLS termination (расшифровку HTTPS).
    • Осуществлять базовую маршрутизацию и перезапись URL.
  3. Балансировщик нагрузки: Распределение входящего трафика между несколькими экземплярами приложения для повышения отказоустойчивости и производительности.
  4. Кеширование: Кеширование ответов от бэкенд-серверов для значительного ускорения отдачи контента повторяющимся запросам.

Пример конфигурации Nginx в качестве обратного прокси и балансировщика нагрузки для Python (Django/Gunicorn) приложения:

# Основной конфиг nginx.conf (фрагмент)
http {
    upstream django_backend {
        # Определяем группу бэкенд-серверов.
        # Используем least_conn для балансировки на основе наименьшего числа соединений.
        least_conn;
        server 10.0.1.10:8000; # Экземпляр приложения 1
        server 10.0.1.11:8000; # Экземпляр приложения 2
        server 10.0.1.12:8000 backup; # Резервный экземпляр
    }

    server {
        listen 80;
        server_name api.example.com;

        location / {
            # Проксируем все запросы в группу бэкендов
            proxy_pass http://django_backend;

            # Стандартные заголовки для корректной работы бэкенда
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;

            # Настройки таймаутов
            proxy_connect_timeout 5s;
            proxy_read_timeout 60s;
        }

        # Обслуживание статических файлов напрямую через Nginx (эффективнее)
        location /static/ {
            alias /opt/myapp/static/;
            expires 1y;
            add_header Cache-Control "public, immutable";
        }
    }
}

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