Как настроить Nginx в качестве reverse proxy?

Nginx как reverse proxy принимает внешний HTTP/HTTPS-трафик, завершает TLS, раздаёт статику и передаёт динамические запросы внутреннему приложению, например Gunicorn или Uvicorn. В конфигурации используют proxy_pass и передают backend-приложению исходные HTTP-заголовки.
Подробный ответ

Что такое reverse proxy

Reverse proxy располагается перед приложением. Клиент обращается к Nginx, а Nginx перенаправляет запрос внутреннему backend-серверу. Это позволяет централизованно настроить HTTPS, сжатие, лимиты, статические файлы, кэширование и балансировку нескольких backend-экземпляров.

Пример конфигурации

server {
    listen 80;
    server_name example.com;

    location /static/ {
        alias /srv/my-app/static/;
    }

    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;
    }
}

Зачем передавать заголовки

Заголовки Host, X-Real-IP, X-Forwarded-For и X-Forwarded-Proto позволяют приложению увидеть исходный домен, IP клиента и схему HTTPS. Без корректной настройки backend может считать, что все запросы пришли с локального адреса или по HTTP.

Проверка и применение конфигурации

sudo nginx -t
sudo systemctl reload nginx
sudo systemctl status nginx

Перед reload нужно всегда выполнять nginx -t: команда проверяет синтаксис конфигурации и помогает не применить ошибочные изменения.

HTTPS

В production Nginx обычно завершает TLS. Сертификат можно получать и обновлять через Certbot либо использовать сертификаты, которые предоставляет cloud load balancer или ingress controller.

server {
    listen 443 ssl;
    server_name example.com;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Proto https;
    }
}

Как ответить на собеседовании

Я использую Nginx как reverse proxy перед приложением: он принимает внешний HTTP/HTTPS-трафик, раздаёт статику и передаёт динамические запросы через proxy_pass в Gunicorn или Uvicorn. Обязательно передаю headers с исходным Host, IP и схемой, а перед применением конфигурации запускаю nginx -t.

Оцени свой прогресс

Честно оцени своё понимание этого вопроса, чтобы мы могли построить твой учебный трек максимально эффективно.
Читать в блоге