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

Ответ

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 является одним из фундаментальных компонентов современной веб-инфраструктуры.

Ответ 18+ 🔞

Давай я тебе на пальцах объясню, что за зверь такой — Nginx, а то в документации всё заумно написано, глаза сломаешь. Представь себе супер-швейцара в самом навороченном клубе. Его задача — не пускать всякий шлак, грамотно всех расфасовать и следить, чтобы внутри не началась давка. Вот этот швейцар — и есть Nginx, ёпта.

Короче, на что он годен в нашем, деплойском, деле:

  1. Раздавать статику. Картинки, скрипты, стили — для него это как семечки щёлкать. Жрёт оперативки дохуя меньше, чем его древний собрат Apache, а отдаёт всё моментально. Просто потому что архитектура у него — хитрая жопа, событийная, а не на потоках.
  2. Быть обратным прокси. Это его главный конёк. Весь интернет-трафик прилетает сначала к нему, а он уже решает, какому из твоих кривых бэкенд-сервисов (на Python, Go, Java — да похуй) этот запрос скормить. Он ещё и SSL-сертификаты сам разгрупповать может, чтобы твоему приложению не париться с шифрованием.
  3. Балансировать нагрузку. У тебя три сервера с приложением висят? Nginx раскидает запросы между ними так, чтобы ни один не сдох от перегруза. Можно даже алгоритм выбрать — кому меньше всех сейчас досталось, тому и дать следующего клиента. Умно, блядь.
  4. Кешировать ответы. Вот это вообще магия. Если бэкенд один и тот же ответ десять раз выдаёт, Nginx может его запомнить и следующие девять раз отдать сам, не дергая твой медленный сервис. Скорость вырастает — овердохуища, сам от себя офигеваешь.

Смотри, как это примерно в конфиге выглядит. Не бзди, тут всё логично:

http {
    # Вот это — наша группа рабов, прости, бэкенд-серверов.
    upstream django_backend {
        least_conn; # Отправляем запрос тому, у кого меньше всего народу на шее.
        server 10.0.1.10:8000; # Первый экземпляр
        server 10.0.1.11:8000; # Второй экземпляр
        server 10.0.1.12:8000 backup; # Этот — запасной, на случай если первые два накрылись медным тазом.
    }

    server {
        listen 80;
        server_name api.example.com; # Сюда стучатся

        location / {
            # И вот тут наш швейцар говорит: "Ага, вам в зал 'django_backend', проходите!"
            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;

            # И ставит таймер: "Если за 5 секунд не соединишься с баром — иди нахуй. Если бар 60 секунд тебе коктейль готовит — тоже свободен."
            proxy_connect_timeout 5s;
            proxy_read_timeout 60s;
        }

        # А статические файлы (типа логотипа клуба) он вообще сам отдаёт, не пуская внутрь. Быстро и без очереди.
        location /static/ {
            alias /opt/myapp/static/;
            expires 1y;
            add_header Cache-Control "public, immutable";
        }
    }
}

В общем, если ты собираешь что-то серьёзное, без этого чувака — нихуя не получится. Он — фундамент, на котором всё держится. Без него твоя инфраструктура — просто распиздяйство и бардак.