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

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

ลักษณะปัญหา

แอปพลิเคชันไคลเอ็นต์ได้รับรหัสสถานะ 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 Method Not Allowed เซิร์ฟเวอร์ต้นทาง ต้องสร้างและส่งฟิลด์ส่วนหัว Allow ในการตอบกลับ 405 ซึ่งมี รายการเมธอดที่ทรัพยากรเป้าหมายรองรับในปัจจุบัน หากไม่เป็นเช่นนั้น Apigee จะตอบกลับด้วย 502 Bad Gateway และรหัสข้อผิดพลาด protocol.http.Response405WithoutAllowHeader

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

ขั้นตอนการวินิจฉัยที่พบบ่อย

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

การตรวจสอบ API

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

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

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

  6. เลือกเซลล์ที่มี Fault Code เป็น protocol.http.Response405WithoutAllowHeader ดังที่แสดงด้านล่าง

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

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

  9. จากหน้าต่างบันทึก ให้จดรายละเอียดต่อไปนี้
    • รหัสสถานะ: 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) ในการติดตาม แล้วคลิก
  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 จากเซิร์ฟเวอร์แบ็กเอนด์โดยไม่มีส่วนหัว Allow

การวินิจฉัย

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

ความละเอียด

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

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

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

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

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

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

ตัวเลือกที่ 2: ใช้การจัดการข้อผิดพลาดเพื่อส่งรหัสสถานะ 405 พร้อมส่วนหัว Allow จาก 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: กำหนดค่าพร็อพเพอร์ตี้ใน Message Processor เพื่อป้องกันไม่ให้ Apigee Edge แสดงข้อผิดพลาด 502

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

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

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

ข้อมูลจำเพาะ
RFC 7231 ส่วนที่ 6.5.5: 405 Method Not Allowed
RFC 7231 ส่วนที่ 7.4.1: Allow

ประเด็นสำคัญที่ควรทราบ

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

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

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

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

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

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

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

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

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

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

  • บันทึกของระบบ Message Processor
    /opt/apigee/var/log/edge-message-processor/logs/system.log

ข้อมูลอ้างอิง

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