คุณกำลังดูเอกสารประกอบของ Apigee Edge
ไปที่เอกสารประกอบของ Apigee X ข้อมูล
ลักษณะปัญหา
แอปพลิเคชันไคลเอ็นต์ได้รับรหัสสถานะ 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
การตอบกลับ HTTP โดยทั่วไปประกอบด้วย 3 ส่วน ดังนี้
- Status-Line (เรียกว่า Response-Line ใน Apigee)
- ( ชุดของส่วนหัว HTTP )
- [ เนื้อความ ]
บรรทัดการตอบกลับประกอบด้วย 3 ส่วน ได้แก่ เวอร์ชันโปรโตคอล ตามด้วยรหัสสถานะตัวเลขและวลีข้อความที่เชื่อมโยง ดังที่แสดงด้านล่าง
Response-Line = <HTTP-Version> <Status-Code> <Reason-Phrase>
เมื่อแอปพลิเคชันเซิร์ฟเวอร์ target/backend ส่งการตอบสนอง HTTP บรรทัดแรกที่ส่งจะแสดง Response-Line ตามที่อธิบายข้างต้น ตามด้วยส่วนหัวและเนื้อหา/เพย์โหลดการตอบกลับ ภาพหน้าจอตัวอย่างต่อไปนี้แสดงคำขอ curl
ทั่วไป ส่วนคำขอ และส่วนการตอบกลับ (พร้อมด้วยบรรทัดการตอบกลับ)
ทำความเข้าใจขนาดบรรทัดตอบกลับ
ในตัวอย่างที่กล่าวข้างต้น บรรทัดเริ่มต้น (บรรทัดแรก) ในการตอบกลับหรือที่เรียกว่า Response-Line มีดังนี้
HTTP/1.1 200 OK
บรรทัดตอบกลับนี้มีขนาดเป็น
~15 bytes
เนื่องจากมี15 ASCII characters
เนื่องจากจำนวนดังกล่าวอยู่ภายใน ขีดจำกัดที่อนุญาตใน Apigee Edge Apigee Edge จึงส่งการตอบกลับไปยังไคลเอ็นต์โดยไม่มีข้อผิดพลาด- ในทำนองเดียวกัน หากคุณดู
faultstring
ในข้อความแสดงข้อผิดพลาดที่แสดงอยู่ด้านบน แสดงว่าข้อความนั้นมี"response line size exceeding 2,048"
ซึ่งหมายความว่า Response-Line ในการตอบกลับ HTTP ที่ส่งโดยเซิร์ฟเวอร์ target/backend มีขนาดเกิน 2,048 ไบต์
ทำความเข้าใจ Response-Line ขนาดใหญ่
ตามคำจำกัดความของ Status-Line (เรียกว่า Response-Line ที่นี่) และคำขอและคำตอบ HTTP โดยทั่วไป ขนาดจะเล็กกว่าขีดจำกัดเริ่มต้นที่กำหนดไว้ที่ 2 K ใน Apigee Edge มาก เราจึงไม่ถึงขีดจำกัด อย่างไรก็ตาม อาจมีบางกรณีที่การใช้งานเกินขีดจำกัดนี้
- เซิร์ฟเวอร์เป้าหมาย/แบ็กเอนด์ไม่ใช่ระบบ HTTP อาจตอบสนองด้วยการตอบสนองที่ไม่ใช่ HTTP
- เซิร์ฟเวอร์เป้าหมาย/แบ็กเอนด์มีปัญหาและส่ง Response-Line ยาวเป็นส่วนหนึ่งของการตอบกลับ HTTP
อ่านเพิ่มเติมเกี่ยวกับเรื่องนี้ได้ใน การรับโปรโตคอลข้อผิดพลาด.http.TooBigLine, "ขนาดบรรทัดตอบกลับเกิน 2,048
สาเหตุที่เป็นไปได้ของข้อผิดพลาดดังกล่าวมีดังนี้
สาเหตุ | คำอธิบาย | วิธีการแก้ปัญหาที่ใช้กับ |
---|---|---|
จำนวนบรรทัดตอบกลับเกินขีดจำกัดที่อนุญาต | ขนาดของ Response-Line ที่ส่งโดยเซิร์ฟเวอร์เป้าหมาย/แบ็กเอนด์ซึ่งเป็นส่วนหนึ่งของการตอบกลับ HTTP ไปยัง Apigee Edge สูงกว่าขีดจำกัดที่อนุญาตใน Apigee Edge | ผู้ใช้ Edge Public และ Private Cloud |
ขั้นตอนการวินิจฉัยทั่วไป
ใช้เครื่องมือ/เทคนิคอย่างใดอย่างหนึ่งต่อไปนี้เพื่อวิเคราะห์ข้อผิดพลาดนี้
การตรวจสอบ API
วิธีวินิจฉัยข้อผิดพลาดโดยใช้ API Monitoring
- ลงชื่อเข้าใช้ UI ของ Apigee Edge ในฐานะผู้ใช้ที่มี บทบาทที่เหมาะสม
เปลี่ยนเป็นองค์กรที่คุณต้องการตรวจสอบปัญหา
- ไปที่หน้าวิเคราะห์ > การตรวจสอบ API > ตรวจสอบ
- เลือกกรอบเวลาเฉพาะที่คุณพบข้อผิดพลาด
- คุณอาจเลือกตัวกรองพร็อกซีเพื่อจำกัดรหัสข้อผิดพลาดให้แคบลง
- พล็อตโค้ดข้อผิดพลาดเทียบกับเวลา
เลือกเซลล์ที่มีรหัสข้อผิดพลาด
protocol.http.TooBigLine
ดังที่แสดงด้านล่างคุณจะเห็นข้อมูลเกี่ยวกับรหัสข้อผิดพลาด
protocol.http.TooBigLine
ดังที่แสดงด้านล่างคลิกดูบันทึกแล้วขยายแถวสําหรับคําขอที่ล้มเหลว
- ดูรายละเอียดต่อไปนี้จากหน้าต่าง Logs
- รหัสสถานะ:
502
- แหล่งที่มาของข้อผิดพลาด:
target
- Fault Code:
protocol.http.TooBigLine
- รหัสสถานะ:
- หากต้นทางของข้อผิดพลาดมีค่า
target
และ Fault Code มีค่าprotocol.http.TooBigLine
แสดงว่าการตอบกลับ HTTP จากเซิร์ฟเวอร์เป้าหมาย/ แบ็กเอนด์มีขนาด Response-Line มากกว่าขีดจำกัดสูงสุดใน Apigee Edge
เครื่องมือการติดตาม
- เปิดใช้เซสชันการติดตาม
และเลือกดำเนินการอย่างใดอย่างหนึ่งต่อไปนี้
- รอจนกว่าจะเกิดข้อผิดพลาด
502 Bad Gateway
หรือ - หากทำให้ปัญหาเกิดซ้ำได้ ให้เรียก API และจำลองข้อผิดพลาด
502 Bad Gateway
- รอจนกว่าจะเกิดข้อผิดพลาด
- เลือกคำขอที่ล้มเหลว 1 รายการและตรวจสอบการติดตาม
- ไปยังระยะต่างๆ ของการติดตามและค้นหาตำแหน่งที่ความล้มเหลวเกิดขึ้น
โดยทั่วไปแล้ว คุณจะพบข้อผิดพลาดในข้อผิดพลาด
flowinfo
หลังช่วงส่งคำขอไปยังเซิร์ฟเวอร์เป้าหมายดังที่แสดงด้านล่างจดค่าข้อผิดพลาดจากการติดตามดังนี้
- ข้อผิดพลาด:
response line exceeding 2,048
- error.class:
com.apigee.errors.http.server.BadGateway
ซึ่งเป็นการระบุว่า Apigee Edge (คอมโพเนนต์ผู้ประมวลผลข้อความ) แสดงข้อผิดพลาดทันทีที่ได้รับการตอบกลับจากเซิร์ฟเวอร์แบ็กเอนด์เนื่องจากมีขนาด Response-Line เกินขีดจำกัดที่อนุญาต
- ข้อผิดพลาด:
คุณจะเห็นข้อความแสดงข้อผิดพลาดที่ส่งไปยังไคลเอ็นต์ในส่วนการตอบกลับที่ส่งไปยังไคลเอ็นต์ ดังที่แสดงด้านล่าง
- สังเกตค่าของข้อผิดพลาดจากการติดตาม ดังนี้
- ข้อผิดพลาด:
502 Bad Gateway
- เนื้อหาข้อผิดพลาด:
{"fault":{"faultstring":"response line exceeding 2,048","detail":{"errorcode":"protocol.http.TooBigLine"}}}
- ข้อผิดพลาด:
นอกจากนี้คุณอาจไปยังเฟส AX (บันทึกข้อมูล Analytics) ในการติดตามและคลิกเพื่อดูรายละเอียดข้อผิดพลาด
โปรดสังเกตค่าของรายการต่อไปนี้
ส่วนหัวของคำขอ ค่า X-Apigee-fault-code protocol.http.TooBigLine
X-Apigee-fault-source target
เนื้อหาข้อผิดพลาด : Body {"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 ตรงกับค่าของ X-Apigee-fault-code ให้ระบุค่าของ X-Apigee-fault-codeตัวอย่างรายการด้านบนจากบันทึกการเข้าถึง NGINX มีค่าต่อไปนี้สำหรับ X- Apigee-fault-code และ X-Apigee-fault-source
ส่วนหัวการตอบกลับ ค่า X-Apigee-fault-code protocol.http.TooBigLine
X-Apigee-fault-source target
สาเหตุ: บรรทัดตอบกลับมีขนาดเกินขีดจำกัดที่อนุญาต
การวินิจฉัย
- กำหนด Fault Code และ Fault Source สำหรับข้อผิดพลาดที่สังเกตโดยใช้ API Monitoring, เครื่องมือ Trace หรือบันทึกการเข้าถึง NGINX ตามที่อธิบายไว้ในขั้นตอนการวินิจฉัยทั่วไป
- หาก Fault Source มีค่า
target
แสดงว่าขนาด Response-Line ที่แอปพลิเคชันเซิร์ฟเวอร์เป้าหมาย/แบ็กเอนด์ส่งไปยัง Apigee นั้นสูงกว่าขีดจำกัดที่อนุญาตใน Apigee Edge คุณสามารถตรวจสอบว่าขนาดบรรทัดตอบกลับเกินขีดจำกัด 2 KB ที่อนุญาตโดยใช้วิธีใดวิธีหนึ่งต่อไปนี้
ข้อความแสดงข้อผิดพลาด
หากต้องการตรวจสอบโดยใช้ข้อความแสดงข้อผิดพลาด ให้ทำดังนี้
หากคุณมีสิทธิ์เข้าถึงข้อความแสดงข้อผิดพลาดทั้งหมดที่ได้รับจาก Apigee Edge โปรดดู
faultstring
ตัวอย่างข้อความแสดงข้อผิดพลาด
"faultstring":"response line size exceeding 2,048"
faultstring
ข้างต้นบ่งบอกว่าขนาดบรรทัดตอบกลับเกินขีดจำกัด 2 KB ที่อนุญาตคำขอจริง
วิธีตรวจสอบโดยใช้คำขอจริง
หากคุณมีสิทธิ์เข้าถึงคำขอจริงที่ส่งไปยังแอปพลิเคชันเซิร์ฟเวอร์เป้าหมาย/แบ็กเอนด์ ให้ทำตามขั้นตอนต่อไปนี้
- ยืนยันขนาดของบรรทัดตอบกลับ
- หากคุณพบว่าขนาดของ URI เกินขีดจำกัดที่อนุญาตใน Apigee Edge แสดงว่าเป็นสาเหตุของปัญหา
ตัวอย่างการตอบสนองจากเซิร์ฟเวอร์เป้าหมาย/แบ็กเอนด์
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 K ตัวหากใช้ไคลเอ็นต์อื่นอยู่ ให้ตรวจสอบบันทึกไคลเอ็นต์และพยายามหาขนาดของ Response-Line ที่ส่งไปยัง Apigee Edge
บันทึกตัวประมวลผลข้อความ
วิธีตรวจสอบโดยใช้บันทึกตัวประมวลผลข้อความ
หากเป็นผู้ใช้ Private Cloud คุณจะใช้บันทึกตัวประมวลผลข้อความเพื่อตรวจสอบว่าขนาดบรรทัดตอบกลับเกินขีดจํากัดที่อนุญาตใน Apigee Edge หรือไม่
- กำหนดรหัสข้อความของคำขอที่ไม่สำเร็จโดยใช้การตรวจสอบ API, เครื่องมือติดตาม หรือบันทึกการเข้าถึง NGINX ตามที่อธิบายไว้ในขั้นตอนการวินิจฉัยทั่วไป
ค้นหารหัสข้อความในบันทึกผู้ประมวลผลข้อความดังนี้
/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
ในข้อความแสดงข้อผิดพลาดข้างต้นบ่งชี้ว่าบรรทัดตอบกลับมีขนาดเกิน 2 KB ดังนั้น Apigee Edge จึงจะส่งข้อยกเว้นและแสดงผลรหัสสถานะ502
ที่มีรหัสข้อผิดพลาดprotocol.http.TooBigline
ไปยังแอปพลิเคชันไคลเอ็นต์
ความละเอียด
ขนาดคงที่
ตัวเลือกที่ 1 [แนะนำ]: แก้ไขแอปพลิเคชันเซิร์ฟเวอร์เป้าหมาย/แบ็กเอนด์ไม่ให้ส่งบรรทัดการตอบสนองที่มีขนาดเกินขีดจํากัดที่อนุญาต
- วิเคราะห์สาเหตุที่ไคลเอ็นต์ที่ระบุส่งบรรทัดการตอบสนองที่มีขนาดเกินขีดจำกัดที่อนุญาตตามที่กำหนดไว้ในขีดจำกัด
- หากไม่เป็นที่ต้องการ ให้แก้ไขแอปพลิเคชันเซิร์ฟเวอร์เป้าหมาย/แบ็กเอนด์เพื่อให้ส่ง Response-Line ขนาดต่ำกว่าขีดจำกัดที่อนุญาต
- หากคุณต้องการส่งบรรทัดการตอบกลับที่เกินขีดจำกัดที่อนุญาต ให้ไปที่ตัวเลือกถัดไป
CwC
ตัวเลือกที่ 2: ใช้พร็อพเพอร์ตี้ CwC เพื่อเพิ่มขีดจํากัดบรรทัดตอบกลับ
Apigee มีพร็อพเพอร์ตี้ CwC ที่ช่วยให้เพิ่มขีดจำกัดขนาดบรรทัดตอบกลับได้ โปรดดูรายละเอียดที่ ตั้งค่าขีดจำกัดบรรทัดตอบกลับในเครื่องประมวลผลข้อความ
ข้อจำกัด
Apigee คาดหวังให้แอปพลิเคชันไคลเอ็นต์และเซิร์ฟเวอร์แบ็กเอนด์ไม่ส่งคำขอ/บรรทัดการตอบกลับที่มีขนาดเกินขีดจํากัดที่อนุญาตตามที่บันทึกไว้ในขีดจํากัดบรรทัดคําขอ/การตอบกลับในขีดจํากัดของ Apigee Edge
- หากคุณเป็นผู้ใช้ Cloud สาธารณะ ขีดจำกัดสูงสุดสำหรับคำขอและขนาดของบรรทัดคำตอบจะบันทึกไว้สำหรับขนาดบรรทัดคำขอ/การตอบกลับในขีดจำกัดของ Apigee Edge
- หากคุณเป็นผู้ใช้ Private Cloud ก็อาจแก้ไขขีดจำกัดสูงสุดเริ่มต้นสำหรับขนาดคำขอและขนาดบรรทัดตอบกลับ (แม้ว่าจะไม่ใช่แนวทางปฏิบัติที่แนะนำก็ตาม) คุณระบุขีดจำกัดขนาดบรรทัดตอบกลับสูงสุดได้โดยทำตามวิธีการในวิธีตรวจสอบขีดจำกัดปัจจุบัน
วิธีตรวจสอบขีดจำกัดปัจจุบัน
ส่วนนี้จะอธิบายวิธียืนยันว่าพร็อพเพอร์ตี้ HTTPResponse.line.limit
ได้รับการอัปเดตด้วยค่าใหม่ในตัวประมวลผลข้อความแล้ว
- ในเครื่องเครื่องมือประมวลผลข้อความ ให้ค้นหาพร็อพเพอร์ตี้
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
ซึ่งระบุว่าขีดจำกัดสำหรับขนาดบรรทัดตอบกลับที่กำหนดค่าใน Apigee สำหรับ Private Cloud คือ 2 KB
หากยังต้องการความช่วยเหลือจากทีมสนับสนุนของ Apigee ให้ไปที่หัวข้อต้องรวบรวมข้อมูลการวินิจฉัย
ต้องรวบรวมข้อมูลการวินิจฉัย
รวบรวมข้อมูลการวินิจฉัยต่อไปนี้ จากนั้นติดต่อฝ่ายสนับสนุนของ Apigee Edge
หากคุณเป็นผู้ใช้ระบบคลาวด์สาธารณะ โปรดระบุข้อมูลต่อไปนี้
- ชื่อองค์กร
- ชื่อสภาพแวดล้อม
- ชื่อพร็อกซี 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# ด้วยค่าจริง
- บันทึกระบบของผู้ประมวลผลข้อความ
/opt/apigee/var/log/edge-message-processor/logs/system.log