Назад | Перейти на главную страницу

Обратный прокси nginx с заголовком аутентификации

Я пытаюсь настроить nginx для работы в качестве обратного прокси-сервера для двух приложений: веб-интерфейса (IIS) и серверной части .NET Core (Kestrel), все они работают в рое докеров. Я переписываю все вызовы / api на бэкэнд и все остальные вызовы во фронтенд.

В моих текущих настройках все работает нормально, пока я не войду в приложение. При этом используется служба проверки подлинности OAuth / OpenID IdentityServer, в результате чего к запросу для всех вызовов с токеном-носителем добавляется заголовок авторизации. Как только этот заголовок присутствует, сервер nginx возвращает таймауты от вышестоящих серверов. Это происходит на обоих серверах, и если я отключу передачу заголовка auth, nginx будет работать нормально и проксировать запрос. Для внешнего интерфейса это не проблема, поскольку он не требует заголовка, но, очевидно, серверная часть больше не работает. Странно то, что если я в какой-то момент обрежу заголовок (это довольно длинная строка), запрос будет работать, но, очевидно, моя внутренняя служба вернет 500, потому что это больше не действительный токен.

Я почесал в затылке, пытаясь понять, что не так, и пробовал любое количество вариантов конфигурации. Очень похоже, что запрос остановлен на nginx, поскольку ни один из серверов за прокси-сервером даже не получает запрос, когда он терпит неудачу. Ведение журнала на уровне nginx не дает ничего, кроме `` тайм-аута восходящего потока (110: тайм-аут операции) при чтении заголовка ответа из восходящего потока '' - ошибки и даже увеличение этого тайм-аута ничего не делает, что имеет смысл как тот же самый запрос без авторизации заголовок действительно работает.

Проблема, по-видимому, связана с тем, что мы запускаем гибридный рой с узлами Windows и Linux. Там есть ошибка, связанная с сетевыми драйверами с которым, как ни странно, мало кто сталкивается. Когда запрос становится слишком большим, он не маршрутизируется должным образом внутри сети докеров. Это заставляет nginx отправлять запрос и ждать ответа, который никогда не придет, поскольку запрос никогда не доходит до вышестоящего сервера ...