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

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

ลักษณะปัญหา

แอปพลิเคชันไคลเอ็นต์ได้รับรหัสสถานะ 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"
      }
   }
}

ส่งต่อพร็อกซีและ Tunnel

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

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

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

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

โดยทั่วไปแล้ว รหัสสถานะใน faultstring ของการตอบกลับจาก Apigee Edge จะระบุสาเหตุระดับสูงที่เป็นไปได้ที่ทำให้เกิดข้อผิดพลาดนี้

เทมเพลต Faultstring:

Proxy refused to create tunnel with response status STATUS_CODE

สาเหตุที่เป็นไปได้สำหรับรหัสสถานะบางส่วนที่พบใน faultstring

ตารางต่อไปนี้อธิบายสาเหตุที่เป็นไปได้ตามรหัสสถานะที่ระบุไว้ใน faultstring:

แฟ้ม คำอธิบาย
พร็อกซีปฏิเสธการสร้างอุโมงค์ข้อมูลที่มีสถานะการตอบสนอง 403

403 - Forbidden

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

พร็อกซีปฏิเสธการสร้างอุโมงค์ข้อมูลที่มีสถานะการตอบสนอง 503

503 - Service Unavailable

ซึ่งอาจเกิดจากปัญหาของ DNS, ข้อจำกัดของไฟร์วอลล์, ความไม่พร้อมใช้งานที่ป้องกันการสร้างอุโมงค์ข้อมูล

พร็อกซีปฏิเสธการสร้างอุโมงค์ข้อมูลที่มีสถานะการตอบกลับ 504

504 - Gateway Timeout

ปัญหานี้อาจเกิดขึ้นได้หากมีระยะหมดเวลาระหว่างการสร้างอุโมงค์ข้อมูล

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

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

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

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

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

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

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

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

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

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

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

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

  6. ไปที่ระยะ AX (Analytics Data Recorded) ในการติดตามและคลิก
  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 โดยใช้เครื่องมือติดตามหรือบันทึกการเข้าถึง NGINX ตามที่อธิบายไว้ใน ขั้นตอนการวิเคราะห์ทั่วไป
  2. ตรวจสอบข้อความแสดงข้อผิดพลาดและหารหัสสถานะ ระบุไว้ใน faultstring สำหรับความล้มเหลวในการสร้างอุโมงค์ข้อมูล
  3. ในสถานการณ์นี้ รหัสสถานะคือ 403 ซึ่งหมายความว่าห้าม
  4. ซึ่งหมายความว่ามีสิทธิ์หรือสิทธิ์ไม่เพียงพอที่จะสร้างอุโมงค์ข้อมูล การดำเนินการนี้อาจ มักจะเกิดขึ้นเมื่อมีข้อจำกัดด้านไฟร์วอลล์หรือ ACL (รายการควบคุมการเข้าถึง) ป้องกันการสร้างอุโมงค์ข้อมูล
  5. ตรวจสอบข้อจำกัดของไฟร์วอลล์และ/หรือ ACL ที่กำหนดค่าในเซิร์ฟเวอร์แบ็กเอนด์ซึ่ง อาจขัดขวางการสร้างอุโมงค์ข้อมูล
  6. คุณต้องแก้ไขปัญหา ทั้งนี้ขึ้นอยู่กับประเภทของไฟร์วอลล์และ/หรือข้อจำกัดของ ACL อย่างเหมาะสม
  7. ลองมาดูตัวอย่างการจำกัดไฟร์วอลล์ เพื่ออธิบายวิธีแก้ปัญหา ปัญหา:

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

    คุณจะใช้วิธีใดวิธีหนึ่งต่อไปนี้ในการระบุส่วนหัวของโฮสต์ที่ส่งโดย Apigee Edge ได้

    Trace

    ในการระบุส่วนหัวของโฮสต์โดยใช้การติดตาม ให้ทำดังนี้

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

      Proxy refused to create tunnel with response status 403

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

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

      ในการติดตามตัวอย่างที่แสดงด้านบน จะแสดงว่าส่วนหัวของโฮสต์มี ชื่อของโฮสต์พร็อกซี 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 หรือเครื่องมือที่คล้ายกัน ของ Google
    3. ต่อไปนี้เป็นตัวอย่างการวิเคราะห์ของ tcpdump โดยใช้ Wireshark

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

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

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

ความละเอียด

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

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

  1. ตั้งค่าพร็อพเพอร์ตี้ use.proxy.host.header.with.target.uri เป็น true ใน 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. ตรวจสอบว่าพร็อพเพอร์ตี้อื่นๆ ที่เกี่ยวข้องกับ พร็อกซีการส่งต่อได้รับการกำหนดค่าในเครื่องมือประมวลผลข้อความดังนี้

    1. ตรวจสอบไฟล์ /opt/apigee/customer/application/message-processor.properties ในตัวประมวลผลข้อความแต่ละตัว
    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 ให้ระบุข้อมูลต่อไปนี้

  • พบข้อความแสดงข้อผิดพลาดทั้งหมดสำหรับคำขอที่ล้มเหลว
  • ชื่อสภาพแวดล้อม
  • แพ็กเกจพร็อกซี 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
    

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