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"
      }
   }
}

ส่งต่อพร็อกซีและอุโมงค์ข้อมูล

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, ความไม่พร้อมใช้งานของเซิร์ฟเวอร์แบ็กเอนด์, ระยะหมดเวลา ฯลฯ

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

เทมเพลตสตริงข้อผิดพลาด:

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 (รายการควบคุมการเข้าถึง) ที่กำหนดค่าไว้ในเซิร์ฟเวอร์แบ็กเอนด์ซึ่งป้องกันไม่ให้พร็อกซีเซิร์ฟเวอร์สร้างอุโมงค์ข้อมูลระหว่าง Apigee Edge กับเซิร์ฟเวอร์แบ็กเอนด์

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

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

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

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

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

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

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

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

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

  6. ไปที่เฟส AX (บันทึกข้อมูล Analytics) ในการติดตามแล้วคลิกเลือกดังกล่าว
  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 ตรงกับค่าของX-Apigee-fault-code ให้ระบุค่าของ X-Apigee-fault-code

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

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

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

    Trace

    ในการกำหนดส่วนหัวของโฮสต์โดยใช้ 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 หรือเครื่องมือที่คล้ายกัน
    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

ความละเอียด

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

ถ้าคุณยืนยันแล้วว่าข้อผิดพลาดนี้เกิดขึ้นเนื่องจากมีการกำหนดค่าไฟร์วอลล์ในเซิร์ฟเวอร์แบ็กเอนด์โดยคาดว่าส่วนหัวของโฮสต์ควรมีชื่อโฮสต์ของเซิร์ฟเวอร์backendเสมอ ขณะที่ผู้ประมวลผลข้อความกำลังส่งชื่อโฮสต์ของ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
    

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