您正在查看 Apigee Edge 說明文件。
查看 Apigee X 說明文件。 資訊
問題
用戶端應用程式會取得 414 Request-URI Too Long
的 HTTP 狀態碼,以及錯誤代碼 protocol.http.TooBigLine
做為 API 呼叫的回應。
錯誤訊息
用戶端應用程式會取得以下回應代碼:
HTTP/1.1 414 Request-URI Too Long
此外,您可能會遇到以下錯誤訊息:
{ "fault":{ "faultstring":"request line size exceeding 7,168", "detail":{ "errorcode":"protocol.http.TooBigLine" } } }
請注意,上述錯誤訊息中的 faultstring
包含 Apigee Edge 中要求行允許的限制,即 7168 bytes
(7 KB)。
可能原因
如果用戶端應用程式做為 HTTP 要求的一部分而傳送至 Apigee Edge 的要求行大小大於 Apigee Edge 中允許的限制,就會發生這個錯誤。
在查看這個錯誤的可能原因之前,讓我們先瞭解要求行代表的意義,以及如何查看其大小。
瞭解要求行
一般 HTTP 要求由三個部分組成:
- 申請要求
- ( 一組 HTTP 標頭)
- [ 內文 ]
要求行包含三個部分,如下所示。
Request-Line = <Method> <Request-URI> <HTTP-Version>
當用戶端應用程式對伺服器發出 HTTP 要求時,前往伺服器的第一行會包含上述要求行數。後面接著標頭和要求主體/酬載。
以下範例螢幕截圖顯示一般 curl
要求、Request 部分 (以及 Request-Line) 和回應部分。
瞭解請求行大小
- 在上述範例中,要求中的「start」行 (第一行) 也稱為「要求行」,如下所示:
GET /test/ HTTP/1.1
要求行的大小為
~19 bytes
,因為其中包含19 ASCII characters
。由於這個值未超過 Apigee Edge 的允許上限,因此在處理要求時不會出現任何錯誤,而且您會收到成功的回應。 - 同樣地,如果您查看上述
錯誤訊息中的
faultstring
,則包含"request line size exceeding 7,168"
。這表示用戶端所發出的 HTTP 要求中的 Request-Line 超過 7,168 個位元組。
這項錯誤的可能原因如下:
原因 | 說明 | 適用的疑難排解指示 |
---|---|---|
要求酬載大小大於允許的限制 | 在向 Apigee Edge 發出的 HTTP 要求中,用戶端應用程式傳送的要求 URI 大小大於 Apigee Edge 中允許的限制。 | Edge Public and Private Cloud 使用者 |
常見診斷步驟
請使用下列其中一種工具/技巧診斷這項錯誤:
API Monitoring
如何使用 API Monitoring 診斷錯誤:
- 以 適當角色的使用者 登入 Apigee Edge UI。
切換至您想要調查問題的機構。
- 前往「分析」>「API 監控」>「調查」頁面。
- 請選取你發現錯誤的特定時間範圍。
- 將「Fault Code」與「Time」進行比較。
- 選取含有錯誤代碼
protocol.http.TooBigLine
和狀態碼414
的儲存格,如下所示:( 查看較大圖片)。
畫面會顯示錯誤代碼
protocol.http.TooBigline
的相關資訊,如下所示:( 查看較大圖片)。
按一下「查看記錄」,然後展開失敗要求的資料列:
( 查看較大圖片)。
在「記錄檔」視窗中,記下下列詳細資料:
- 狀態碼:
414
- Fault 資料來源:
apigee
- 「Fault Code」:
protocol.http.TooBigLine
。 - 要求長度(位元組):
7244 (> 7KB)
- 狀態碼:
- 如果「Fault Source」的值為
apigee
或MP
,則「Fault Code」的值為protocol.http.TooBigLine
,而「Request-Length」的值超過 7 KB,代表用戶端發出的 HTTP 要求 URI 大於 Apigee 允許的限制。
追蹤工具
NGINX
如何使用 NGINX 存取記錄檔診斷錯誤:
- 如果您是 Private Cloud 使用者,即可使用 NGINX 存取記錄檔來判斷 HTTP
414
錯誤的相關重要資訊。 查看 NGINX 存取記錄檔:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
其中:將 ORG、ENV 和 PORT# 替換為實際值。
- 搜尋特定時間範圍內是否有任何
414
錯誤 (如果問題過去發生),或是否有任何要求仍失敗並顯示414
。 如果在 X-Apigee-fault-code 與 X-Apigee-fault-code 的值相符的情況下發現任何
414
錯誤,請判斷 X-Apigee-fault-code 的值。以上 NGINX 存取記錄中的範例項目,有下列「X-Apigee-fault-code」X-Apigee-fault-code 和「X-Apigee-fault-source」X-Apigee-fault-code 的值:
回應標頭 值 X-Apigee-fault-code protocol.http.TooBigLine
X-Apigee-fault-source policy
請注意要求長度:
7244
(7.244KB > 允許的限制)
原因:要求酬載大小大於允許的限制
診斷
- 透過 API 監控、追蹤記錄工具或 NGINX 存取記錄,找出錯誤的「Fault Code」、「Fault Source」和「Request-Length size」,如常見診斷步驟所述。
- 如果「Fault Source」的值為
apigee
或MP
,表示用戶端應用程式傳送至 Apigee 的要求大小大於 Apigee Edge 中的限制。 - 您可以使用下列其中一種方法,確認要求行大小超過 7 KB 的允許上限:
錯誤訊息
如何使用錯誤訊息進行驗證:
如果您可以存取從 Apigee Edge 收到的完整錯誤訊息,請參閱
faultstring
。faultstring
表示要求行大小超過系統允許的上限 (7 KB)。錯誤訊息示例:
"faultstring":"request line size exceeding 7,168"
實際要求
如何使用實際要求進行驗證:
如果您可以存取用戶端應用程式傳送的實際要求,請執行下列步驟:
- 驗證要求中傳遞的 URI 大小。
如果您發現 URI 大小超過 Apigee Edge 中的限制,就是問題原因。
要求示例:
curl http://<hostalias>/testtoobigline?_qparam=000000000000000000……..000000<trimmed> -k -X POST
在上述範例中,查詢參數
qparam
的值大於 7 KB,也就是超過 7,000 個 ASCII 字元。如果您使用其他用戶端,可以查看用戶端記錄檔,並嘗試找出傳送至 Apigee Edge 的要求行大小。
訊息處理器記錄
如何使用訊息處理器記錄進行驗證:
如果您是 Private Cloud 使用者,可使用訊息處理器記錄檔來驗證要求行大小是否超過 Apigee Edge 的允許限制。
查看訊息處理器記錄:
/opt/apigee/var/log/edge-message-processor/logs/system.log
- 搜尋特定時間範圍內是否有
414
錯誤 (如果問題在過去一次),或是否有任何要求仍因414
失敗。您可以使用下列搜尋字串。grep -ri "exceeding"
grep -ri "RequestURITooLong"
- 您會看到
system.log
中的幾行程式碼,類似下列內容:2021-07-12 08:53:31,461 NIOThread@0 ERROR ADAPTORS.HTTP.FLOW - AbstractRequestListener.onException() : Request:null, uri:null, message Id:null, exception:com.apigee.errors.http.user.RequestURITooLong{ code = protocol.http.TooBigLine, message = request line size exceeding 7,168, associated contexts = []}, context:Context@366f4217 input=ClientInputChannel(SSLClientChannel[Accepted: Remote:192.168.195.90:8443 Local:192.168.67.23:34256]@301912 useCount=1 bytesRead=0 bytesWritten=45849 age=2254670ms lastIO=0ms isOpen=true)
上方錯誤訊息中的文字
message = request line size exceeding 7,168
代表要求 URI 大小超過 7 KB。因此,Apigee Edge 會擲回例外狀況com.apigee.errors.http.user.RequestURITooLong
,並將含有錯誤代碼protocol.http.TooBigline
的414
狀態碼傳回用戶端應用程式。
解析度
固定大小
選項 #1 [建議]:修正用戶端應用程式不會傳送要求 URI 大小超過允許的上限
- 分析特定用戶端傳送要求 URI 大小超過「限制」中允許限制的原因。
如果需要,請修改用戶端應用程式,讓用戶端應用程式傳送的要求 URI 大小小於允許的上限。
在上述範例中,您可以將 long 查詢參數做為要求主體/酬載的一部分傳遞來解決這個問題,而不是將其做為要求網址的一部分傳送,如下所示:
curl https://<host>/testtoobigline -k -X GET -d '{_qparam=000000000000000000<trimmed>}' -v
- 如果不需要,且您想要傳送的 URI 超出允許的限制,請參閱下一個選項。
CwC
選項 #2:使用 CwC 屬性增加要求行數量上限
Apigee 提供 CwC 屬性,可讓您提高要求行大小限制。詳情請參閱 設定訊息處理器上的要求行限制
限制
Apigee 預期用戶端應用程式和後端伺服器不會傳送大小超出 Apigee 邊緣限制中「要求/回應行限制」限制的 Request/Response-Lines。
- 如果您是公開雲端使用者,則要求和回應行大小上限請參閱 Apigee Edge 限制中的 Request/Response-Line 大小上限。
- 如果您是私有雲使用者 ,您可能已修改要求和回應行大小的預設上限 (即便這不是建議做法)。如要決定要求行大小上限,請按照如何查看目前限制中的指示操作。
如何查看目前的限制?
本節說明如何確認訊息處理器中的 HTTPRequest.line.limit
屬性已更新為新值。
- 在訊息處理器機器中,在
/opt/apigee/edge-message-processor/conf
目錄中搜尋HTTPRequest.line.limit
屬性,並查看以下設定值:grep -ri "HTTPRequest.line.limit" /opt/apigee/edge-message-processor/conf
- 上述指令的結果範例如下:
/opt/apigee/edge-message-processor/conf/http.properties:HTTPRequest.line.limit=7k
請注意,在上述輸出範例中,請注意
HTTPRequest.line.limit
屬性在http.properties
中已設為具有7k
值。這表示在適用於私有雲的 Apigee 中設定的要求行大小限制為 7 KB。
如果您仍需獲得 Apigee 支援團隊的協助,請參閱「必須收集診斷資訊」一文。
必須收集診斷資訊
收集下列診斷資訊,然後與 Apigee Edge 支援團隊聯絡:
如果您是公開雲端使用者,請提供下列資訊:
- 機構組織名稱
- 環境名稱
- API Proxy 名稱
- 完成用來重現
414
錯誤的curl
指令 - API 要求的追蹤檔
如果您是 Private Cloud 使用者,請提供下列資訊:
- 觀察失敗要求的完整錯誤訊息
- 機構組織名稱
- 環境名稱
- API Proxy 套裝組合
- 失敗 API 要求的追蹤檔
- 完成用來重現
414
錯誤的curl
指令 NGINX 存取記錄檔
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
其中:系統會將 ORG、ENV 和 PORT# 替換為實際值。
- 訊息處理器系統記錄
/opt/apigee/var/log/edge-message-processor/logs/system.log