Nginx proxy_pass: прокси для приложения

Категория: Nginx · Обновлено:

Директива proxy_pass передаёт запросы от Nginx приложению, которое слушает другой адрес или порт. Важно, что слэш в URI внутри proxy_pass меняет обработку пути: без него Nginx передаёт исходный URI, а с URI-частью заменяет совпавший префикс location.

Проксирование приложения на localhost:8000

Текст
server {
    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;
    }
}

Передавайте исходные host, IP клиента и схему только если backend ожидает эти заголовки и доверяет запросам от Nginx.

Чем отличается слэш в proxy_pass

Текст
location /api/ {
    proxy_pass http://127.0.0.1:8000;
}

location /service/ {
    proxy_pass http://127.0.0.1:8000/;
}

Запрос /api/users в первом случае приходит upstream как /api/users; запрос /service/users во втором — как /users.

WebSocket

Для WebSocket добавьте передачу upgrade-заголовков и задайте таймаут чтения для долгих соединений. Эти настройки нужны только endpoint'ам, которые действительно используют WebSocket.

Как проверить конфигурацию?

Выполните nginx -t, затем sudo systemctl reload nginx. После reload проверьте ответ приложения через публичный адрес и логи upstream.

Почему backend видит IP прокси?

Приложение должно корректно обрабатывать X-Forwarded-For и доверять этим заголовкам только от известного reverse proxy. Иначе заголовок можно подделать напрямую.