คุณกำลังดูเอกสารประกอบของ Apigee Edge
ไปที่
เอกสารประกอบของ Apigee X info
ลักษณะปัญหา
แอปพลิเคชันไคลเอ็นต์ได้รับรหัสสถานะ 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: Field Order, ผู้ส่งต้องไม่สร้างฟิลด์ส่วนหัวหลายรายการ
ที่มีชื่อฟิลด์เดียวกันในข้อความ เว้นแต่ว่าค่าฟิลด์ทั้งหมดสำหรับ
ฟิลด์ส่วนหัวนั้นจะกำหนดเป็นรายการที่คั่นด้วยคอมมา [เช่น #(values)] หรือฟิลด์ส่วนหัวเป็นข้อยกเว้นที่รู้จักกันดี หาก Apigee Edge พบว่ามีการส่งส่วนหัวเดียวกันที่เฉพาะเจาะจงซึ่งไม่อนุญาตให้มีรายการที่ซ้ำกันมากกว่า 1 ครั้ง ในการตอบกลับ HTTP ที่เซิร์ฟเวอร์เป้าหมาย/แบ็กเอนด์ส่งมา ระบบจะตอบกลับด้วย 502 Bad Gateway และรหัสข้อผิดพลาด protocol.http.DuplicateHeader
สาเหตุที่เป็นไปได้ของข้อผิดพลาดนี้มีดังนี้
| สาเหตุ | คำอธิบาย | วิธีการแก้ปัญหาที่ใช้ได้กับ |
|---|---|---|
| ส่วนหัวที่ซ้ำกันในการตอบกลับ | การตอบกลับจากเซิร์ฟเวอร์แบ็กเอนด์มีส่วนหัวที่ซ้ำกัน | ผู้ใช้ Edge Public และ Private Cloud |
ขั้นตอนการวินิจฉัยทั่วไป
ใช้เครื่องมือ/เทคนิคใดเทคนิคหนึ่งต่อไปนี้เพื่อวินิจฉัยข้อผิดพลาดนี้
การตรวจสอบ API
วิธีวินิจฉัยข้อผิดพลาดโดยใช้การตรวจสอบ API
- ลงชื่อเข้าใช้ UI ของ Apigee Edge ในฐานะผู้ใช้ที่มี บทบาทที่เหมาะสม
เปลี่ยนไปใช้องค์กรที่ต้องการตรวจสอบปัญหา

- ไปที่หน้า Analyze > API Monitoring > Investigate
- เลือกกรอบเวลาที่เฉพาะเจาะจงซึ่งคุณพบข้อผิดพลาด
- ตรวจสอบว่าตัวกรอง Proxy ตั้งค่าเป็น All
- พล็อต Fault Code เทียบกับ Time
เลือกเซลล์ที่มีรหัสข้อผิดพลาด
protocol.http.DuplicateHeaderดังที่แสดงด้านล่าง
ข้อมูลเกี่ยวกับรหัสข้อผิดพลาด
protocol.http.DuplicateHeaderจะแสดงดังที่แสดงด้านล่าง
- ตรวจสอบว่า Status Code เป็น
502ดังที่แสดงในตัวอย่างด้านบน - คลิกดูบันทึก แล้วขยายแถวสำหรับคำขอที่ไม่สำเร็จ
จากหน้าต่างบันทึก ให้จดรายละเอียดต่อไปนี้
- Status Code:
502 - Fault Source:
target - Fault Code:
protocol.http.DuplicateHeader
- Status Code:
- Fault Source คือ
targetซึ่งบ่งชี้ว่าการตอบกลับจากเซิร์ฟเวอร์แบ็กเอนด์มีส่วนหัวที่ซ้ำกัน
เครื่องมือติดตาม
วิธีวินิจฉัยข้อผิดพลาดโดยใช้เครื่องมือติดตาม
- เปิดใช้เซสชันการติดตามและทำอย่างใดอย่างหนึ่งต่อไปนี้
- รอให้เกิดข้อผิดพลาด
502 Bad Gatewayหรือ - หากทำซ้ำปัญหาได้ ให้เรียก API และทำซ้ำข้อผิดพลาด
502 Bad Gateway
- รอให้เกิดข้อผิดพลาด
ตรวจสอบว่าได้เปิดใช้ Show all Flow Infos แล้ว

- เลือกคำขอที่ไม่สำเร็จรายการใดรายการหนึ่ง แล้วตรวจสอบการติดตาม
- ดูขั้นตอนต่างๆ ของการติดตามและค้นหาตำแหน่งที่เกิดข้อผิดพลาด
โดยปกติคุณจะพบข้อผิดพลาดในโฟลว์หลังจากขั้นตอน Request sent to target server ดังที่แสดงด้านล่าง

จดค่าข้อผิดพลาดจากการติดตาม
การติดตามตัวอย่างด้านบนแสดงข้อผิดพลาดเป็น
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.DuplicateHeaderX-Apigee-fault-source target ตรวจสอบว่าคุณใช้ การเชื่อมพร็อกซีหรือไม่ นั่นคือ หากเซิร์ฟเวอร์เป้าหมายหรือปลายทางเป้าหมายเรียกใช้พร็อกซีอื่นใน Apigee
หากต้องการตรวจสอบ ให้กลับไปที่ขั้นตอน Request sent to target server คลิก Show 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.DuplicateHeaderX-Apigee-fault-source target
สาเหตุ: ส่วนหัวที่ซ้ำกันในการตอบกลับ
การวินิจฉัย
- กำหนด Fault Code และ Fault Source สำหรับข้อผิดพลาดที่พบโดยใช้การตรวจสอบ API หรือบันทึกการเข้าถึง NGINX ตามที่อธิบายไว้ใน ขั้นตอนการวินิจฉัยทั่วไป
- หาก Fault Source มีค่าเป็น
targetแสดงว่าการตอบกลับที่เซิร์ฟเวอร์เป้าหมายส่งมามีส่วนหัวที่ซ้ำกัน คุณสามารถกำหนดส่วนหัวจริงที่ส่งมากกว่า 1 ครั้งซึ่งเป็นส่วนหนึ่งของการตอบกลับได้โดยใช้วิธีใดวิธีหนึ่งต่อไปนี้
ข้อความแสดงข้อผิดพลาด
การใช้ข้อความแสดงข้อผิดพลาด
หากคุณมีสิทธิ์เข้าถึงข้อความแสดงข้อผิดพลาดทั้งหมดที่ได้รับจาก Apigee Edge ให้ดู ที่
faultstringfaultstringมีชื่อส่วนหัวที่ ส่งมากกว่า 1 ครั้งตัวอย่างข้อความแสดงข้อผิดพลาด
"faultstring":"Duplicate Header \"Expires\""
- ในข้อความแสดงข้อผิดพลาดด้านบน คุณจะเห็นว่ามีการส่งส่วนหัว
Expiresมากกว่า 1 ครั้งดังที่แสดงในfaultstring
คำขอจริง
การใช้คำขอจริง
- หากไม่มีสิทธิ์เข้าถึงคำขอจริงที่ส่งไปยังเซิร์ฟเวอร์เป้าหมาย ให้รับ
คำสั่ง
curlที่เกี่ยวข้องจาก การใช้เครื่องมือติดตาม ขั้นตอนที่ 10.a และ ขั้นตอนที่ 10.b หากมีสิทธิ์เข้าถึงคำขอจริงที่ส่งไปยังแอปพลิเคชันเซิร์ฟเวอร์เป้าหมาย ให้ทำตามขั้นตอนต่อไปนี้
เรียกเซิร์ฟเวอร์เป้าหมาย
ตัวอย่างคำขอสำหรับเซิร์ฟเวอร์เป้าหมายที่ใช้ในตัวอย่างนี้
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 ยอมรับได้หรือไม่ ใน กรณีส่วนใหญ่ จะไม่เป็นที่ต้องการตามข้อกำหนด HTTP RFC7230 - หากไม่เป็นที่ต้องการ ให้แก้ไขแอปพลิเคชันเซิร์ฟเวอร์เป้าหมายไม่ให้ส่งส่วนหัวที่ซ้ำกัน
ในตัวอย่างที่กล่าวถึงข้างต้น พบว่ามีการส่งส่วนหัว
Expires2 ครั้งโดยมีค่าเดียวกัน ซึ่งไม่เป็นที่ต้องการ คุณสามารถแก้ไขปัญหาได้โดยตรวจสอบว่าเซิร์ฟเวอร์เป้าหมายส่งส่วนหัวExpiresเพียงครั้งเดียว - หากเป็นที่ต้องการและคุณต้องการอนุญาตส่วนหัวที่ซ้ำกัน ให้ไปที่ ตัวเลือกที่ 2 การใช้พร็อพเพอร์ตี้ CwC
CwC
ตัวเลือกที่ 2 การใช้พร็อพเพอร์ตี้ CwC
Apigee มีพร็อพเพอร์ตี้ CwC
HTTPHeader.<HeaderName> ซึ่งช่วยให้แอปพลิเคชันไคลเอ็นต์และเซิร์ฟเวอร์เป้าหมายส่งส่วนหัวที่ซ้ำกันไปยังพร็อกซี API ใน Apigee Edge ได้
| พร็อพเพอร์ตี้ CwC | ค่า |
|---|---|
HTTPHeader.<HeaderName> |
allowDuplicates,multivalued |
ตัวอย่างเช่น คุณตั้งค่าพร็อพเพอร์ตี้ต่อไปนี้ใน Message Processor เพื่ออนุญาตให้มีรายการที่ซ้ำกัน
และค่าหลายค่าสำหรับส่วนหัว Expires ได้
HTTPHeader.Expires=allowDuplicates, multiValued
- หากคุณเป็นผู้ใช้ Private Cloud คุณสามารถกำหนดค่าพร็อพเพอร์ตี้เพื่อป้องกันไม่ให้ Apigee
Edge แสดงข้อผิดพลาด
502 Bad Gatewayแม้ว่าคำขอจะมีส่วนหัวที่ซ้ำกันก็ตาม โดยใช้ คู่มือวิธีการ กำหนดค่า Message Processor ให้ใช้ส่วนหัวที่ซ้ำกัน - หากคุณเป็นผู้ใช้ Public Cloud โปรดติดต่อทีมสนับสนุนของ Apigee Edge เพื่อกำหนดค่า พร็อพเพอร์ตี้นี้สำหรับองค์กรของคุณ
ข้อมูลจำเพาะ
Apigee ตอบกลับด้วยการตอบกลับข้อผิดพลาด 502 Bad Gateway เนื่องจากคาดหวังว่าเซิร์ฟเวอร์แบ็กเอนด์จะทำงานตามข้อกำหนด RFC ต่อไปนี้
| ข้อมูลจำเพาะ |
|---|
| RFC 7230 ส่วนที่ 3.2.2: Field Order |
| RFC 7230 ส่วนที่ 3.2: Header Fields |
หากยังต้องการความช่วยเหลือจากทีมสนับสนุนของ Apigee โปรดไปที่ รวบรวมข้อมูลการวินิจฉัย
รวบรวมข้อมูลการวินิจฉัย
รวบรวมข้อมูลการวินิจฉัยต่อไปนี้ แล้วติดต่อทีมสนับสนุนของ Apigee Edge
หากคุณเป็นผู้ใช้ Public Cloud โปรดระบุข้อมูลต่อไปนี้
- ชื่อองค์กร
- ชื่อสภาพแวดล้อม
- ชื่อพร็อกซี API
- คำสั่ง
curlทั้งหมดที่ใช้ทำซ้ำข้อผิดพลาด502 - ไฟล์การติดตามสำหรับคำขอ API
หากคุณเป็นผู้ใช้ Private Cloud โปรดระบุข้อมูลต่อไปนี้
- ข้อความแสดงข้อผิดพลาดทั้งหมดที่พบสำหรับคำขอที่ไม่สำเร็จ
- ชื่อสภาพแวดล้อม
- App Bundle ของพร็อกซี API
- ไฟล์การติดตามสำหรับคำขอ API
บันทึกการเข้าถึง 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