502 เกตเวย์ไม่ถูกต้อง - ซ้ําส่วนหัว

คุณกำลังดูเอกสารประกอบของ 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

  1. ลงชื่อเข้าใช้ UI ของ Apigee Edge ในฐานะผู้ใช้ที่มี บทบาทที่เหมาะสม
  2. เปลี่ยนไปใช้องค์กรที่ต้องการตรวจสอบปัญหา

  3. ไปที่หน้า Analyze > API Monitoring > Investigate
  4. เลือกกรอบเวลาที่เฉพาะเจาะจงซึ่งคุณพบข้อผิดพลาด
  5. ตรวจสอบว่าตัวกรอง Proxy ตั้งค่าเป็น All
  6. พล็อต Fault Code เทียบกับ Time
  7. เลือกเซลล์ที่มีรหัสข้อผิดพลาด protocol.http.DuplicateHeader ดังที่แสดงด้านล่าง

    (ดูรูปภาพขนาดใหญ่ขึ้น)

  8. ข้อมูลเกี่ยวกับรหัสข้อผิดพลาด protocol.http.DuplicateHeader จะแสดงดังที่แสดงด้านล่าง

    (ดูรูปภาพขนาดใหญ่ขึ้น)

  9. ตรวจสอบว่า Status Code เป็น 502 ดังที่แสดงในตัวอย่างด้านบน
  10. คลิกดูบันทึก แล้วขยายแถวสำหรับคำขอที่ไม่สำเร็จ
  11. จากหน้าต่างบันทึก ให้จดรายละเอียดต่อไปนี้

    • Status Code: 502
    • Fault Source: target
    • Fault Code: protocol.http.DuplicateHeader
  12. Fault Source คือ target ซึ่งบ่งชี้ว่าการตอบกลับจากเซิร์ฟเวอร์แบ็กเอนด์มีส่วนหัวที่ซ้ำกัน

เครื่องมือติดตาม

วิธีวินิจฉัยข้อผิดพลาดโดยใช้เครื่องมือติดตาม

  1. เปิดใช้เซสชันการติดตามและทำอย่างใดอย่างหนึ่งต่อไปนี้
    1. รอให้เกิดข้อผิดพลาด 502 Bad Gateway หรือ
    2. หากทำซ้ำปัญหาได้ ให้เรียก API และทำซ้ำข้อผิดพลาด 502 Bad Gateway
  2. ตรวจสอบว่าได้เปิดใช้ Show all Flow Infos แล้ว

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

    (ดูรูปภาพขนาดใหญ่ขึ้น)

  6. จดค่าข้อผิดพลาดจากการติดตาม

    การติดตามตัวอย่างด้านบนแสดงข้อผิดพลาดเป็น Duplicate Header "Expires" เนื่องจาก Apigee แสดงข้อผิดพลาดหลังจากส่งคำขอไปยังเซิร์ฟเวอร์แบ็กเอนด์แล้ว จึงบ่งชี้ ว่าเซิร์ฟเวอร์แบ็กเอนด์ส่งส่วนหัว Expires มากกว่า 1 ครั้ง

  7. ไปที่ขั้นตอน AX (Analytics Data Recorded) ในการติดตาม แล้วคลิก
  8. เลื่อนลงไปที่ส่วน Phase Details - Response Headers แล้วกำหนด ค่าของ X-Apigee-fault-code และ X-Apigee-fault-source ดังที่แสดงด้านล่าง

    (ดูรูปภาพขนาดใหญ่ขึ้น)

  9. คุณจะเห็นค่าของ 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
  10. ตรวจสอบว่าคุณใช้ การเชื่อมพร็อกซีหรือไม่ นั่นคือ หากเซิร์ฟเวอร์เป้าหมายหรือปลายทางเป้าหมายเรียกใช้พร็อกซีอื่นใน Apigee

    1. หากต้องการตรวจสอบ ให้กลับไปที่ขั้นตอน Request sent to target server คลิก Show Curl

    2. หน้าต่าง Curl for Request Sent to Target Server จะเปิดขึ้น ซึ่งคุณสามารถ กำหนดชื่อแทนโฮสต์ของเซิร์ฟเวอร์เป้าหมายได้

    3. หากชื่อแทนโฮสต์ของเซิร์ฟเวอร์เป้าหมายชี้ไปยังชื่อแทนโฮสต์เสมือน แสดงว่าเป็นการเชื่อมพร็อกซี ในกรณีนี้ คุณต้องทำซ้ำขั้นตอนทั้งหมดข้างต้นสำหรับพร็อกซีที่เชื่อมโยงกันจนกว่า คุณจะทราบสาเหตุที่ทำให้เกิดข้อผิดพลาด 502 Bad Gateway
    4. หากชื่อแทนโฮสต์ของเซิร์ฟเวอร์เป้าหมายชี้ไปยังเซิร์ฟเวอร์แบ็กเอนด์ แสดงว่า เซิร์ฟเวอร์แบ็กเอนด์กำลังส่งส่วนหัวที่ซ้ำกันในการตอบกลับไปยัง Apigee

