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

สาเหตุที่เป็นไปได้ของข้อผิดพลาดนี้มีดังนี้

สาเหตุ คำอธิบาย วิธีการแก้ปัญหาที่ใช้กับ
มีส่วนหัวซ้ำในการตอบกลับ การตอบกลับจากเซิร์ฟเวอร์แบ็กเอนด์มีส่วนหัวซ้ำกัน ผู้ใช้ Edge Public และ Private Cloud

ขั้นตอนการวินิจฉัยทั่วไป

ใช้เครื่องมือ/เทคนิคอย่างใดอย่างหนึ่งต่อไปนี้เพื่อวิเคราะห์ข้อผิดพลาดนี้

การตรวจสอบ API

วิธีวินิจฉัยข้อผิดพลาดโดยใช้ API Monitoring

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

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

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

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

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

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

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

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

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

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

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

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

  6. บันทึกค่าของข้อผิดพลาดจากการติดตาม

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

  7. ไปที่เฟส AX (บันทึกข้อมูล Analytics) ในการติดตาม แล้วคลิกที่การติดตาม
  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. หากต้องการตรวจสอบเรื่องนี้ ให้กลับไปที่เฟสของเซิร์ฟเวอร์คำขอที่ส่งไปยังปลายทาง คลิกแสดง 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 ตรงกับค่าของ X-Apigee-fault-code ให้ระบุค่าของ X-Apigee-fault-code

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

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

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

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

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

      "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 ยอมรับได้หรือไม่ ในกรณีส่วนใหญ่ อีเมลนี้ไม่เป็นที่ต้องการตามข้อกำหนดเฉพาะของ 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. หากคุณเป็นผู้ใช้ Cloud สาธารณะ โปรดติดต่อทีมสนับสนุนของ 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