503 ไม่สามารถใช้บริการได้ - การสร้างอุโมงค์พร็อกซีล้มเหลวด้วย 403

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

ลักษณะปัญหา

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

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

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

HTTP/1.1 503 Service Unavailable

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

{
   "fault":{
      "faultstring":"Proxy refused to create tunnel with response status 403",
      "detail":{
         "errorcode":"protocol.http.ProxyTunnelCreationFailed"
      }
   }
}

พร็อกซีแบบส่งต่อและการเชื่อมต่อผ่านพร็อกซี

Apigee Edge อนุญาตให้พร็อกซี API สื่อสารกับเซิร์ฟเวอร์แบ็กเอนด์ผ่านพร็อกซี เซิร์ฟเวอร์ตามที่อธิบายไว้ใน หัวข้อกำหนดค่าพร็อกซีแบบส่งต่อ พร็อกซีเซิร์ฟเวอร์จะเปิดการเชื่อมต่อที่ปลอดภัย (HTTPS) หรือไม่ปลอดภัย (HTTP) กับเซิร์ฟเวอร์แบ็กเอนด์ ทั้งนี้ขึ้นอยู่กับ ประเภทพร็อกซี (ระบุ โดยพร็อพเพอร์ตี้ HTTPClient.proxy.type) ที่ใช้ และโอนข้อมูล ในทั้ง 2 ทิศทาง ซึ่งเรียกกันว่าการเชื่อมต่อผ่านพร็อกซี

โดยค่าเริ่มต้น Apigee Edge จะใช้การเชื่อมต่อผ่านพร็อกซีสำหรับการรับส่งข้อมูลทั้งหมด หากต้องการปิดใช้การเชื่อมต่อผ่านพร็อกซี คุณต้องตั้งค่าพร็อพเพอร์ตี้ HTTPClient.use.tunneling เป็น false

รหัสข้อผิดพลาด: protocol.http.ProxyTunnelCreationFailed

Apigee Edge จะแสดงรหัสข้อผิดพลาด protocol.http.ProxyTunnelCreationFailed หาก พร็อกซีเซิร์ฟเวอร์สร้างการเชื่อมต่อผ่านพร็อกซีระหว่าง Apigee Edge กับเซิร์ฟเวอร์แบ็กเอนด์ไม่ได้เนื่องจาก ปัญหาต่างๆ เช่น ไฟร์วอลล์ ข้อจำกัด ACL (รายการควบคุมการเข้าถึง) ปัญหา DNS เซิร์ฟเวอร์แบ็กเอนด์ ไม่พร้อมใช้งาน การหมดเวลา เป็นต้น

รหัสสถานะใน faultstring ของการตอบกลับจาก Apigee Edge มักจะ บ่งบอกถึงสาเหตุระดับสูงที่อาจทำให้เกิดข้อผิดพลาดนี้

เทมเพลต Faultstring:

Proxy refused to create tunnel with response status STATUS_CODE

สาเหตุที่เป็นไปได้ของรหัสสถานะบางรายการที่พบใน Faultstring:

ตารางต่อไปนี้อธิบายสาเหตุที่เป็นไปได้โดยขึ้นอยู่กับรหัสสถานะที่ระบุใน faultstring

Faultstring คำอธิบาย
พร็อกซีปฏิเสธที่จะสร้างการเชื่อมต่อผ่านพร็อกซีโดยมีสถานะการตอบกลับ 403

403 - Forbidden

กรณีนี้อาจเกิดขึ้นเนื่องจากข้อจำกัดของไฟร์วอลล์หรือ ACL ที่กำหนดค่าไว้ใน เซิร์ฟเวอร์แบ็กเอนด์ซึ่งป้องกันไม่ให้มีการสร้างการเชื่อมต่อผ่านพร็อกซี

พร็อกซีปฏิเสธที่จะสร้างการเชื่อมต่อผ่านพร็อกซีโดยมีสถานะการตอบกลับ 503

503 - Service Unavailable

กรณีนี้อาจเกิดขึ้นเนื่องจากปัญหา DNS ข้อจำกัดของไฟร์วอลล์ เซิร์ฟเวอร์แบ็กเอนด์ ไม่พร้อมใช้งานซึ่งป้องกันไม่ให้มีการสร้างการเชื่อมต่อผ่านพร็อกซี