NGINX

วิธีวินิจฉัยข้อผิดพลาดโดยใช้บันทึกการเข้าถึง NGINX

  1. หากคุณเป็นผู้ใช้ Private Cloud คุณสามารถใช้บันทึกการเข้าถึง NGINX เพื่อ กำหนดข้อมูลสำคัญเกี่ยวกับข้อผิดพลาด HTTP 502 ได้
  2. ตรวจสอบบันทึกการเข้าถึง NGINX

    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

    โดยที่ ORG, ENV และ PORT# จะถูกแทนที่ด้วยค่าจริง

  3. ค้นหาเพื่อดูว่ามีข้อผิดพลาด 502 เกิดขึ้นในช่วงเวลาที่เฉพาะเจาะจงหรือไม่ (หากปัญหาเกิดขึ้นในอดีต) หรือยังมีคำขอที่ไม่สำเร็จด้วยข้อผิดพลาด 502 อยู่หรือไม่
  4. หากพบข้อผิดพลาด 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

สาเหตุ: ส่วนหัวที่ซ้ำกันในการตอบกลับ

การวินิจฉัย

  1. กำหนด Fault Code และ Fault Source สำหรับข้อผิดพลาดที่พบโดยใช้การตรวจสอบ API หรือบันทึกการเข้าถึง NGINX ตามที่อธิบายไว้ใน ขั้นตอนการวินิจฉัยทั่วไป
  2. หาก Fault Source มีค่าเป็น target แสดงว่าการตอบกลับที่เซิร์ฟเวอร์เป้าหมายส่งมามีส่วนหัวที่ซ้ำกัน
  3. คุณสามารถกำหนดส่วนหัวจริงที่ส่งมากกว่า 1 ครั้งซึ่งเป็นส่วนหนึ่งของการตอบกลับได้โดยใช้วิธีใดวิธีหนึ่งต่อไปนี้

    ข้อความแสดงข้อผิดพลาด

    การใช้ข้อความแสดงข้อผิดพลาด

    1. หากคุณมีสิทธิ์เข้าถึงข้อความแสดงข้อผิดพลาดทั้งหมดที่ได้รับจาก Apigee Edge ให้ดู ที่ faultstring faultstring มีชื่อส่วนหัวที่ ส่งมากกว่า 1 ครั้ง

      ตัวอย่างข้อความแสดงข้อผิดพลาด

      "faultstring":"Duplicate Header \"Expires\""
    2. ในข้อความแสดงข้อผิดพลาดด้านบน คุณจะเห็นว่ามีการส่งส่วนหัว Expires มากกว่า 1 ครั้งดังที่แสดงใน faultstring

    คำขอจริง

    การใช้คำขอจริง

    1. หากไม่มีสิทธิ์เข้าถึงคำขอจริงที่ส่งไปยังเซิร์ฟเวอร์เป้าหมาย ให้รับ คำสั่ง curl ที่เกี่ยวข้องจาก การใช้เครื่องมือติดตาม ขั้นตอนที่ 10.a และ ขั้นตอนที่ 10.b
    2. หากมีสิทธิ์เข้าถึงคำขอจริงที่ส่งไปยังแอปพลิเคชันเซิร์ฟเวอร์เป้าหมาย ให้ทำตามขั้นตอนต่อไปนี้

      1. เรียกเซิร์ฟเวอร์เป้าหมาย

        ตัวอย่างคำขอสำหรับเซิร์ฟเวอร์เป้าหมายที่ใช้ในตัวอย่างนี้

        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
        
      2. ตรวจสอบรายการส่วนหัวที่เห็นในการตอบกลับ

        ตัวอย่างการตอบกลับจากเซิร์ฟเวอร์เป้าหมายที่ใช้ในตัวอย่างนี้

        * ...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

      3. หากส่วนหัวที่มีชื่อปรากฏใน faultstring ปรากฏ มากกว่า 1 ครั้งในการตอบกลับของเซิร์ฟเวอร์แบ็กเอนด์ แสดงว่าส่วนหัวนั้นเป็นสาเหตุของข้อผิดพลาดนี้ ในกรณีด้านบน มีการส่งส่วนหัว Expires มากกว่า 1 ครั้ง

