我們有一個應用程式在 Payara 應用程式伺服器上運行了一年多,該應用程式運行非常穩定,沒有任何問題。 有一天,用戶報告說,他們在訪問應用程式的登入頁面時遇到了 HTTP 錯誤 431,問題只是突然發生的。 最大機會是將使用者重導向到 Okta SSO 伺服器時,便會發生這種情況。我們將在這篇文章中解釋解決問題的過程。

HTTP 錯誤 431 有哪些常見的原因?
HTTP錯誤431,也被稱為「請求標頭字段過大」,通常是由於客戶端發送的請求標頭字段超過了伺服器的配置或默認限制所引起的。一些常見的HTTP錯誤431的原因包括:
- 過大的Cookie:如果客戶端在請求標頭中包含一個過大的Cookie,就可能觸發HTTP 431錯誤。Cookie通常用於存儲會話信息或用戶偏好,如果它們包含大量數據,就可能超過伺服器的標頭大小限制。
- URL或查詢參數過長:如果請求的URL或附加的查詢參數過長,就可能導致HTTP 431錯誤。伺服器對URL或查詢參數的最大長度施加限制,以防止濫用或資源耗盡。
- 過多的標頭:如果客戶端在請求中包含大量的標頭字段,就可能導致標頭的總大小超過伺服器的限制。這可能發生在客戶端在請求中包含大量自定義標頭、代理相關標頭或其他標頭字段的情況下。
- 代理服務器或負載均衡器限制:在某些情況下,HTTP 431錯誤可能是由中間代理服務器或負載均衡器引起的,它們對標頭大小施加自己的限制。這些中間實體可能與源伺服器有不同的配置設置,導致拒絕大型請求標頭。
- 伺服器配置錯誤:伺服器可能被配置為對請求標頭大小設置過於嚴格的限制。在這種情況下,即使請求的標頭相對較小,也可能觸發HTTP 431錯誤。這可能發生在伺服器管理員對標頭大小限制設置非常低的值,或者伺服器配置中存在意外錯誤的情況下。
解決HTTP錯誤431的過程
以下是解決HTTP錯誤431的過程摘要:
- 確定根本原因
- 調整伺服器配置
- 重新啟動Payara應用伺服器
- 驗證修復
確定根本原因是解決HTTP錯誤431過程中最重要且最困難的一步。了解HTTP錯誤431的潛在根本原因對於有效解決問題至關重要。通過確定根本原因,我們可以實施必要的更改或修復措施,以防止將來再次出現錯誤。
並不存在一種通用的方法來確定所有問題的根本原因。不同的問題需要不同的方法來確定其潛在原因。並不存在適用於所有可能出現的問題的通用解決方案。並非所有問題都有現成的解決方案可供使用。在某些情況下,您可能是第一個遭遇特定問題的人,需要依靠自己的解決問題的能力來找到解決方案。根據我們的經驗,我們依賴以下三個價值觀來解決各種技術問題:
- 證據(或錯誤訊息)
- 在遇到技術問題時,可用的證據,例如錯誤訊息或其他相關資訊,是一個寶貴的資源。錯誤訊息通常提供了對出錯原因的洞察,並能指導您確定根本原因。通過仔細分析手頭的證據,您可以更好地理解問題並努力尋找解決方案。
- 過去的經驗
- 回顧過去的經驗在面對技術問題時是一項寶貴的資產。思考過去遇到的類似問題以及解決這些問題時所採取的方法,您可以利用先前的知識並應用於當前的問題。過去的經驗提供了一個理解的基礎,可以指導您找到潛在的解決方案或疑難排解步驟。
- 耐心
- 解決問題通常需要耐心,特別是在處理複雜的技術問題時。徹底調查和分析問題可能需要時間。急著趕過程可能會忽略關鍵細節或實施無效的解決方案。耐心讓您以冷靜且專注的心態來處理問題,使您能夠系統地探索不同的可能性,從而得出更準確和有效的解決方案。
實際問題解決過程
花了一些時間才找到HTTP錯誤431的根本原因。我們的系統支援同事僅以重新啟動Payara應用伺服器作為短期解決方案。但這並沒有真正解決問題。這個問題每天早上都會發生,我們需要每天重新啟動Payara應用伺服器一次。
我們還嘗試了清除客戶端瀏覽器緩存作為另一個解決方案,但仍無法解決HTTP錯誤431。因此,問題不太可能與瀏覽器Cookie有關。
然後,我們檢查了網頁訪問日誌,以找出在發生HTTP錯誤431時正在訪問的網頁。這裡是一個在網頁訪問日誌中尋找431錯誤代碼的命令行示例:
$ grep 431 server_access_log
然而,在網頁訪問日誌中我們找不到431錯誤。事實上,所有的網頁都沒有被訪問過。也就是說,客戶端的請求從未到達軟體應用程式。因此,我們可以確定問題很可能不是由軟體應用程式引起的。
剩下的可能根本原因要麼是Okta,要麼是Payara應用伺服器。我們找到了一份Okta的文件,討論了HTTP錯誤431。然而,它沒有提供幫助。此外,Okta是一個第三方SSO服務,我們無法控制。我們只能專注於Payara應用伺服器。顯然,在Payara中更改HTTP標頭緩衝區長度的值是最可能的解決方案,這是我們在網絡上找到的流行解決方案。
自從Payara應用伺服器的初始安裝以來,我們一直使用預設的標頭緩衝區長度值 (Header Buffer Length),即8192或8KB。您可以通過Payara管理面板找到標頭緩衝區長度,如下所示:

我們將標頭緩衝區長度更改為16KB,但HTTP錯誤431仍然發生。然後,我們將其更改為32KB。不幸的是,問題仍然存在。這是我們能夠使用的最後手段。這也意味著我們可能遇到了其他人未曾遇到的問題。
在這種情況下,我們只能依靠耐心找出根本原因並尋找解決方案。有時候,我們不得不使用一些愚蠢的方法。我們所做的就是實時手動監控網頁訪問日誌。我們只是使用tail命令:
$ tail -f server_access_log
愚蠢的方法實際上並不愚蠢!在監控了半天後,令人驚訝地發現,在HTTP錯誤431發生後,一些客戶端請求仍然能夠到達應用程式並被網頁訪問日誌記錄下來,所有這些請求都使用了HTTP/1.1協議。通過現代網頁瀏覽器進行的正常請求,一般都使用了HTTP/2協議,很有可能只有在使用HTTP/2協議時才可能發生HTTP錯誤431。
為了證明這一發現,我們在另一台機器上執行了以下命令:

我們重複執行了上述命令多次,並得到了相同的結果。因此,只有在使用HTTP/2協議時才會發生HTTP錯誤431。
基於上述發現,我們可以專注於Payara應用伺服器中HTTP/2的配置參數。我們只需將HTTP/2 Max Header List Size的值從4KB(預設值)更改為32KB,HTTP錯誤431神奇地消失了。

需要注意的是,解決問題是一個動態的過程,而適應性是關鍵。不同的情況可能需要超出我們的想像,而在解決問題的方法中具有靈活性是必不可少的。


Comments are closed.