พร็อกซีปฏิเสธที่จะสร้างการเชื่อมต่อผ่านพร็อกซีโดยมีสถานะการตอบกลับ 504

504 - Gateway Timeout

กรณีนี้อาจเกิดขึ้นหากมีการหมดเวลาในระหว่างการสร้างการเชื่อมต่อผ่านพร็อกซี

คุณต้องใช้เทคนิคที่เหมาะสมเพื่อแก้ปัญหาโดยขึ้นอยู่กับรหัสสถานะที่พบใน faultstring เพลย์บุ๊กนี้อธิบายวิธีแก้ปัญหาหากคุณเห็น รหัสสถานะ 403 ใน faultstring สำหรับรหัสข้อผิดพลาด protocol.http.ProxyTunnelCreationFailed

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

ข้อผิดพลาดนี้ (รหัสสถานะ 403) เกิดขึ้นหากมีการกำหนดค่าข้อจำกัดของไฟร์วอลล์หรือ ACL (รายการควบคุมการเข้าถึง) ในเซิร์ฟเวอร์แบ็กเอนด์ซึ่งป้องกันไม่ให้พร็อกซีเซิร์ฟเวอร์สร้างการเชื่อมต่อผ่านพร็อกซีระหว่าง Apigee Edge กับเซิร์ฟเวอร์แบ็กเอนด์

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

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

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

เครื่องมือ Trace

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

  1. เปิดใช้เซสชัน Trace และ ทำอย่างใดอย่างหนึ่งต่อไปนี้:
    • รอให้เกิดข้อผิดพลาด หรือ
    • หากทำซ้ำปัญหาได้ ให้ทำการเรียก API เพื่อทำซ้ำปัญหา 503 Service Unavailable โดยมี Proxy refused to create tunnel with response status 403.
  2. ตรวจสอบว่าได้เปิดใช้แสดง FlowInfo ทั้งหมด แล้ว

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

    โปรดทราบข้อมูลต่อไปนี้

    ข้อผิดพลาด: Proxy refused to create tunnel with response status 403

  6. ไปที่ขั้นตอน AX (Analytics Data Recorded) ใน Trace แล้วคลิก
  7. เลื่อนลงไปที่ส่วนรายละเอียดขั้นตอน ส่วนหัวการตอบกลับ แล้ว กำหนดค่าของ X-Apigee-fault-code และ X-Apigee-fault-source ดัง ที่แสดงด้านล่าง:

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

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

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

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

NGINX

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

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

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

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

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

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

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

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

สาเหตุ: พร็อกซีปฏิเสธที่จะสร้างการเชื่อมต่อผ่านพร็อกซีโดยมีสถานะการตอบกลับ 403

