502 เกตเวย์ไม่ถูกต้อง - การตอบกลับ 405 โดยไม่มีส่วนหัวที่อนุญาต

คุณกำลังดูเอกสารประกอบของ Apigee Edge
ไปที่เอกสารประกอบของ Apigee X
ข้อมูล

ลักษณะปัญหา

แอปพลิเคชันไคลเอ็นต์ได้รับรหัสสถานะ HTTP 502 Bad Gateway พร้อมรหัสข้อผิดพลาด protocol.http.Response405WithoutAllowHeader เป็นการตอบกลับสำหรับการเรียก API

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

แอปพลิเคชันไคลเอ็นต์จะได้รับโค้ดตอบกลับต่อไปนี้

HTTP/1.1 502 Bad Gateway

นอกจากนี้ คุณอาจพบข้อความแสดงข้อผิดพลาดต่อไปนี้

{
   "fault":{
      "faultstring":"Received 405 Response without Allow Header",
      "detail":{
         "errorcode":"protocol.http.Response405WithoutAllowHeader"
      }
   }
}

สาเหตุที่เป็นไปได้

ข้อผิดพลาดนี้เกิดขึ้นหากเซิร์ฟเวอร์แบ็กเอนด์ตอบกลับด้วยรหัสสถานะ 405 Method Not Allowed โดยไม่มีส่วนหัว Allow

ตามข้อกำหนดของ RFC 7231 ส่วน 6.5.5: 405 ไม่อนุญาตเมธอด เซิร์ฟเวอร์ต้นทางต้องสร้างและส่งช่องส่วนหัว Allow ในการตอบกลับ 405 ที่มีรายการเมธอดที่รองรับในปัจจุบันของทรัพยากรเป้าหมาย ไม่เช่นนั้น Apigee จะตอบกลับด้วย 502 Bad Gateway และรหัสข้อผิดพลาด protocol.http.Response405WithoutAllowHeader

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

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

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

การตรวจสอบ API

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

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

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

  6. เลือกเซลล์ที่มีรหัสข้อผิดพลาด protocol.http.Response405WithoutAllowHeader ดังที่แสดงด้านล่าง

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

  8. คลิกดูบันทึก แล้วขยายคำขอที่ล้มเหลวเพื่อดูข้อมูลเพิ่มเติม

  9. ดูรายละเอียดต่อไปนี้จากหน้าต่าง Logs
    • รหัสสถานะ: 502
    • แหล่งที่มาของข้อผิดพลาด: target
    • Fault Code: protocol.http.Response405WithoutAllowHeader
  10. หากแหล่งที่มาของข้อผิดพลาดคือ target และรหัสข้อผิดพลาดคือ protocol.http.Response405WithoutAllowHeader แสดงว่าเซิร์ฟเวอร์แบ็กเอนด์ตอบกลับด้วยรหัสสถานะ 405 Method Not Allowed โดยไม่มีส่วนหัว Allow

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

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

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

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

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

    การติดตามตัวอย่างด้านบนแสดงข้อผิดพลาดเป็น Received 405 Response without Allow Header เนื่องจากข้อผิดพลาดเกิดขึ้นโดย Apigee หลังจากที่ส่งคำขอไปยังเซิร์ฟเวอร์แบ็กเอนด์แล้ว จะบ่งบอกว่าเซิร์ฟเวอร์แบ็กเอนด์ส่งรหัสสถานะการตอบกลับ 405 โดยไม่มีส่วนหัว Allow

  7. ไปที่เฟส AX (บันทึกข้อมูล Analytics) ในการติดตามแล้วคลิกเลือกดังกล่าว
  8. เลื่อนลงไปที่ส่วน Error / Response Headers ในแผง Phase Details และระบุค่าของ X-Apigee-fault-code และ X-Apigee-fault-source ดังที่แสดงด้านล่าง

  9. คุณจะเห็นค่าของ X-Apigee-fault-code และ X-Apigee-fault-source เป็น protocol.http.Response405WithoutAllowHeader และtargetตามลำดับ ซึ่งบ่งบอกว่าข้อผิดพลาดนี้เกิดขึ้นเนื่องจากแบ็กเอนด์ส่งรหัสสถานะการตอบกลับ 405 โดยไม่มีส่วนหัว Allow
    ส่วนหัวการตอบกลับ ค่า
    X-Apigee-fault-code protocol.http.Response405WithoutAllowHeader
    X-Apigee-fault-source target

