嘗試用 IIS ARR 當 Reverse Proxy 重導 PRTG 服務管理網頁,發現僅 HTML 可正常讀取,網頁所需的 png 及 css 發生 ERR_CONNECTION_RESET 錯誤。

ARR 的狀態有點尷尬,2013 年更新 3.0 後幾乎就沒再更新了,網路查到的資料很多還停在 Windows Server 2008 ,官方相關文件已過時,其中許多參考資料或下載連結失效,IIS 擴充套件下載服務 - Web Platform Installer (WebPI) 也在去年底下線(參考),雖然確定 ARR 在 Windows 2022 IIS 仍可正確安裝及運行,但差不多已被放生(術語是 Out-of-Bound IIS Module),ARR 3.0 可支援 IIS 10 (Windows 2016 ~ 2022 都是 IIS 10) 到其 EOS 支援週期結束為止,但支援程度就別抱過高期望,文件少資訊難找是一定的。這個發展倒也不難理解,ASP.NET Core 主流應用方式會更傾向 Docker 或雲端,IIS 的重要性已不若以往,未來應會跟 WebForm 一樣,在時代洪流裡逐漸淡出。

找到一篇「IIS ARR 已死?」討論,微軟人員的回答蠻符合我的認知:

ARR 被視為 Legacy Product (說白話就是「古蹟」啦),還未被官方正式宣告棄用,但你懂的... 若要評估 Reverse Proxy 替代方案,可考慮 HAProxy (Linux Only)、NGNIX (Linux & Windows,但 Docker 更方便)。

不過,由於 IIS 是現成的,靠 ARR 加上 Reverse Proxy 功能,比另外架設 Linux/Docker 或在 Windows 加裝 NGINX 簡便多了,最終我選擇面對問題,乖乖射茶包。

總之,經過一番爬文、調查及測試,我找到兩種解法:

停用 ARR Cache

啟用 FREB(Failed Request Event Buffering) Log,發現問題出現在 Flush Response 階段:

找到一篇 ARR3 + NUXT3 也出現 ERR_CONNECTION_RESET 的案例,有相同的 The parameter is incorrect (0x80070057) 錯誤訊息,解法是加上規則停用 Cache。

不管哪種解法,最好要先找到 ARR Cache 圖示,找不到的同學可先參考 電腦管理開 IIS 管理員會找不到 ARR Cache 設定

加一條快取控制規則(Cache Controle Rule),一律不快取。

停用快取後,問題消失。

取消 Response Buffer

另一篇文章看到有人提到 ARR 的 Reponse Buffer 行為會導致 SignalR 出錯,而 FREB Log 的錯誤出現在 GENERAL_FLUSH_RESPONSE_END,判斷二者可能相關。嘗試將 Response buffer threshold (KB) 設為 0,也能避免問題。

UI 背後其實是在 applicationHost.config 寫入設定,故也可使用以下 CLI 指令搞定 %windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/proxy /minResponseBuffer:"0" /commit:apphost

【參考資料】

Case of ARR caused png/css request connection reset, this article provide two workaround.


Comments

Be the first to post a comment

Post a comment