การวินิจฉัย

  1. กำหนดรหัสข้อผิดพลาด และแหล่งที่มาของข้อผิดพลาด สำหรับ503 Service Unavailable โดยใช้เครื่องมือ Trace หรือบันทึกการเข้าถึง NGINX ตามที่อธิบายไว้ใน ขั้นตอนการวินิจฉัยทั่วไป
  2. ตรวจสอบข้อความแสดงข้อผิดพลาดและกำหนดรหัสสถานะ ที่ระบุใน faultstring สำหรับความล้มเหลวในการสร้างการเชื่อมต่อผ่านพร็อกซี
  3. ในสถานการณ์นี้ รหัสสถานะคือ 403 ซึ่งหมายถึง Forbidden
  4. ซึ่งหมายความว่าไม่มีสิทธิ์หรือสิทธิพิเศษเพียงพอที่จะสร้างการเชื่อมต่อผ่านพร็อกซี โดยปกติกรณีนี้อาจเกิดขึ้นหากมีข้อจำกัดของไฟร์วอลล์หรือ ACL (รายการควบคุมการเข้าถึง) ที่ป้องกันไม่ให้มีการสร้างการเชื่อมต่อผ่านพร็อกซี
  5. ตรวจสอบข้อจำกัดของไฟร์วอลล์และ/หรือ ACL ที่กำหนดค่าไว้ในเซิร์ฟเวอร์แบ็กเอนด์ซึ่ง อาจป้องกันไม่ให้มีการสร้างการเชื่อมต่อผ่านพร็อกซี
  6. คุณต้องแก้ไขปัญหาอย่างเหมาะสมโดยขึ้นอยู่กับประเภทของข้อจำกัดของไฟร์วอลล์และ/หรือ ACL
  7. มาดูตัวอย่างข้อจำกัดของไฟร์วอลล์เพื่ออธิบายวิธีแก้ปัญหาและแก้ไขปัญหานี้กัน

    สถานการณ์: ข้อจำกัดของไฟร์วอลล์ในเซิร์ฟเวอร์แบ็กเอนด์คาดหวังว่าส่วนหัวของโฮสต์ควรมี ชื่อโฮสต์ของเซิร์ฟเวอร์แบ็กเอนด์เสมอ

    คุณสามารถใช้วิธีใดวิธีหนึ่งต่อไปนี้เพื่อกำหนดส่วนหัวของโฮสต์ที่ Apigee Edge ส่ง

    Trace

    วิธีกำหนดส่วนหัวของโฮสต์โดยใช้ Trace

    1. ตรวจสอบว่า faultstring มี Proxy refused to create tunnel with response status 403 โดยใช้ Trace ตามที่อธิบายไว้ใน ขั้นตอนการวินิจฉัยทั่วไป
    2. ไปที่ขั้นตอนTarget Request Flow Started แล้วตรวจสอบ ส่วนหัวของคำขอ
    3. ตรวจสอบค่าของชื่อโฮสต์ที่ระบุในส่วนหัวของโฮสต์ ใน ส่วนหัวของคำขอ ส่วน
    4. หากส่วนหัว Host มีชื่อโฮสต์ของพร็อกซี นั่นคือสาเหตุของข้อผิดพลาดนี้
    5. เนื่องจากไฟร์วอลล์ได้รับการกำหนดค่าในเซิร์ฟเวอร์แบ็กเอนด์ให้ยอมรับคำขอเฉพาะในกรณีที่ ส่วนหัวของโฮสต์ มีชื่อ เซิร์ฟเวอร์แบ็กเอนด์
    6. ดังนั้นเมื่อพร็อกซีเซิร์ฟเวอร์พยายามสร้างการเชื่อมต่อผ่านพร็อกซีกับเซิร์ฟเวอร์แบ็กเอนด์ ระบบจะแสดงข้อผิดพลาด

      Proxy refused to create tunnel with response status 403

      ตัวอย่าง Trace ที่แสดงส่วนหัวของโฮสต์ที่มีชื่อโฮสต์ของพร็อกซี

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

      ในตัวอย่าง Trace ที่แสดงด้านบน จะเห็นว่าส่วนหัวของโฮสต์ มี ชื่อโฮสต์ของพร็อกซี www.proxyserver.com. เนื่องจากมี การกำหนดค่าข้อจำกัดของไฟร์วอลล์ในเซิร์ฟเวอร์แบ็กเอนด์ซึ่งคาดหวังให้มีเฉพาะ ชื่อโฮสต์ของเซิร์ฟเวอร์แบ็กเอนด์ใน ส่วนหัวของโฮสต์ คุณจึงได้รับ ข้อผิดพลาด Proxy refused to create tunnel with response status 403.

    tcpdump

    วิธีกำหนดส่วนหัวของโฮสต์โดยใช้ tcpdump

    1. บันทึก tcpdump ในพร็อกซีเซิร์ฟเวอร์สำหรับคำขอที่มาจาก คอมโพเนนต์ Message Processor ของ Apigee Edge ด้วยคำสั่งต่อไปนี้

      tcpdump -i any -s 0 host MP_IP_ADDRESS -w FILE_NAME
      

      ดูข้อมูลเพิ่มเติมเกี่ยวกับการใช้คำสั่ง tcpdump ได้ที่ tcpdump

    2. วิเคราะห์ข้อมูล tcpdump โดยใช้ เครื่องมือ Wireshark หรือเครื่องมือที่คล้ายกัน
    3. ตัวอย่างการวิเคราะห์ tcpdump โดยใช้ Wireshark มีดังนี้

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

    4. แพ็กเก็ตหมายเลข 13, 14 และ 15 แสดงว่า Message Processor กำลังสร้างการเชื่อมต่อกับพร็อกซีเซิร์ฟเวอร์ผ่านกระบวนการ TCP Handshake แบบ 3 ทาง
    5. ในแพ็กเก็ต 16 Message Processor ได้เชื่อมต่อกับโฮสต์ของพร็อกซี httpbin.org (แสดงในตัวอย่างด้านบน)
    6. เลือกแพ็กเก็ต 16 แล้วตรวจสอบเนื้อหาของแพ็กเก็ตโดยละเอียด โดยเฉพาะส่วนหัวของโฮสต์ ที่ Message Processor ส่งไปยังพร็อกซีเซิร์ฟเวอร์

    7. ตัวอย่างด้านบนแสดงส่วนหัวของโฮสต์ httpin.org ซึ่ง เป็นชื่อโฮสต์ของพร็อกซีเซิร์ฟเวอร์ ดังนั้น เมื่อพร็อกซีเซิร์ฟเวอร์พยายาม สร้างการเชื่อมต่อผ่านพร็อกซีกับเซิร์ฟเวอร์แบ็กเอนด์โดยส่งส่วนหัวของโฮสต์ httpin.orgด้านบน ระบบจะแสดงข้อผิดพลาดProxy refused to create tunnel with response status 403