NGINX

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

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

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

    ที่ไหน จะแทนที่ ORG, ORG และ PORT# ด้วยค่าจริง

  3. ค้นหาเพื่อดูว่ามีข้อผิดพลาด 502 ที่มีรหัสข้อผิดพลาด protocol.http.Response405WithoutAllowHeader ในช่วงเวลาที่ระบุหรือไม่ (หากปัญหาเกิดขึ้นในอดีต) หรือมีคำขอใดที่ยังคงล้มเหลวด้วย 502
  4. หากพบข้อผิดพลาด 502 ที่มี X-Apigee-fault-code ตรงกับค่า protocol.http.Response405WithoutAllowHeader ให้ระบุค่าของ X-Apigee-fault-source

    ตัวอย่างข้อผิดพลาด 502 จากบันทึกการเข้าถึง NGINX

    ตัวอย่างรายการด้านบนจากบันทึกการเข้าถึง NGINX มีค่าต่อไปนี้สำหรับ X-Apigee- fault-code และ X-Apigee-fault-source

    ส่วนหัวการตอบกลับ ค่า
    X-Apigee-fault-code protocol.http.Response405WithoutAllowHeader
    X-Apigee-fault-source target

สาเหตุ: การตอบสนอง 405 โดยไม่มีส่วนหัวอนุญาตจากเซิร์ฟเวอร์แบ็กเอนด์

การวินิจฉัย

  1. กำหนด Fault Code และ Fault Source สำหรับ 502 Bad Gateway โดยใช้ API Monitoring, เครื่องมือติดตาม หรือบันทึกการเข้าถึง NGINX ตามที่อธิบายไว้ในขั้นตอนการวินิจฉัยทั่วไป
  2. หาก Fault Code คือ protocol.http.Response405WithoutAllowHeader และ Fault Source มีค่า target แสดงว่าเซิร์ฟเวอร์แบ็กเอนด์ตอบกลับด้วยรหัสสถานะ 405 โดยไม่มีส่วนหัว Allow ดังนั้น Apigee จึงตอบกลับด้วย 502 Bad Gateway ด้วยรหัสข้อผิดพลาด protocol.http.Response405WithoutAllowHeader

ความละเอียด

ใช้วิธีใดวิธีหนึ่งต่อไปนี้เพื่อแก้ปัญหา

เซิร์ฟเวอร์แบ็กเอนด์

ตัวเลือกที่ 1: แก้ไขเซิร์ฟเวอร์แบ็กเอนด์เพื่อส่งรหัสสถานะ 405 ที่มีส่วนหัว "อนุญาต"

  1. ตรวจสอบว่าเซิร์ฟเวอร์แบ็กเอนด์ปฏิบัติตามข้อกำหนด RFC 7231 ส่วน 6.5.5: 405 เมธอดไม่ได้รับอนุญาตเสมอ และส่งด้วยรหัสสถานะ 405 โดยรวมรายการเมธอดที่ได้รับอนุญาตเป็นส่วนหนึ่งของส่วนหัว Allow ดังที่แสดงด้านล่าง

    Allow: HTTP_METHODS
    
  2. เช่น หากเซิร์ฟเวอร์แบ็กเอนด์อนุญาตเมธอด GET, POST และ HEAD คุณต้องตรวจสอบว่าส่วนหัว Allow มีเมธอดดังนี้
    Allow: GET, POST, HEAD
    

การจัดการความผิดพลาด

ตัวเลือกที่ 2: ใช้การจัดการข้อผิดพลาดเพื่อส่งรหัสสถานะ 405 ที่มีส่วนหัวอนุญาตจากพร็อกซี API ดังนี้

หากเซิร์ฟเวอร์แบ็กเอนด์แสดงรหัสสถานะ 405 โดยไม่มีส่วนหัว Allow คุณสามารถใช้การจัดการข้อผิดพลาดเพื่อตอบกลับด้วยรหัสสถานะ 405 และส่วนหัว Allow จากพร็อกซี API ได้ดังนี้

  1. สร้างนโยบาย เช่น นโยบาย AssignMessage หรือนโยบาย RaiseFault และตั้งค่ารหัสสถานะเป็น 405 พร้อมส่วนหัว Allow และข้อความที่กำหนดเอง

    ตัวอย่างนโยบาย AssignMessage ที่จะส่ง 405 พร้อมส่วนหัว Allow มีดังนี้

    <AssignMessage async="false" continueOnError="false" enabled="true" name="AM-405WithAllowHeader">
        <DisplayName>AM-405WithAllowHeader</DisplayName>
        <Set>
            <Payload contentType="application/json">{"Specified method is not allowed. Please use one of the methods mentioned in the Allow header."}</Payload>
            <StatusCode>405</StatusCode>
            <ReasonPhrase>Method Not Allowed</ReasonPhrase>
        </Set>
        <Add>
            <Headers>
                <Header name="Allow">GET, POST, HEAD</Header>
            </Headers>
        </Add>
        <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
        <AssignTo createNew="false" transport="http" type="request"/>
    </AssignMessage>
    
  2. สร้าง FaultRule ใน TargetEndpoint ซึ่งจะเรียกใช้นโยบายเมื่อได้รับข้อผิดพลาด 502 ที่มีรหัสข้อผิดพลาด protocol.http.Response405WithoutAllowHeader

    ตัวอย่างการกำหนดค่า TargetEndpoint ที่แสดง FaultRule

    <TargetEndpoint name="default">
    ...
        <FaultRules>
           <FaultRule name="405WithoutAllowHeader">
                <Step>
                    <Name>AM-405WithAllowHeader</Name>
                </Step>
                <Condition>(fault.name = "Response405WithoutAllowHeader")</Condition>
            </FaultRule>
        </FaultRules>
    
  3. บันทึกการเปลี่ยนแปลงเหล่านี้ในพร็อกซี API รุ่นใหม่และทำให้การแก้ไขใช้งานได้
  4. ทำการเรียก API และยืนยันว่าคุณได้รับรหัสสถานะ 405 ที่มีส่วนหัว Allow

