Nginx
帶有身份驗證標頭的 nginx 反向代理
我正在嘗試將 nginx 配置為作為兩個應用程序的反向代理執行:Web 前端 (IIS) 和 .NET Core 後端 (Kestrel),它們都在 docker swarm 中執行。我正在將所有對 /api 的呼叫重寫到後端以及對前端的所有其他呼叫。
在我目前的設置中,一切正常,直到我登錄到應用程序。這使用了 IdentityServer OAuth/OpenID 身份驗證服務,導致將 Authorization-header 添加到帶有承載令牌的所有呼叫的請求中。一旦出現此標頭,nginx 伺服器就會從上游伺服器返回超時。這發生在兩台伺服器上,如果我禁用 auth 標頭的傳遞,nginx 可以正常工作並代理請求。對於前端這不是問題,因為它不需要標頭,但後端顯然不再起作用。奇怪的是,如果我在某個時候切斷了標頭(它是一個相當長的字元串),請求就可以工作,但顯然我的後端服務返回 500,因為它不再是有效的令牌。
我一直在撓頭試圖找出問題所在,並且嘗試了許多配置選項。看起來請求在 nginx 處停止了,因為代理後面的伺服器在失敗時甚至都沒有收到請求。在 nginx 級別記錄結果只是“上游超時(110:操作超時),同時從上游讀取響應標頭” - 錯誤甚至增加超時沒有做任何事情,這對於沒有授權的完全相同的請求是有意義的標題確實有效。
問題顯然是由於我們正在執行一個帶有 windows 和 linux 節點的混合集群。有一個與網路驅動程序相關的錯誤,奇怪的是,似乎很少有人遇到。當請求變得太大時,請求無法在 docker 網路內正確路由。這會導致 nginx 發出請求並等待永遠不會出現的回复,因為請求永遠不會到達上游伺服器……