ความละเอียด

สถานการณ์: ข้อจำกัดของไฟร์วอลล์ในพร็อกซีเซิร์ฟเวอร์คาดหวังว่าส่วนหัวของโฮสต์ควร มีชื่อโฮสต์ของเซิร์ฟเวอร์แบ็กเอนด์เสมอ

หากคุณตรวจสอบแล้วว่าข้อผิดพลาดนี้เกิดจากไฟร์วอลล์ในเซิร์ฟเวอร์แบ็กเอนด์ได้รับการกำหนดค่าให้คาดหวังว่าส่วนหัวของโฮสต์ ควรมีชื่อโฮสต์ของเซิร์ฟเวอร์แบ็กเอนด์เสมอ ในขณะที่ Message Processor ส่งชื่อโฮสต์ของพร็อกซีเซิร์ฟเวอร์ให้ทำตามขั้นตอนต่อไปนี้เพื่อแก้ไขปัญหา

  1. ตั้งค่าพร็อพเพอร์ตี้ use.proxy.host.header.with.target.uri เป็น "จริง" ใน TargetEndpoint ดังที่แสดงในตัวอย่างต่อไปนี้

    ตัวอย่างการกำหนดค่า TargetEndpoint:

    <TargetEndpoint name="default">
      <HTTPTargetConnection>
        <URL>https://mocktarget.apigee.net/json</URL>
        <Properties>
          <Property name="use.proxy.host.header.with.target.uri">true</Property>
        </Properties>
      </HTTPTargetConnection>
    </TargetEndpoint>
  2. ตรวจสอบว่าได้กำหนดค่าพร็อพเพอร์ตี้อื่นๆ ที่เกี่ยวข้องกับ พร็อกซีแบบส่งต่อ ใน Message Processor ดังนี้

    1. ตรวจสอบไฟล์ /opt/apigee/customer/application/message-processor.properties ใน Message Processor แต่ละรายการ
    2. ตรวจสอบว่าได้ตั้งค่าพร็อพเพอร์ตี้ต่อไปนี้ตามกรณีการใช้งานหรือข้อกำหนดของคุณ

      ค่าตัวอย่างสำหรับพร็อพเพอร์ตี้:

      conf_http_HTTPClient.use.proxy=true
      conf/http.properties+HTTPClient.proxy.type=HTTP
      conf/http.properties+HTTPClient.proxy.host=PROXY_SERVER_HOST_NAME
      conf/http.properties+HTTPClient.proxy.port=PORT_#
      conf/http.properties+HTTPClient.proxy.user=USERNAME
      conf/http.properties+HTTPClient.proxy.password=PASSWORD

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

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

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

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

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

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

  • บันทึกระบบของ Message Processor

    /opt/apigee/var/log/edge-message-processor/logs/system.log

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