กําหนดค่าพร็อพเพอร์ตี้

ตัวเลือกที่ 3: กำหนดค่าพร็อพเพอร์ตี้ในตัวประมวลผลข้อความเพื่อป้องกันไม่ให้ Apigee Edge แสดงข้อผิดพลาด 502

  1. หากคุณเป็นผู้ใช้ Private Cloud คุณจะอัปเดตพร็อพเพอร์ตี้ HTTP.ignore.allow_header.for.405 เป็น true เพื่อป้องกันไม่ให้ Apigee Edge แจ้งข้อผิดพลาด 502 ได้ แม้ว่าเซิร์ฟเวอร์แบ็กเอนด์จะตอบกลับด้วยรหัสสถานะ 405 โดยไม่มีส่วนหัว Allow ก็ตาม โดยใช้คำแนะนำวิธีใช้ การกำหนดค่าส่วนหัวอนุญาตการละเว้นสำหรับพร็อพเพอร์ตี้ 405 ในเครื่องมือประมวลผลข้อความ
  2. หากคุณเป็น ผู้ใช้ระบบคลาวด์สาธารณะ โปรดติดต่อทีมสนับสนุนของ Apigee Edge

ข้อมูลจำเพาะ

Apigee คาดหวังการตอบสนอง 405 Method Not Allowed จากเซิร์ฟเวอร์แบ็กเอนด์ พร้อมด้วยส่วนหัว Allow ตามข้อกำหนดต่อไปนี้

ข้อมูลจำเพาะ
RFC 7231 ส่วน 6.5.5: 405 ไม่อนุญาตเมธอด
RFC 7231 ส่วน 7.4.1: อนุญาต

สิ่งสำคัญที่ควรทราบ

วิธีแก้ไขที่แนะนำคือแก้ไขเซิร์ฟเวอร์แบ็กเอนด์ให้ส่งรหัสสถานะ 405 พร้อมส่วนหัว Allow และปฏิบัติตามข้อกำหนด RFC 7231 ส่วน 6.5.5: 405 เมธอดไม่ได้รับอนุญาต

หากยังต้องการความช่วยเหลือจากทีมสนับสนุนของ Apigee ให้ไปที่หัวข้อ ต้องรวบรวมข้อมูลการวินิจฉัย

ต้องรวบรวมข้อมูลการวินิจฉัย

หากปัญหายังคงอยู่แม้ว่าจะทำตามวิธีการข้างต้นแล้ว ให้รวบรวมข้อมูลการวินิจฉัยต่อไปนี้ จากนั้นติดต่อฝ่ายสนับสนุนของ Apigee Edge

หากคุณเป็นผู้ใช้ระบบคลาวด์สาธารณะ โปรดระบุข้อมูลต่อไปนี้

  • ชื่อองค์กร
  • ชื่อสภาพแวดล้อม
  • ชื่อพร็อกซี API
  • ใช้คำสั่ง curl เพื่อทำซ้ำ 502 Bad Gateway ที่มีรหัสข้อผิดพลาด protocol.http.Response405WithoutAllowHeader
  • ไฟล์การติดตามสำหรับคำขอ API

หากคุณเป็นผู้ใช้ Private Cloud โปรดระบุข้อมูลต่อไปนี้

  • สังเกตข้อความแสดงข้อผิดพลาดสำหรับคำขอที่ไม่สำเร็จ
  • ชื่อสภาพแวดล้อม
  • ชุดพร็อกซี API
  • ไฟล์การติดตามสำหรับคำขอ API
  • บันทึกการเข้าถึง NGINX

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

    ที่ไหน จะแทนที่ ORG, ORG และ PORT# ด้วยค่าจริง

  • บันทึกระบบของผู้ประมวลผลข้อความ
    /opt/apigee/var/log/edge-message-processor/logs/system.log
    

รายการอ้างอิง

การจัดการข้อผิดพลาดใน Apigee