ความละเอียด

แก้ไขรายการที่ซ้ำกัน

ตัวเลือกที่ 1 [ตัวเลือกที่แนะนำ] แก้ไขเซิร์ฟเวอร์แบ็กเอนด์ไม่ให้มีส่วนหัวที่ซ้ำกัน

  1. วิเคราะห์เหตุผลที่เซิร์ฟเวอร์แบ็กเอนด์ที่เฉพาะเจาะจงส่งส่วนหัวที่ซ้ำกัน Expires และตรวจสอบว่าพร็อกซี API ยอมรับได้หรือไม่ ใน กรณีส่วนใหญ่ จะไม่เป็นที่ต้องการตามข้อกำหนด HTTP RFC7230
  2. หากไม่เป็นที่ต้องการ ให้แก้ไขแอปพลิเคชันเซิร์ฟเวอร์เป้าหมายไม่ให้ส่งส่วนหัวที่ซ้ำกัน ในตัวอย่างที่กล่าวถึงข้างต้น พบว่ามีการส่งส่วนหัว Expires 2 ครั้งโดยมีค่าเดียวกัน ซึ่งไม่เป็นที่ต้องการ คุณสามารถแก้ไขปัญหาได้โดยตรวจสอบว่าเซิร์ฟเวอร์เป้าหมายส่งส่วนหัว Expires เพียงครั้งเดียว
  3. หากเป็นที่ต้องการและคุณต้องการอนุญาตส่วนหัวที่ซ้ำกัน ให้ไปที่ ตัวเลือกที่ 2 การใช้พร็อพเพอร์ตี้ CwC

CwC

ตัวเลือกที่ 2 การใช้พร็อพเพอร์ตี้ CwC

Apigee มีพร็อพเพอร์ตี้ CwC HTTPHeader.<HeaderName> ซึ่งช่วยให้แอปพลิเคชันไคลเอ็นต์และเซิร์ฟเวอร์เป้าหมายส่งส่วนหัวที่ซ้ำกันไปยังพร็อกซี API ใน Apigee Edge ได้

พร็อพเพอร์ตี้ CwC ค่า
HTTPHeader.<HeaderName> allowDuplicates,multivalued

ตัวอย่างเช่น คุณตั้งค่าพร็อพเพอร์ตี้ต่อไปนี้ใน Message Processor เพื่ออนุญาตให้มีรายการที่ซ้ำกัน และค่าหลายค่าสำหรับส่วนหัว Expires ได้

HTTPHeader.Expires=allowDuplicates, multiValued
  1. หากคุณเป็นผู้ใช้ Private Cloud คุณสามารถกำหนดค่าพร็อพเพอร์ตี้เพื่อป้องกันไม่ให้ Apigee Edge แสดงข้อผิดพลาด 502 Bad Gateway แม้ว่าคำขอจะมีส่วนหัวที่ซ้ำกันก็ตาม โดยใช้ คู่มือวิธีการ กำหนดค่า Message Processor ให้ใช้ส่วนหัวที่ซ้ำกัน
  2. หากคุณเป็นผู้ใช้ 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