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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    ใช้ข้อความแสดงข้อผิดพลาดดังนี้

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

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

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

    คำขอจริง

    กรณีที่ใช้คำขอจริง

    1. หากคุณไม่มีสิทธิ์เข้าถึงคำขอจริงที่ส่งไปยังเซิร์ฟเวอร์เป้าหมาย ให้ คำสั่ง curl ที่สอดคล้องกันจาก การใช้เครื่องมือติดตามขั้นตอนที่ 10.และ ขั้นตอนที่ 10.ข.
    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 ยอมรับการทำงานดังกล่าวได้หรือไม่ ใน ในกรณีส่วนใหญ่ URL จะไม่เป็นที่น่าพอใจตามข้อกำหนดของ HTTP RFC7230
  2. หากไม่เป็นที่ต้องการ ให้แก้ไขแอปพลิเคชันเซิร์ฟเวอร์เป้าหมายไม่ให้ส่งส่วนหัวซ้ำกัน ในตัวอย่างที่พูดถึงข้างต้น เราพบว่าระบบส่งส่วนหัว Expires แล้ว 2 ครั้งด้วยค่าเดียวกัน ซึ่งไม่เป็นที่ต้องการ คุณแก้ไขปัญหาได้โดยตรวจสอบ ว่าเซิร์ฟเวอร์เป้าหมายส่งส่วนหัว Expires เพียงครั้งเดียว
  3. หากต้องการอนุญาตการใช้ส่วนหัวซ้ำกัน ให้ไปที่ ตัวเลือกที่ 2 การใช้พร็อพเพอร์ตี้ CwC

CwC

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

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

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

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

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