คุณกำลังดูเอกสารประกอบของ Apigee Edge
ไปที่
เอกสารประกอบของ Apigee X info
ลักษณะปัญหา
แอปพลิเคชันไคลเอ็นต์ได้รับรหัสสถานะ HTTP 502 Bad Gateway พร้อมรหัสข้อผิดพลาด
protocol.http.TooBigLine เป็นการตอบกลับสำหรับการเรียก API
ข้อความแสดงข้อผิดพลาด
แอปพลิเคชันไคลเอ็นต์ได้รับโค้ดตอบกลับต่อไปนี้
HTTP/1.1 502 Bad Gateway
นอกจากนี้ คุณอาจเห็นข้อความแสดงข้อผิดพลาดต่อไปนี้
{
"fault":{
"faultstring":"response line size exceeding 2,048",
"detail":{
"errorcode":"protocol.http.TooBigLine"
}
}
}สาเหตุที่เป็นไปได้
ข้อผิดพลาดนี้เกิดขึ้นหากขนาด Response-Line ที่เซิร์ฟเวอร์เป้าหมาย/แบ็กเอนด์ส่งไปยัง Apigee Edge เป็นส่วนหนึ่งของการตอบกลับ HTTP มีขนาดใหญ่กว่า ขีดจำกัดสูงสุดที่อนุญาตใน Apigee Edge
ก่อนที่จะดูสาเหตุที่เป็นไปได้ของข้อผิดพลาดนี้ เรามาทำความเข้าใจความหมายของ Response-Line และวิธีตรวจสอบขนาดกันก่อน
ทำความเข้าใจ Response-Line
การตอบกลับ HTTP โดยทั่วไปประกอบด้วย 3 ส่วน ได้แก่
- Status-Line (เรียกว่า Response-Line ใน Apigee)
- ( ชุดส่วนหัว HTTP )
- [ เนื้อความ ]
Response-Line ประกอบด้วย 3 ส่วน ได้แก่ เวอร์ชันโปรโตคอล ตามด้วยรหัสสถานะ ที่เป็นตัวเลข และวลีที่เป็นข้อความที่เกี่ยวข้อง ดังที่แสดงด้านล่าง
Response-Line = <HTTP-Version> <Status-Code> <Reason-Phrase>
เมื่อแอปพลิเคชันเซิร์ฟเวอร์เป้าหมาย/แบ็กเอนด์ส่งการตอบกลับ HTTP บรรทัดแรกที่
ส่งจะแสดงResponse-Lineตามที่อธิบายไว้ข้างต้น ตามด้วยส่วนหัวและเนื้อความ/เพย์โหลดของการตอบกลับ ภาพหน้าจอตัวอย่างต่อไปนี้แสดงคำขอ
curl ทั่วไป ส่วนคำขอ และส่วนการตอบกลับ (พร้อมด้วย
Response-Line)
ทำความเข้าใจขนาด Response-Line
ในตัวอย่างที่กล่าวถึงข้างต้น บรรทัด เริ่มต้น (บรรทัดแรก) ในการตอบกลับซึ่งเรียกอีกอย่างว่า Response-Line มีลักษณะดังนี้
HTTP/1.1 200 OK
Response-Line นี้มีขนาด
~15 bytesเนื่องจากมี15 ASCII charactersเนื่องจากขนาดนี้อยู่ใน ขีดจำกัดที่อนุญาตใน Apigee Edge การตอบกลับจึงถูกส่งกลับไปยังไคลเอ็นต์โดยไม่มี ข้อผิดพลาดจาก Apigee Edge- ในทำนองเดียวกัน หากคุณดู
faultstringใน ข้อความแสดงข้อผิดพลาด ที่แสดงข้างต้น จะมีข้อความ"response line size exceeding 2,048"ซึ่งบ่งชี้ว่า Response-Line ในการตอบกลับ HTTP ที่เซิร์ฟเวอร์เป้าหมาย/แบ็กเอนด์ส่งมีขนาดเกิน 2,048 ไบต์
ทำความเข้าใจ Response-Line ขนาดใหญ่
ตามคำจำกัดความของ Status-Line (เรียกว่า Response-Line ในที่นี้) และคำขอและการตอบกลับ HTTP ทั่วไป ขนาดจะเล็กกว่าขีดจำกัดเริ่มต้นที่กำหนดไว้ที่ 2 KB ใน Apigee Edge, ดังนั้นเราจึงอาจไม่ เกินขีดจำกัด อย่างไรก็ตาม นี่คือสถานการณ์ที่เป็นไปได้บางส่วนที่คุณอาจเกินขีดจำกัดนี้
- เซิร์ฟเวอร์เป้าหมาย/แบ็กเอนด์ไม่ใช่ระบบ HTTP จึงอาจตอบกลับด้วยการตอบกลับที่ไม่ใช่ HTTP ตอบกลับ
- เซิร์ฟเวอร์เป้าหมาย/แบ็กเอนด์มีปัญหาและส่ง Response-Line ที่ยาวเป็นส่วนหนึ่งของการตอบกลับ HTTP
อ่านเพิ่มเติมเกี่ยวกับเรื่องนี้ได้ที่ หัวข้อการได้รับข้อผิดพลาด protocol.http.TooBigLine, "response line size exceeding 2,048
สาเหตุที่เป็นไปได้ของข้อผิดพลาดมีดังนี้
| สาเหตุ | คำอธิบาย | วิธีการแก้ปัญหาที่ใช้ได้กับ |
|---|---|---|
| ขนาด Response-Line ใหญ่กว่าขีดจำกัดที่อนุญาต | ขนาด Response-Line ที่เซิร์ฟเวอร์เป้าหมาย/แบ็กเอนด์ส่งเป็นส่วนหนึ่งของการตอบกลับ HTTP ไปยัง Apigee Edge มีขนาดใหญ่กว่า ขีดจำกัดที่อนุญาตใน Apigee Edge | ผู้ใช้ Edge Public และ Private Cloud |
ขั้นตอนการวินิจฉัยทั่วไป
ใช้เครื่องมือ/เทคนิคใดเทคนิคหนึ่งต่อไปนี้เพื่อวินิจฉัยข้อผิดพลาดนี้
การตรวจสอบ API
วิธีวินิจฉัยข้อผิดพลาดโดยใช้การตรวจสอบ API
- ลงชื่อเข้าใช้ UI ของ Apigee Edge ในฐานะผู้ใช้ที่มี บทบาทที่เหมาะสม
เปลี่ยนไปใช้องค์กรที่คุณต้องการตรวจสอบปัญหา
- ไปที่หน้า วิเคราะห์ > การตรวจสอบ API > ตรวจสอบ
- เลือกกรอบเวลาที่เฉพาะเจาะจงที่คุณพบข้อผิดพลาด
- คุณอาจเลือกตัวกรองพร็อกซี เพื่อจำกัดรหัสข้อผิดพลาดให้แคบลง
- พล็อตรหัสข้อผิดพลาด เทียบกับเวลา
เลือกเซลล์ที่มีรหัสข้อผิดพลาด
protocol.http.TooBigLineดังที่ แสดงด้านล่าง
คุณจะเห็นข้อมูลเกี่ยวกับรหัสข้อผิดพลาด
protocol.http.TooBigLineดังที่แสดงด้านล่าง
คลิกดูบันทึก แล้วขยายแถวสำหรับคำขอที่ไม่สำเร็จ
- จากหน้าต่างบันทึก ให้จดรายละเอียดต่อไปนี้
- รหัสสถานะ:
502 - แหล่งที่มาของข้อผิดพลาด:
target - รหัสข้อผิดพลาด:
protocol.http.TooBigLine
- รหัสสถานะ:
- หากแหล่งที่มาของข้อผิดพลาด มีค่าเป็น
targetและรหัสข้อผิดพลาด มีค่าเป็นprotocol.http.TooBigLineแสดงว่าการตอบกลับ HTTP จากเซิร์ฟเวอร์เป้าหมาย/ แบ็กเอนด์มีขนาด Response-Line ใหญ่กว่าขีดจำกัดสูงสุดที่อนุญาตใน Apigee Edge
เครื่องมือติดตาม
- เปิดใช้เซสชันการติดตาม
และทำอย่างใดอย่างหนึ่งต่อไปนี้:
- รอให้ข้อผิดพลาด
502 Bad Gatewayเกิดขึ้น หรือ - หากทำซ้ำปัญหาได้ ให้เรียก API และทำซ้ำ
502 Bad Gatewayข้อผิดพลาด
- รอให้ข้อผิดพลาด
- เลือกคำขอที่ไม่สำเร็จรายการใดรายการหนึ่งแล้วตรวจสอบการติดตาม
- เลื่อนดูขั้นตอนต่างๆ ของการติดตามและค้นหาตำแหน่งที่เกิดข้อผิดพลาด
โดยปกติคุณจะพบข้อผิดพลาดใน
flowinfoError ทันที หลังจากขั้นตอนคำขอที่ส่งไปยังเซิร์ฟเวอร์เป้าหมาย ดังที่แสดงด้านล่าง
จดค่าข้อผิดพลาดจากการติดตาม
- error:
response line exceeding 2,048 - error.class:
com.apigee.errors.http.server.BadGateway
ซึ่งบ่งชี้ว่า Apigee Edge (คอมโพเนนต์ Message Processor) แสดงข้อผิดพลาดทันทีที่ได้รับคำตอบจากเซิร์ฟเวอร์แบ็กเอนด์เนื่องจากขนาด Response-Line เกินขีดจำกัดที่อนุญาต
- error:
คุณจะเห็นข้อความแสดงข้อผิดพลาดที่ส่งไปยังไคลเอ็นต์ในขั้นตอนการตอบกลับที่ส่งไปยัง ไคลเอ็นต์ ดังที่แสดงด้านล่าง
- จดค่าข้อผิดพลาดจากการติดตาม
- Error:
502 Bad Gateway - เนื้อหาข้อผิดพลาด:
{"fault":{"faultstring":"response line exceeding 2,048","detail":{"errorcode":"protocol.http.TooBigLine"}}}
- Error:
นอกจากนี้ คุณยังไปที่ขั้นตอน AX (บันทึกข้อมูลวิเคราะห์) ในการติดตาม และคลิกเพื่อดูรายละเอียดข้อผิดพลาดได้ด้วย
จดค่าต่อไปนี้
ส่วนหัวของคำขอ ค่า X-Apigee-fault-code protocol.http.TooBigLineX-Apigee-fault-source targetเนื้อหาข้อผิดพลาด : เนื้อความ {"fault":{"faultstring":"response line size exceeding 2,048","detail":{"errorcode":"protocol.http.TooBigLine"}}}
NGINX
วิธีวินิจฉัยข้อผิดพลาดโดยใช้บันทึกการเข้าถึง NGINX
- หากคุณเป็นผู้ใช้ Private Cloud คุณสามารถใช้บันทึกการเข้าถึง NGINX เพื่อ
ดูข้อมูลสำคัญเกี่ยวกับข้อผิดพลาด HTTP
502ได้ ตรวจสอบบันทึกการเข้าถึง NGINX
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_logโดยที่ ORG, ENV และ PORT# จะถูกแทนที่ด้วยค่าจริง
- ค้นหาเพื่อดูว่ามีข้อผิดพลาด
502เกิดขึ้นในช่วงเวลาที่เฉพาะเจาะจง (หากปัญหาเกิดขึ้นในอดีต) หรือมีคำขอที่ยังคงไม่สำเร็จโดยมีข้อผิดพลาด502หรือไม่ หากพบข้อผิดพลาด
502ที่มีX-Apigee-fault-code ตรงกับค่าprotocol.http.TooBigLineให้กำหนด ค่าของ X-Apigee-fault-source
รายการตัวอย่างข้างต้นจากบันทึกการเข้าถึง NGINX มีค่าต่อไปนี้สำหรับ X- Apigee-fault-code และ X-Apigee-fault-source:
ส่วนหัวการตอบกลับ ค่า X-Apigee-fault-code protocol.http.TooBigLineX-Apigee-fault-source target
สาเหตุ: ขนาด Response-Line ใหญ่กว่าขีดจำกัดที่อนุญาต
การวินิจฉัย
- กำหนดรหัสข้อผิดพลาด และแหล่งที่มาของข้อผิดพลาด สำหรับข้อผิดพลาดที่พบโดยใช้การตรวจสอบ API เครื่องมือติดตาม หรือบันทึกการเข้าถึง NGINX ตามที่อธิบายไว้ใน ขั้นตอนการวินิจฉัยทั่วไป
- หากแหล่งที่มาของข้อผิดพลาด มีค่าเป็น
targetแสดงว่าขนาด Response-Line ที่แอปพลิเคชันเซิร์ฟเวอร์เป้าหมาย/แบ็กเอนด์ส่งไปยัง Apigee มีขนาดใหญ่กว่าขีดจำกัดที่อนุญาตใน Apigee Edge คุณสามารถตรวจสอบว่าขนาด Response-Line เกินขีดจำกัดที่อนุญาต 2 KB โดยใช้วิธีใดวิธีหนึ่งต่อไปนี้
ข้อความแสดงข้อผิดพลาด
วิธีตรวจสอบโดยใช้ข้อความแสดงข้อผิดพลาด
หากคุณมีสิทธิ์เข้าถึงข้อความแสดงข้อผิดพลาดทั้งหมดที่ได้รับจาก Apigee Edge ให้ดูที่
faultstringตัวอย่างข้อความแสดงข้อผิดพลาด:
"faultstring":"response line size exceeding 2,048"
faultstringข้างต้นบ่งชี้ว่าขนาด Response-Line เกินขีดจำกัดที่อนุญาต 2 KBคำขอจริง
วิธีตรวจสอบโดยใช้คำขอจริง
หากคุณมีสิทธิ์เข้าถึงคำขอจริงที่ส่งไปยังแอปพลิเคชันเซิร์ฟเวอร์เป้าหมาย/แบ็กเอนด์ ให้ทำตามขั้นตอนต่อไปนี้
- ตรวจสอบขนาด Response-Line
- หากพบว่าขนาด URI ใหญ่กว่า
ขีดจำกัดที่อนุญาตใน Apigee Edge แสดงว่าขนาด URI เป็นสาเหตุของปัญหา
ตัวอย่างการตอบกลับจากเซิร์ฟเวอร์เป้าหมาย/แบ็กเอนด์:
curl -v http://HOSTALIAS/test
* Trying 3.2.1.4... * TCP_NODELAY set * Connected to <hostalias> (3.2.1.4) port 80 (#0) > GET /test HTTP/1.1 > Host: HOSTALIAS > User-Agent: curl/7.64.1 > Accept: */* > < HTTP/1.1 200 1111…<trimmed>...11111111 < Date: Mon, 26 Jul 2021 07:07:18 GMT < Content-Type: application/json < Content-Length: 269 < Connection: keep-alive < Server: gunicorn/19.9.0 < Access-Control-Allow-Origin: * < Access-Control-Allow-Credentials: true < { <Response Body> } * Connection #0 to host <hostalias> left intact * Closing connection 0
ในกรณีข้างต้น Response-Line
HTTP/1.1 200 1111…<trimmed>...11111111มีขนาดใหญ่กว่า 2 KB นั่นคือมีอักขระ ASCII มากกว่า 2,000 ตัวหากคุณใช้ไคลเอ็นต์อื่น ให้ตรวจสอบบันทึกของไคลเอ็นต์และลอง ดูขนาด Response-Line ที่ส่งไปยัง Apigee Edge
บันทึกของ Message Processor
วิธีตรวจสอบโดยใช้บันทึกของ Message Processor
หากคุณเป็นผู้ใช้ Private Cloud คุณสามารถใช้บันทึกของ Message Processor เพื่อ ตรวจสอบว่าขนาด Response-Line เกิน ขีดจำกัดที่อนุญาตใน Apigee Edge หรือไม่
- กำหนดรหัสข้อความของคำขอที่ไม่สำเร็จโดยใช้การตรวจสอบ API, เครื่องมือติดตาม, หรือบันทึกการเข้าถึง NGINX ตามที่อธิบายไว้ใน ขั้นตอนการวินิจฉัยทั่วไป
ค้นหารหัสข้อความในบันทึกของ Message Processor
/opt/apigee/var/log/edge-message-processor/logs/system.logคุณจะเห็นบรรทัดจาก
system.logที่มีลักษณะคล้ายกับบรรทัดต่อไปนี้2021-07-26 06:45:41,451 org:myorg env:prod api:testtoobigline rev:1 messageid:r-5110240-1 NIOThread@1 ERROR HTTP.CLIENT - HTTPClient$Context$3.onException() : ClientChannel[Connected: Remote:3.2.1.2:80 Local:192.168.205.251:44398]@20592 useCount=1 bytesRead=0 bytesWritten=201 age=144ms lastIO=0ms isOpen=true.onExceptionRead exception: {} com.apigee.errors.http.server.BadGateway: response line size exceeding 2,048 at <snipped> 2021-07-26 06:45:41,451 org:myorg env:prod api:testtoobigline rev:1 messageid:r-5110240-1 NIOThread@1 ERROR ADAPTORS.HTTP.FLOW - AbstractResponseListener.onException() : AbstractResponseListener.onError (HTTPResponse@6a5d6c33, response line size exceeding 2,048)
ข้อความ
message = response line size exceeding 2,048ในข้อความแสดงข้อผิดพลาดข้างต้นบ่งชี้ว่าขนาด Response-Line มีขนาดมากกว่า 2 KB ดังนั้น Apigee Edge จึงแสดงข้อยกเว้นและแสดงรหัสสถานะ502พร้อมรหัสข้อผิดพลาดprotocol.http.TooBiglineไปยังแอปพลิเคชันไคลเอ็นต์
ความละเอียด
แก้ไขขนาด
ตัวเลือกที่ 1 [แนะนำ]: แก้ไขแอปพลิเคชันเซิร์ฟเวอร์เป้าหมาย/แบ็กเอนด์ไม่ให้ส่ง Response-Line ที่มีขนาดใหญ่กว่าขีดจำกัดที่อนุญาต
- วิเคราะห์เหตุผลที่ไคลเอ็นต์เฉพาะส่ง Response-Line ที่มีขนาดใหญ่กว่าขีดจำกัดที่อนุญาตตามที่กำหนดไว้ใน ขีดจำกัด
- หากไม่ต้องการ ให้แก้ไขแอปพลิเคชันเซิร์ฟเวอร์เป้าหมาย/แบ็กเอนด์เพื่อให้ส่ง Response-Line ที่มีขนาดเล็กกว่าขีดจำกัดที่อนุญาต
- หากต้องการและต้องการส่ง Response-Line ที่มีขนาดใหญ่กว่า ขีดจำกัดที่อนุญาต ให้ไปที่ตัวเลือกถัดไป
CwC
ตัวเลือกที่ 2: ใช้พร็อพเพอร์ตี้ CwC เพื่อเพิ่มขีดจำกัด Response-Line
Apigee มีพร็อพเพอร์ตี้ CwC ซึ่งช่วยให้เพิ่มขีดจำกัดขนาด Response-Line ได้ ดูรายละเอียดได้ที่ หัวข้อตั้งค่าขีดจำกัด Response-Line ใน Message Processor
จำกัดสูงสุด
Apigee คาดหวังว่าแอปพลิเคชันไคลเอ็นต์และเซิร์ฟเวอร์แบ็กเอนด์จะไม่ส่ง Request/Response-Lines ที่มีขนาดใหญ่กว่าขีดจำกัดที่อนุญาตตามที่ระบุไว้ในเอกสารประกอบสำหรับ ขีดจำกัด Request/Response-Line ใน ขีดจำกัดของ Apigee Edge
- หากคุณเป็นผู้ใช้ Public Cloud ขีดจำกัดสูงสุดสำหรับขนาด Request และ Response-Line จะเป็นไปตามที่ระบุไว้ในเอกสารประกอบสำหรับขนาด Request/Response-Line ใน ขีดจำกัดของ Apigee Edge
- หากคุณเป็นผู้ใช้ Private Cloud คุณอาจแก้ไขขีดจำกัดสูงสุดเริ่มต้นสำหรับขนาด Request และ Response-Line (แม้ว่าจะไม่ใช่วิธีที่แนะนำ) คุณสามารถกำหนดขีดจำกัดขนาด Response-Line สูงสุดได้โดยทำตามวิธีการใน หัวข้อวิธีตรวจสอบขีดจำกัดปัจจุบัน
วิธีตรวจสอบขีดจำกัดปัจจุบัน
ส่วนนี้อธิบายวิธีตรวจสอบว่าพร็อพเพอร์ตี้ HTTPResponse.line.limit ได้รับการอัปเดตด้วยค่าใหม่ใน Message Processor แล้ว
- ในเครื่อง Message Processor ให้ค้นหาพร็อพเพอร์ตี้
HTTPResponse.line.limitในไดเรกทอรี/opt/apigee/edge-message-processor/confและตรวจสอบว่ามีการตั้งค่าค่าใดไว้ ดังที่แสดงด้านล่างgrep -ri "HTTPResponse.line.limit" /opt/apigee/edge-message-processor/conf
- ผลลัพธ์ตัวอย่างจากคำสั่งข้างต้นมีดังนี้
/opt/apigee/edge-message-processor/conf/http.properties:HTTPResponse.line.limit=2k
ในเอาต์พุตตัวอย่างข้างต้น ให้สังเกตว่าพร็อพเพอร์ตี้
HTTPResponse.line.limitได้รับการตั้งค่าด้วยค่า2kในhttp.propertiesซึ่งบ่งชี้ว่าขีดจำกัดสำหรับขนาด Response-Line ที่กำหนดค่าไว้ใน Apigee สำหรับ Private Cloud คือ 2 KB
หากยังต้องการความช่วยเหลือจากทีมสนับสนุนของ Apigee ให้ไปที่ หัวข้อข้อมูลการวินิจฉัยที่ต้องรวบรวม
ข้อมูลการวินิจฉัยที่ต้องรวบรวม
รวบรวมข้อมูลการวินิจฉัยต่อไปนี้ แล้วติดต่อ ทีมสนับสนุนของ Apigee Edge
หากคุณเป็นผู้ใช้ Public Cloud โปรดระบุข้อมูลต่อไปนี้
- ชื่อองค์กร
- ชื่อสภาพแวดล้อม
- ชื่อพร็อกซี API
- คำสั่ง curl แบบเต็มที่ใช้ทำซ้ำข้อผิดพลาด
502 - ไฟล์การติดตามสำหรับคำขอ API
หากคุณเป็นผู้ใช้ Private Cloud โปรดระบุข้อมูลต่อไปนี้
- ข้อความแสดงข้อผิดพลาดทั้งหมดที่พบสำหรับคำขอที่ไม่สำเร็จ
- ชื่อองค์กร
- ชื่อสภาพแวดล้อม
- แพ็กเกจพร็อกซี API
- ไฟล์การติดตามสำหรับคำขอ API ที่ไม่สำเร็จ
- คำสั่ง
curlแบบเต็มที่ใช้ทำซ้ำข้อผิดพลาด502 บันทึกการเข้าถึง NGINX
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_logโดยที่: ORG, ENV และ PORT# จะถูกแทนที่ด้วย ค่าจริง
- บันทึกของระบบ Message Processor
/opt/apigee/var/log/edge-message-processor/logs/system.log