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 สาธารณะและ Private Cloud

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

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

การตรวจสอบ API

วิธีวินิจฉัยข้อผิดพลาดโดยใช้การตรวจสอบ API

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

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

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

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

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

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

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

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

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

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

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

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

  7. ไปที่ระยะ AX (Analytics Data Recorded) ในการติดตามและคลิก
  8. เลื่อนลงไปที่ส่วนข้อผิดพลาด / ส่วนหัวการตอบกลับในรายละเอียดระยะ และระบุ ของ 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. กำหนดรหัสข้อผิดพลาดและแหล่งที่มาของข้อผิดพลาดสำหรับ 502 Bad Gateway โดยใช้การตรวจสอบ API, เครื่องมือติดตาม หรือบันทึกการเข้าถึง NGINX ตามที่อธิบายไว้ใน ขั้นตอนการวิเคราะห์ทั่วไป
  2. หาก Fault Code คือ protocol.http.Response405WithoutAllowHeader และ แหล่งที่มาของข้อผิดพลาดมีค่า target ซึ่งบ่งชี้ว่าเซิร์ฟเวอร์แบ็กเอนด์มี ตอบกลับด้วยรหัสสถานะ 405 โดยไม่มีส่วนหัว Allow ดังนั้น Apigee จะตอบกลับด้วย 502 Bad Gateway ด้วยรหัสข้อผิดพลาด protocol.http.Response405WithoutAllowHeader

ความละเอียด

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

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

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

  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