คุณกำลังดูเอกสารประกอบ Apigee Edge
ไปที่
เอกสารประกอบเกี่ยวกับ Apigee X. ข้อมูล
ลักษณะปัญหา
แอปพลิเคชันไคลเอ็นต์ได้รับรหัสสถานะ HTTP 502 Bad Gateway
พร้อมรหัสข้อผิดพลาด
protocol.http.DuplicateHeader
เป็นการตอบกลับสำหรับการเรียก API
ข้อความแสดงข้อผิดพลาด
แอปพลิเคชันไคลเอ็นต์ได้รับโค้ดตอบกลับต่อไปนี้
HTTP/1.1 502 Bad Gateway
นอกจากนี้ คุณอาจสังเกตเห็นข้อความแสดงข้อผิดพลาดที่คล้ายกับข้อความด้านล่าง:
{ "fault":{ "faultstring":"Duplicate Header \"Expires\"", "detail":{ "errorcode":"protocol.http.DuplicateHeader" } } }
สาเหตุที่เป็นไปได้
ข้อผิดพลาดนี้เกิดขึ้นหากมีส่วนหัว HTTP ที่เฉพาะเจาะจงที่ไม่ได้รับอนุญาตให้มีข้อมูลซ้ำใน Apigee Edge จะปรากฏขึ้นมากกว่า 1 ครั้งด้วยค่าเดียวกันหรือต่างกัน โดยเป็นส่วนหนึ่งของการตอบกลับ HTTP ที่ส่งโดย เซิร์ฟเวอร์แบ็กเอนด์ไปยัง Apigee Edge
ตาม
RFC 7230 ส่วนที่ 3.2.2: ลำดับช่อง ผู้ส่งต้องไม่สร้างส่วนหัวหลายรายการ
ฟิลด์ที่มีชื่อฟิลด์เหมือนกันในข้อความ ยกเว้นฟิลด์ที่เป็นค่าทั้งหมด
ช่องส่วนหัวถูกกำหนดเป็นรายการที่คั่นด้วยจุลภาค [เช่น #(ค่า)] หรือฟิลด์ส่วนหัวคือ
ข้อยกเว้นที่ทราบกันดี หาก Apigee Edge พบว่ามีส่วนหัวที่เฉพาะเจาะจงเดียวกัน ระบบจะไม่อนุญาตให้ทำ
มีข้อมูลซ้ำ มีการส่งมากกว่าหนึ่งครั้งในการตอบกลับ HTTP ที่ส่งโดย
เซิร์ฟเวอร์เป้าหมาย/แบ็กเอนด์
แล้วก็ตอบสนองด้วย 502 Bad Gateway
และรหัสข้อผิดพลาด
protocol.http.DuplicateHeader
สาเหตุที่เป็นไปได้สำหรับข้อผิดพลาดนี้มีดังนี้
สาเหตุ | คำอธิบาย | วิธีการแก้ปัญหาสำหรับ |
---|---|---|
ส่วนหัวซ้ำกันในการตอบกลับ | การตอบกลับจากเซิร์ฟเวอร์แบ็กเอนด์มีส่วนหัวซ้ำกัน | ผู้ใช้ Edge สาธารณะและ Private Cloud |
ขั้นตอนการวินิจฉัยทั่วไป
ใช้เครื่องมือ/เทคนิคต่อไปนี้เพื่อวินิจฉัยข้อผิดพลาดนี้
การตรวจสอบ API
วิธีวินิจฉัยข้อผิดพลาดโดยใช้การตรวจสอบ API
- ลงชื่อเข้าใช้ Apigee Edge UI ในฐานะผู้ใช้ที่มี บทบาทที่เหมาะสม
เปลี่ยนเป็นองค์กรที่ต้องการตรวจสอบปัญหา
- ไปที่ วิเคราะห์ > การตรวจสอบ API > หน้าตรวจสอบ
- เลือกกรอบเวลาที่คุณพบข้อผิดพลาด
- ตรวจสอบว่าได้ตั้งค่าตัวกรองพร็อกซีเป็นทั้งหมดแล้ว
- พล็อตรหัสข้อผิดพลาดเทียบกับเวลา
เลือกเซลล์ที่มีรหัสข้อผิดพลาด
protocol.http.DuplicateHeader
ดังที่แสดงด้านล่างข้อมูลเกี่ยวกับรหัสข้อผิดพลาด
protocol.http.DuplicateHeader
แสดงอยู่ด้านล่าง- ตรวจสอบว่ารหัสสถานะ เป็น
502
ดังที่แสดงในตัวอย่างด้านบน - คลิก ดูบันทึก และขยายแถวสำหรับคำขอที่ล้มเหลว
จากหน้าต่างบันทึก โปรดสังเกตรายละเอียดต่อไปนี้
- รหัสสถานะ:
502
- แหล่งที่มาของข้อผิดพลาด:
target
- รหัสข้อผิดพลาด:
protocol.http.DuplicateHeader
- รหัสสถานะ:
- Fault Source คือ
target
ซึ่งบ่งชี้ว่าการตอบสนองจากเซิร์ฟเวอร์แบ็กเอนด์มีส่วนหัวที่ซ้ำกัน
เครื่องมือการติดตาม
วิธีวินิจฉัยข้อผิดพลาดโดยใช้เครื่องมือติดตาม
- เปิดใช้เซสชันการติดตาม และ
- รอให้เกิดข้อผิดพลาด
502 Bad Gateway
หรือ - หากคุณทำให้เกิดปัญหาซ้ำได้ ให้เรียก API และสร้าง
ข้อผิดพลาด
502 Bad Gateway
รายการ
- รอให้เกิดข้อผิดพลาด
ตรวจสอบว่าเปิดใช้แสดงข้อมูลโฟลว์ทั้งหมดแล้ว โดยทำดังนี้
- เลือกคำขอที่ไม่สำเร็จรายการหนึ่งและตรวจสอบการติดตาม
- ดำเนินการตามขั้นตอนต่างๆ ของการติดตามและค้นหาตำแหน่งที่เกิดข้อผิดพลาด
โดยปกติแล้ว คุณจะเห็นข้อผิดพลาดในขั้นตอนหลังจากที่ระบบส่งคำขอไปยังเป้าหมายแล้ว เซิร์ฟเวอร์ตามที่แสดงด้านล่าง
จดค่าของข้อผิดพลาดจากการติดตาม
การติดตามตัวอย่างด้านบนแสดงข้อผิดพลาดเป็น
Duplicate Header "Expires"
ตั้งแต่ปี Apigee คือข้อผิดพลาดที่เพิ่มขึ้นหลังจากที่ส่งคำขอไปยังเซิร์ฟเวอร์แบ็กเอนด์และระบุ ที่เซิร์ฟเวอร์แบ็กเอนด์ส่งส่วนหัวExpires
มากกว่า 1 ครั้ง- ไปยังระยะ AX (Analytics Data Recorded) ในการติดตามและคลิก
เลื่อนลงไปที่ส่วน Phase Details - Response Headers ของ X-Apigee-fault-code และ X-Apigee-fault-source ดังที่แสดงด้านล่าง
- คุณจะเห็นค่าของ X-Apigee-fault-code และ X-Apigee-fault-source
เป็น
protocol.http.DuplicateHeader
และtarget
ซึ่งหมายความว่า ข้อผิดพลาดนี้เกิดขึ้นเนื่องจากมีการส่งส่วนหัวที่ซ้ำกันโดยเซิร์ฟเวอร์แบ็กเอนด์สำหรับ ส่วนหัวการตอบกลับExpires
ส่วนหัวการตอบกลับ ค่า X-Apigee-fault-code protocol.http.DuplicateHeader
X-Apigee-fault-source target
ตรวจสอบว่าคุณกำลังใช้ Proxy Chaining กล่าวคือ หากเซิร์ฟเวอร์เป้าหมายหรือปลายทางเป้าหมายเรียกใช้พร็อกซีอื่นใน Apigee
หากต้องการตรวจสอบ ให้กลับไปที่ขั้นตอนเซิร์ฟเวอร์ส่งคำขอที่ส่งไปยังเป้าหมาย คลิกแสดง Curl
หน้าต่าง Curl for Request Sent to Target Server จะเปิดขึ้นเพื่อให้คุณทำตามขั้นตอนต่อไปนี้ได้ กำหนดชื่อแทนของโฮสต์เซิร์ฟเวอร์เป้าหมาย
- หากชื่อแทนโฮสต์ของเซิร์ฟเวอร์เป้าหมายชี้ไปยังชื่อแทนโฮสต์เสมือน แสดงว่าพร็อกซีนั้นคือพร็อกซี
การทำสายโซ่ ในกรณีนี้ คุณต้องทำขั้นตอนด้านบนทั้งหมดซ้ำสำหรับพร็อกซีที่มีการเชื่อมโยงจนกว่า
คุณจะทราบได้ว่าอะไรคือสาเหตุของข้อผิดพลาด
502 Bad Gateway
ที่แท้จริง - หากชื่อแทนโฮสต์ของเซิร์ฟเวอร์เป้าหมายชี้ไปที่เซิร์ฟเวอร์แบ็กเอนด์ ระบบจะระบุว่า เซิร์ฟเวอร์แบ็กเอนด์ของคุณกำลังส่งส่วนหัวที่ซ้ำกันในการตอบกลับไปยัง Apigee
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.DuplicateHeader
จากนั้น กำหนดค่าของ X-Apigee-fault-source.ตัวอย่างข้อผิดพลาด 502 จากบันทึกการเข้าถึง NGINX
ตัวอย่างรายการข้างต้นจากบันทึกการเข้าถึง NGINX มีค่าต่อไปนี้สำหรับ X- Apigee-fault-code และ X-Apigee-fault-source:
ส่วนหัวการตอบกลับ ค่า X-Apigee-fault-code protocol.http.DuplicateHeader
X-Apigee-fault-source target
สาเหตุ: ส่วนหัวซ้ำกันในการตอบกลับ
การวินิจฉัย
- กำหนดรหัสข้อผิดพลาดและแหล่งที่มาของข้อผิดพลาดสำหรับข้อผิดพลาดที่พบโดยใช้ API การตรวจสอบหรือบันทึกการเข้าถึง NGINX ตามที่อธิบายไว้ใน ขั้นตอนการวิเคราะห์ทั่วไป
- หากแหล่งที่มาของข้อผิดพลาดมีค่า
target
แสดงว่าการตอบสนอง ที่ส่งโดยเซิร์ฟเวอร์เป้าหมายมีส่วนหัวซ้ำกัน คุณระบุส่วนหัวจริงที่ส่งเกิน 1 ครั้งเป็นส่วนหนึ่งของคำตอบได้ โดยใช้วิธีใดวิธีหนึ่งต่อไปนี้
ข้อความแสดงข้อผิดพลาด
ใช้ข้อความแสดงข้อผิดพลาดดังนี้
หากคุณสามารถเข้าถึงข้อความแสดงข้อผิดพลาดทั้งหมดที่ได้รับจาก Apigee Edge ได้ โปรดดู เป็น
faultstring
faultstring
มีชื่อส่วนหัวที่ มีการส่งมากกว่าหนึ่งครั้งตัวอย่างข้อความแสดงข้อผิดพลาด
"faultstring":"Duplicate Header \"Expires\""
- ในข้อความแสดงข้อผิดพลาดข้างต้น คุณจะเห็นว่าส่วนหัว
Expires
ถูกส่ง มากกว่า 1 ครั้งตามที่เห็นในfaultstring
คำขอจริง
กรณีที่ใช้คำขอจริง
- หากคุณไม่มีสิทธิ์เข้าถึงคำขอจริงที่ส่งไปยังเซิร์ฟเวอร์เป้าหมาย ให้
คำสั่ง
curl
ที่สอดคล้องกันจาก การใช้เครื่องมือติดตามขั้นตอนที่ 10.และ ขั้นตอนที่ 10.ข. หากคุณมีสิทธิ์เข้าถึงคำขอจริงที่ส่งไปยังแอปพลิเคชันเซิร์ฟเวอร์เป้าหมาย จากนั้นให้ทำตามขั้นตอนต่อไปนี้
เรียกไปยังเซิร์ฟเวอร์เป้าหมาย
คำขอตัวอย่างสำหรับเซิร์ฟเวอร์เป้าหมายที่ใช้ในตัวอย่างนี้
curl -X GET "https://BACKEND_SERVER_HOST/response-headers?Expires=Mon%2C%2021%20June%202021%2007%3A28%3A00%20GMT&Expires=Mon%2C%2021%20June%202021%2007%3A28%3A00%20GMT" -v
ตรวจสอบรายการส่วนหัวที่เห็นในคำตอบ
ตัวอย่างการตอบกลับจากเซิร์ฟเวอร์เป้าหมายที่ใช้ในตัวอย่างนี้
* ...Trimmed... > GET /response-headers?Expires=Mon%2C%2021%20June%202021%2007%3A28%3A00%20GMT&Expires=Mon%2C%2021%20June%202021%2007%3A28%3A00%20GMT HTTP/2 > Host: BACKEND_SERVER_HOST > User-Agent: curl/7.64.1 > Accept: */* > * Connection state changed (MAX_CONCURRENT_STREAMS == 128)! < HTTP/2 200 < date: Fri, 02 Jul 2021 05:29:07 GMT < content-type: application/json < content-length: 166 < server: gunicorn/19.9.0 < Expires: Mon, 21 June 2021 07:28:00 GMT < Expires: Mon, 21 June 2021 07:28:00 GMT < access-control-allow-origin: * < access-control-allow-credentials: true < ----<Response BODY>------ * Connection #0 to host httpbin.org left intact * Closing connection 0
ในคำขอตัวอย่างด้านบน ส่วนหัว
Expires
ถูกส่งเพิ่มเติม มากกว่า 1 ครั้ง ดังนั้น คำขอนี้จึงล้มเหลวด้วย502 Bad Gateway
และรหัสข้อผิดพลาด:protocol.http.DuplicateHeader
หากส่วนหัวที่มีชื่อปรากฏใน
faultstring
ปรากฏขึ้น มากกว่า 1 ครั้งในการตอบสนองของเซิร์ฟเวอร์แบ็กเอนด์ ดังนั้นนี่จึงเป็นสาเหตุที่ ในกรณีข้างต้น ระบบส่งส่วนหัวExpires
มากกว่า 1 ครั้ง
ความละเอียด
แก้ไขความซ้ำซ้อน
ตัวเลือกที่ 1 [ตัวเลือกที่แนะนำ] แก้ไขเซิร์ฟเวอร์แบ็กเอนด์เพื่อไม่ให้มีส่วนหัวซ้ำกัน
- วิเคราะห์เหตุผลที่เซิร์ฟเวอร์แบ็กเอนด์ที่เฉพาะเจาะจงส่งส่วนหัวซ้ำกัน
Expires
แล้วตรวจสอบว่าพร็อกซี API ยอมรับการทำงานดังกล่าวได้หรือไม่ ใน ในกรณีส่วนใหญ่ URL จะไม่เป็นที่น่าพอใจตามข้อกำหนดของ HTTP RFC7230 - หากไม่เป็นที่ต้องการ ให้แก้ไขแอปพลิเคชันเซิร์ฟเวอร์เป้าหมายไม่ให้ส่งส่วนหัวซ้ำกัน
ในตัวอย่างที่พูดถึงข้างต้น เราพบว่าระบบส่งส่วนหัว
Expires
แล้ว 2 ครั้งด้วยค่าเดียวกัน ซึ่งไม่เป็นที่ต้องการ คุณแก้ไขปัญหาได้โดยตรวจสอบ ว่าเซิร์ฟเวอร์เป้าหมายส่งส่วนหัวExpires
เพียงครั้งเดียว - หากต้องการอนุญาตการใช้ส่วนหัวซ้ำกัน ให้ไปที่ ตัวเลือกที่ 2 การใช้พร็อพเพอร์ตี้ CwC
CwC
ตัวเลือกที่ 2 การใช้พร็อพเพอร์ตี้ CwC
Apigee จะมีพร็อพเพอร์ตี้ CwC ด้วย
HTTPHeader.<HeaderName>
ซึ่งช่วยให้แอปพลิเคชันไคลเอ็นต์และการกำหนดเป้าหมาย
เซิร์ฟเวอร์จะส่งส่วนหัวที่ซ้ำกันไปยังพร็อกซี API ใน Apigee Edge
พร็อพเพอร์ตี้ของ CwC | ค่า |
---|---|
HTTPHeader.<HeaderName> |
allowDuplicates,multivalued |
เช่น คุณสามารถตั้งค่าพร็อพเพอร์ตี้ต่อไปนี้บนตัวประมวลผลข้อความเพื่ออนุญาตการทำซ้ำ
และมีค่าหลายค่าสำหรับส่วนหัว Expires
HTTPHeader.Expires=allowDuplicates, multiValued
- หากคุณเป็นผู้ใช้ Private Cloud คุณจะกำหนดค่าพร็อพเพอร์ตี้เพื่อป้องกัน Apigee ได้
Edge จากการเพิ่มข้อผิดพลาด
502 Bad Gateway
แม้ว่าคำขอจะมี ทำส่วนหัวซ้ำกันโดยใช้ การกำหนดค่าโปรแกรมประมวลผลข้อความเพื่อใช้ส่วนหัวที่ซ้ำกัน - หากคุณเป็นผู้ใช้ระบบคลาวด์สาธารณะ โปรดติดต่อทีมสนับสนุนของ Apigee Edge เพื่อกำหนดค่านี้ สำหรับองค์กรของคุณได้
ข้อมูลจำเพาะ
Apigee จะตอบสนองต่อข้อผิดพลาด "502 Bad Gateway
" ตามที่คาดหวังไว้ว่า
เซิร์ฟเวอร์ส่วนหลังจะทำงานตามข้อกำหนด RFC ต่อไปนี้
ข้อมูลจำเพาะ |
---|
RFC 7230 ส่วนที่ 3.2.2: ลำดับในช่อง |
RFC 7230 ส่วนที่ 3.2: ช่องส่วนหัว |
หากยังต้องการความช่วยเหลือจากทีมสนับสนุนของ Apigee ให้ไปที่ ต้องรวบรวมข้อมูลการวินิจฉัย
ต้องรวบรวมข้อมูลการวินิจฉัย
รวบรวมข้อมูลการวินิจฉัยต่อไปนี้ จากนั้นให้ติดต่อทีมสนับสนุนของ Apigee Edge
หากคุณเป็นผู้ใช้ระบบคลาวด์สาธารณะ โปรดระบุข้อมูลต่อไปนี้
- ชื่อองค์กร
- ชื่อสภาพแวดล้อม
- ชื่อพร็อกซี API
- ทำตามคำสั่ง
curl
ในการสร้างข้อผิดพลาด502
ซ้ำ - ไฟล์การติดตามสำหรับคำขอ API
หากคุณเป็นผู้ใช้ Private Cloud ให้ระบุข้อมูลต่อไปนี้
- พบข้อความแสดงข้อผิดพลาดทั้งหมดสำหรับคำขอที่ล้มเหลว
- ชื่อสภาพแวดล้อม
- แพ็กเกจพร็อกซี API
- ไฟล์การติดตามสำหรับคำขอ API
บันทึกการเข้าถึง 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