Что такое Nginx и как он применяется в DevOps?

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

Ответ

Nginx — это высокопроизводительный, асинхронный веб-сервер с событийной архитектурой, который в DevOps используется в трех основных ролях: веб-сервер, обратный прокси (reverse proxy) и балансировщик нагрузки (load balancer). Его эффективность при работе с большим количеством одновременных соединений делает его стандартом для высоконагруженных систем.

Типичные сценарии использования в DevOps:

  1. Обратный прокси и балансировщик нагрузки для микросервисов: Nginx принимает входящие запросы и распределяет их между несколькими экземплярами backend-приложения (например, Node.js, Go или Python-сервисов), работающими в контейнерах.

    upstream backend_servers {
        least_conn; # Алгоритм балансировки
        server backend1.example.com:8080;
        server backend2.example.com:8080;
        server backend3.example.com:8080;
    }
    
    server {
        listen 80;
        server_name api.myapp.com;
    
        location / {
            proxy_pass http://backend_servers;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }
  2. Раздача статического контента и SSL-терминация: Nginx эффективно отдает статические файлы (CSS, JS, изображения), разгружая application-серверы. Также он часто служит точкой для терминации SSL/TLS-соединений.

    server {
        listen 443 ssl http2;
        server_name www.example.com;
    
        ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    
        location /static/ {
            root /var/www/html;
            expires 30d; # Кэширование в браузере
        }
    
        location / {
            proxy_pass http://localhost:3000; # Прокси на Node.js приложение
        }
    }
  3. Кэширование ответов бекенда: Уменьшает нагрузку на приложение, кэшируя динамические ответы.

    proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g;
    
    server {
        location / {
            proxy_cache my_cache;
            proxy_cache_valid 200 302 10m;
            proxy_pass http://backend;
        }
    }
  4. Ingress Controller в Kubernetes: Ingress-Nginx — это самый популярный Ingress Controller для Kubernetes. Он использует Nginx под капотом для маршрутизации внешнего HTTP(S)-трафика в сервисы внутри кластера на основе правил, описанных в ресурсах Ingress.

Преимущества для DevOps:

  • Конфигурация как код: Конфиг-файлы легко версионировать в Git.
  • Легковесность и производительность: Малые накладные расходы на память и CPU.
  • Гибкость: Огромное количество директив для перезаписи URL, аутентификации, ограничения запросов (rate limiting).
  • Широкая распространенность: Стандарт де-факто, обширное комьюнити и документация.