Как настроить Nginx в качестве обратного прокси для веб-приложения

Ответ

Nginx часто используется как обратный прокси (reverse proxy). Он принимает клиентские запросы и перенаправляет их на один или несколько бэкенд-серверов (например, на Python-приложение, работающее через Gunicorn или uWSGI). Это позволяет скрыть внутреннюю архитектуру, распределять нагрузку и обрабатывать SSL.

Пример базовой конфигурации для проксирования запросов на приложение, работающее на localhost:8000:

server {
    # Nginx будет слушать 80 порт
    listen 80;
    # Доменное имя, на которое будет отзываться сервер
    server_name example.com;

    location / {
        # Перенаправляем все запросы на внутренний сервер
        proxy_pass http://127.0.0.1:8000;

        # Передаем важные заголовки, чтобы приложение знало
        # реальный хост и IP-адрес клиента
        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;
    }
}

Ключевые задачи обратного прокси:

  • Балансировка нагрузки: Распределение запросов между несколькими экземплярами приложения.
  • SSL/TLS Termination: Обработка HTTPS-запросов, снимая эту нагрузку с бэкенд-серверов.
  • Кэширование: Сохранение статических ответов для ускорения отдачи контента.
  • Безопасность: Фильтрация вредоносных запросов и сокрытие IP-адресов внутренних серверов.

Ответ 18+ 🔞

А, Nginx, ёпта, классика жанра! Этот чувак у нас работает как обратный прокси, то есть типа такой главный приёмщик-разводящий. Сидит себе на порту, улыбается, клиентов встречает, а потом — хрясь! — и перекидывает всю их ебучую работу куда подальше, на задворки, на какие-нибудь бэкенды, которые на Python под Gunicorn'ом копошатся. Красота! Сервера спрятаны, нагрузка распределена, SSL он сам отгрызёт — красавчик, блядь.

Смотри, как это примерно выглядит в конфиге, если твоё приложение дрыхнет на localhost:8000:

server {
    # Слушаем 80-й, как все приличные люди
    listen 80;
    # А отзываемся на этот самый домен
    server_name example.com;

    location / {
        # И вот тут магия: всё, что пришло, — на тебе, получай на бэкенд!
        proxy_pass http://127.0.0.1:8000;

        # А это чтобы бэкенд не обделался и понял, кто и откуда к нему пришёл
        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;
    }
}

И что же этот красавец умеет, кроме как запросы пересылать?

  • Балансировку нагрузки, ёбушки-воробушки! Как швейцар в дорогом борделе: видит, что один сервер уже заёбан, а другой прохлаждается — и нового клиента сразу ко второму. Честно, без очередей.
  • SSL/TLS Termination — это когда он весь этот криптографический пиздец с сертификатами и рукопожатиями берёт на себя, а к бэкенду уже чистое, понятное HTTP приходит. Бэкенд аж плачет от счастья, нагрузка-то с него снята.
  • Кэширование — ну тут вообще песня. Если контент статичный, он его припрячет и в следующий раз отдаст мгновенно, даже бубенцов не тронет. Скорость — овердохуища!
  • Безопасность — он как верный пёс: лишних не пустит, подозрительные запросы отфильтрует, да и адреса внутренних серваков спрячет, чтобы всякие пидарасы шерстяные не налетели. В общем, доверия ебать ноль, но к нему — есть.