504 เกตเวย์หมดเวลา - หมดเวลาของเราเตอร์

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

ลักษณะปัญหา

แอปพลิเคชันไคลเอ็นต์จะได้รับรหัสสถานะ HTTP เป็น 504 พร้อมข้อความ Gateway Timeout เพื่อตอบกลับการเรียก API

การตอบกลับข้อผิดพลาดนี้บ่งบอกว่าไคลเอ็นต์ไม่ได้รับการตอบกลับอย่างทันท่วงทีจาก Apigee Edge หรือเซิร์ฟเวอร์แบ็กเอนด์ขณะดำเนินการเรียก API

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

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

HTTP/1.1 504 Gateway Time-out

เมื่อเรียกพร็อกซีดังกล่าวโดยใช้ cURL หรือเว็บเบราว์เซอร์ คุณอาจได้รับข้อผิดพลาดต่อไปนี้

<!DOCTYPE html>
<html>
<head>
<title>Error</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>An error occurred.</h1>
<p>Sorry, the page you are looking for is currently unavailable.<br/>
Please try again later.</p>
</body>
</html>

การหมดเวลาเกิดจากอะไร

เส้นทางทั่วไปสำหรับคำขอ API ผ่านแพลตฟอร์ม Edge คือไคลเอ็นต์ > เราเตอร์ > ผู้ประมวลผลข้อความ > เซิร์ฟเวอร์แบ็กเอนด์ ดังที่แสดงในรูปต่อไปนี้

คอมโพเนนต์ทั้งหมดในโฟลว์รันไทม์ของ Apigee Edge ซึ่งรวมถึงไคลเอ็นต์ เราเตอร์ ตัวประมวลผลข้อความ และเซิร์ฟเวอร์แบ็กเอนด์จะได้รับการตั้งค่าระยะหมดเวลาเริ่มต้นที่เหมาะสมเพื่อให้แน่ใจว่าคำขอ API จะไม่ใช้เวลานานเกินไป หากคอมโพเนนต์ใดในโฟลว์ไม่ได้รับการตอบสนองจากคอมโพเนนต์อัปสตรีมภายในระยะเวลาที่ระบุไว้ในการกำหนดค่าระยะหมดเวลา คอมโพเนนต์นั้นจะใช้งานไม่ได้และมักจะแสดงข้อผิดพลาด 504 Gateway Timeout

Playbook นี้อธิบายวิธีแก้ปัญหาและข้อผิดพลาด 504 ที่เกิดขึ้นเมื่อเราเตอร์หมดเวลา

หมดเวลาบนเราเตอร์

ระยะหมดเวลาเริ่มต้นที่กำหนดค่าไว้บนเราเตอร์ใน Apigee Edge คือ 57 วินาที นี่คือระยะเวลาสูงสุดที่พร็อกซี API จะทำงานได้นับตั้งแต่เวลาที่ได้รับคำขอ API ใน Edge จนกว่าจะมีการส่งการตอบกลับ รวมถึงการตอบกลับแบ็กเอนด์และนโยบายทั้งหมดที่ดำเนินการ คุณลบล้างระยะหมดเวลาเริ่มต้นได้ในเราเตอร์/โฮสต์เสมือนตามที่อธิบายไว้ใน การกำหนดค่าระยะหมดเวลาของ I/O บนเราเตอร์

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

ใน Edge สาเหตุทั่วไปของข้อผิดพลาด 504 Gateway Timeout ที่เกิดจากการหมดเวลาของเราเตอร์ ได้แก่

สาเหตุ คำอธิบาย วิธีการแก้ปัญหาที่ใช้กับ
การกำหนดค่าการหมดเวลาบนเราเตอร์ไม่ถูกต้อง กรณีนี้จะเกิดขึ้นหากมีการกำหนดค่าเราเตอร์ด้วยระยะหมดเวลา I/O ไม่ถูกต้อง ผู้ใช้ Edge Public และ Private Cloud

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

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

  • การตรวจสอบ API
  • บันทึกการเข้าถึง NGINX

การตรวจสอบ API

วิธีวินิจฉัยข้อผิดพลาดโดยใช้ API Monitoring

  1. ไปที่หน้าวิเคราะห์ > การตรวจสอบ API > ตรวจสอบ
  2. กรองหาข้อผิดพลาด 5xx รายการและเลือกกรอบเวลา
  3. พล็อตรหัสสถานะเทียบกับเวลา
  4. คลิกเซลล์ที่แสดงข้อผิดพลาด 504 รายการเพื่อดูรายละเอียดเพิ่มเติมและดูบันทึกเกี่ยวกับข้อผิดพลาดเหล่านี้ตามที่แสดงด้านล่าง

    ตัวอย่างที่แสดงข้อผิดพลาด 504

  5. ในแผงด้านขวา ให้คลิกดูบันทึก

    จากหน้าต่างบันทึกการรับส่งข้อมูล ให้สังเกตรายละเอียดต่อไปนี้สำหรับข้อผิดพลาด 504 บางอย่าง

    • คำขอ: จะระบุเมธอดคำขอและ URI ที่ใช้สำหรับการเรียก
    • เวลา การตอบกลับ: ข้อมูลเวลาทั้งหมดที่ใช้สำหรับคำขอ

    ในตัวอย่างด้านบน

    • คำขอ กำลังชี้ไปยัง GET /test-timeout
    • เวลาในการตอบสนอง เท่ากับ 57.001 วินาที ซึ่งหมายความว่าเราเตอร์หมดเวลาก่อนที่ผู้ประมวลผลข้อความจะตอบกลับได้ เนื่องจากค่านั้นใกล้เคียงกับระยะหมดเวลาของ I/O เริ่มต้นบนเราเตอร์เป็นอย่างมาก ซึ่งก็คือ 57 วินาที

    นอกจากนี้ คุณยังดูบันทึกทั้งหมดได้โดยใช้ API GET บันทึก API ของ Monitoring เช่น การค้นหาบันทึกสำหรับ org, env, timeRange และ status จะทำให้คุณดาวน์โหลดบันทึกทั้งหมดสำหรับธุรกรรมที่ไคลเอ็นต์หมดเวลาได้

    เนื่องจาก API Monitoring ตั้งค่าพร็อกซีเป็น - (not set) สำหรับข้อผิดพลาด 504 เหล่านี้ คุณจึงใช้ API (Logs API) เพื่อรับพร็อกซีที่เกี่ยวข้องสำหรับโฮสต์เสมือนและเส้นทางได้

    For example :

    curl "https://apimonitoring.enterprise.apigee.com/logs/apiproxies?org=ORG&env=ENV&select=https
    
  6. ตรวจสอบเวลาในการตอบสนองสำหรับข้อผิดพลาด 504 เพิ่มเติม และดูว่าเวลาในการตอบกลับสอดคล้องกันหรือไม่ (ค่าระยะหมดเวลา I/O ที่กำหนดไว้ในเราเตอร์คือ 57 วินาที) สำหรับข้อผิดพลาด 504 ทั้งหมด

บันทึกการเข้าถึง NGINX

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

  1. ตรวจสอบบันทึกการเข้าถึง NGINX ดังนี้
    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
  2. ค้นหาเพื่อดูว่ามีข้อผิดพลาด 504 ใดๆ ในช่วงเวลาที่ระบุหรือไม่ (หากเกิดปัญหาในอดีต) หรือมีคำขอใดที่ยังคงล้มเหลวด้วย 504
  3. โปรดทราบข้อมูลต่อไปนี้สำหรับข้อผิดพลาด 504 บางรายการ
    • ระยะเวลาการตอบกลับ
    • URI คำขอ

    ในตัวอย่างนี้ เราจะเห็นข้อมูลต่อไปนี้

    • เวลาคำขอ: 57.001 วินาที ซึ่งบ่งบอกว่าเราเตอร์หมดเวลาหลังจากผ่านไป 57.001 วินาที

    • คำขอ: GET /test-timeout
    • ชื่อแทนโฮสต์: myorg-test.apigee.net
  4. ตรวจสอบว่าเวลาคำขอตรงกับระยะหมดเวลาของ I/O ที่กำหนดค่าไว้บนเราเตอร์/โฮสต์เสมือนหรือไม่ ถ้าใช่ แสดงว่าเราเตอร์หมดเวลาก่อนที่ผู้ประมวลผลข้อความจะไม่ตอบกลับภายในระยะเวลานี้

    ในตัวอย่างรายการบันทึกการเข้าถึง NGINX ที่แสดงด้านบน เวลาคำขอของ 57.001 วินาทีใกล้เคียงกับระยะหมดเวลาเริ่มต้นของ I/O บนเราเตอร์เป็นอย่างมาก ซึ่งเป็นการระบุอย่างชัดเจนว่าเราเตอร์หมดเวลาก่อนที่ผู้ประมวลผลข้อความจะตอบกลับได้

  5. กำหนดพร็อกซี API ที่ส่งคำขอโดยใช้เส้นทางฐานในช่องคำขอ

สาเหตุ: การกำหนดค่าการหมดเวลาบนเราเตอร์ไม่ถูกต้อง

การวินิจฉัย

  1. พิจารณาว่าข้อผิดพลาด 504 เกิดขึ้นเนื่องจากเราเตอร์หมดเวลาก่อนที่ผู้ประมวลผลข้อความจะตอบกลับได้หรือไม่ ซึ่งทำได้โดยตรวจสอบว่าเวลาในการตอบสนองในการตรวจสอบ API/เวลาคำขอ ในเราเตอร์ (ทั้ง 2 ช่องแสดงข้อมูลเดียวกัน แต่เรียกใช้ด้วยชื่อต่างกัน) เหมือนกับระยะหมดเวลา I/O ที่กำหนดค่าบนเราเตอร์/โฮสต์เสมือน และในช่องต้นทางของข้อผิดพลาด พร็อกซีของข้อผิดพลาด และโค้ดข้อผิดพลาด GINX ที่มีคำอธิบายใน - โดยใช้บันทึกการเข้าถึง API ของการตรวจสอบหรือ N/O
  2. ตรวจสอบว่าค่าระยะหมดเวลา I/O ที่กำหนดค่าไว้บนเราเตอร์หรือโฮสต์เสมือนต่ำกว่าเมื่อเทียบกับที่กำหนดค่าไว้ในโปรแกรมประมวลผลข้อความหรือพร็อกซี API ที่ระบุ

    ซึ่งทำได้โดยทำตามขั้นตอนต่างๆ ในส่วนนี้

การยืนยันการหมดเวลา I/O บนโฮสต์เสมือน

UI ของ Edge

วิธีตรวจสอบระยะหมดเวลาของโฮสต์เสมือนโดยใช้ Edge UI

  1. เข้าสู่ระบบ Edge UI
  2. ไปที่ผู้ดูแลระบบ > โฮสต์เสมือน
  3. เลือกสภาพแวดล้อมเฉพาะที่คุณประสบปัญหาการหมดเวลา
  4. เลือกโฮสต์เสมือนที่คุณต้องการยืนยันค่าระยะหมดเวลา I/O
  5. ในส่วนคุณสมบัติ ให้ดูค่าหมดเวลาอ่านพร็อกซีเป็นวินาที

    ในตัวอย่างข้างต้น ระยะหมดเวลาของการอ่านพร็อกซี ได้รับการกำหนดค่าด้วยค่า 120 ซึ่งหมายความว่าระยะหมดเวลา I/O ที่กำหนดค่าไว้บนโฮสต์เสมือนนี้คือ 120 วินาที

API การจัดการ

นอกจากนี้ คุณยังสามารถยืนยัน ระยะหมดเวลาการอ่านพร็อกซี โดยใช้ API การจัดการต่อไปนี้

  1. เรียกใช้ API รับโฮสต์เสมือนเพื่อรับการกำหนดค่า virtualhost ดังที่แสดงด้านล่าง

    ผู้ใช้ระบบคลาวด์สาธารณะ

    curl -v -X GET https://api.enterprise.apigee.com/v1/organizations/ORGANIZATION_NAME/environments/ENVIRONMENT_NAME/virtualhosts/VIRTUALHOST_NAME -u USERNAME
    

    ผู้ใช้ Private Cloud

    curl -v -X GET http://MANAGEMENT_SERVER_HOST:PORT#/v1/organizations/ORGANIZATION_NAME/environments/v/virtualhosts/VIRTUALHOST_NAME -u USERNAME
    

    โดยที่

    ORGANIZATION_NAME คือชื่อองค์กร

    ENVIRONMENT_NAME คือชื่อสภาพแวดล้อม

    VIRTUALHOST_NAME คือชื่อของโฮสต์เสมือน

  2. ตรวจสอบค่าที่กำหนดค่าไว้สำหรับพร็อพเพอร์ตี้ proxy_read_timeout

    ตัวอย่างคำจำกัดความของโฮสต์เสมือน

    {
      "hostAliases": [
        "api.myCompany,com",
      ],
      "interfaces": [],
      "listenOptions": [],
      "name": "secure",
      "port": "443",
      "retryOptions": [],
      "properties": {
        "property": [
          {
            "name": "proxy_read_timeout",
            "value": "120"
          }
        ]
      },
      "sSLInfo": {
        "ciphers": [],
        "clientAuthEnabled": "false",
        "enabled": "true",
        "ignoreValidationErrors": false,
        "keyAlias": "myCompanyKeyAlias",
        "keyStore": "ref://myCompanyKeystoreref",
        "protocols": []
      },
      "useBuiltInFreeTrialCert": false
    }
    

    ในตัวอย่างข้างต้น proxy_read_timeout ได้รับการกำหนดค่าด้วยค่า 120 ซึ่งหมายความว่าระยะหมดเวลา I/O ที่กำหนดค่าไว้บนโฮสต์เสมือนนี้คือ 120 วินาที

การยืนยันการหมดเวลา I/O ในไฟล์ Router.properties

  1. เข้าสู่ระบบเครื่องเราเตอร์
  2. ค้นหาพร็อพเพอร์ตี้ proxy_read_timeout ในไดเรกทอรี /opt/nginx/conf.d และตรวจสอบว่ามีการตั้งค่าด้วยค่าใหม่หรือไม่ ดังนี้
    grep -ri "proxy_read_timeout" /opt/nginx/conf.d
    
  3. ตรวจสอบชุดค่าสำหรับพร็อพเพอร์ตี้ proxy_read_timeout ในไฟล์การกำหนดค่าโฮสต์เสมือนที่เฉพาะเจาะจง

    ผลลัพธ์ตัวอย่างจากคำสั่ง grep

    /opt/nginx/conf.d/0-default.conf:proxy_read_timeout 57;
    /opt/nginx/conf.d/0-edge-health.conf:proxy_read_timeout 1s;
    

    ในตัวอย่างเอาต์พุตด้านบน ให้สังเกตว่ามีการตั้งค่าพร็อพเพอร์ตี้ proxy_read_timeout ด้วยค่าใหม่ 57 ใน 0-default.conf ซึ่งเป็นไฟล์การกำหนดค่าสำหรับโฮสต์เสมือนเริ่มต้น ซึ่งหมายความว่ามีการกำหนดค่าระยะหมดเวลา I/O เป็น 57 วินาทีบนเราเตอร์สำหรับโฮสต์เสมือนเริ่มต้น หากมีโฮสต์เสมือนหลายรายการ คุณจะเห็นข้อมูลนี้สำหรับแต่ละโฮสต์ รับค่าของ proxy_read_timeout สำหรับโฮสต์เสมือนที่คุณใช้สำหรับการเรียก API ซึ่งล้มเหลวโดยมีข้อผิดพลาด 504

การยืนยันการหมดเวลาของ I/O ในพร็อกซี API

คุณสามารถดูระยะหมดเวลาของ I/O ได้ในส่วนต่อไปนี้

  • ปลายทางเป้าหมายของพร็อกซี API
  • นโยบาย ServiceAPI ของพร็อกซี API
ดูการหมดเวลา I/O ในปลายทางเป้าหมายของพร็อกซี API
  1. ใน Edge UI ให้เลือกพร็อกซี API เฉพาะที่คุณต้องการดูค่าระยะหมดเวลา I/O
  2. เลือกปลายทางเป้าหมายที่ต้องการตรวจสอบ
  3. ดูพร็อพเพอร์ตี้ io.timeout.millis พร้อมค่าที่เหมาะสมภายใต้องค์ประกอบ <HTTPTargetConnection> ในการกำหนดค่า TargetEndpoint

    ตัวอย่างเช่น ระยะหมดเวลา I/O ในโค้ดต่อไปนี้จะตั้งเป็น 120 วินาที

    <Properties>
      <Property name="io.timeout.millis">120000</Property>
    </Properties>
    
ดูการหมดเวลา I/O ในนโยบาย ServiceAPI ของพร็อกซี API
  1. ใน Edge UI ให้เลือกพร็อกซี API เฉพาะที่คุณต้องการดูค่าระยะหมดเวลา I/O ใหม่สำหรับนโยบาย ServiceAPI
  2. เลือกนโยบาย ServiceAPI ที่ต้องการตรวจสอบ
  3. ดูองค์ประกอบ <Timeout> พร้อมค่าที่เหมาะสมภายใต้การกำหนดค่า <ServiceCallout>

    ตัวอย่างเช่น ระยะหมดเวลา I/O ของโค้ดต่อไปนี้จะเป็น 120 วินาที

    <Timeout>120000</Timeout>
    

การยืนยันการหมดเวลา I/O บนตัวประมวลผลข้อความ

  1. เข้าสู่ระบบเครื่องประมวลผลข้อความ
  2. ค้นหาพร็อพเพอร์ตี้ HTTPTransport.io.timeout.millis ในไดเรกทอรี /opt/apigee/edge-message-processor/conf โดยใช้คำสั่งต่อไปนี้

    grep -ri "HTTPTransport.io.timeout.millis" /opt/apigee/edge-message-processor/conf
    

    ตัวอย่างเอาต์พุต

    /opt/apigee/edge-message-processor/conf/http.properties:HTTPTransport.io.timeout.millis=55000
    
  3. ในตัวอย่างเอาต์พุตด้านบน ให้สังเกตว่ามีการตั้งค่าพร็อพเพอร์ตี้ HTTPTransport.io.timeout.millis ด้วยค่า 55000 ใน http.properties ซึ่งบ่งบอกว่ามีการกำหนดค่าระยะหมดเวลา I/O เป็น 55 วินาทีในตัวประมวลผลข้อความสำเร็จแล้ว

เมื่อคุณระบุระยะหมดเวลาที่กำหนดค่าบนเราเตอร์และเครื่องมือประมวลผลข้อความแล้ว ให้ตรวจสอบว่ามีการกำหนดค่าเราเตอร์/โฮสต์เสมือนด้วยค่าระยะหมดเวลาที่ต่ำลงเมื่อเทียบกับค่าบนพร็อกซีข้อความ/API

จดบันทึกค่าที่ตั้งไว้ในเลเยอร์ทั้งหมดดังที่แสดงในตารางด้านล่าง

หมดเวลาบนเราเตอร์ (วินาที) หมดเวลาในโฮสต์เสมือน (วินาที) ระยะหมดเวลาสำหรับตัวประมวลผลข้อความ (วินาที) หมดเวลาเมื่อพร็อกซี API (วินาที)
57 - 55 120

ในตัวอย่างนี้

  • เราเตอร์คือค่าเริ่มต้น 57 วินาที
  • ไม่ได้ตั้งค่าระยะหมดเวลาบนโฮสต์เสมือนที่เจาะจง ซึ่งหมายความว่าจะใช้ค่าเริ่มต้น 57 วินาทีที่กำหนดค่าบนเราเตอร์
  • ในเครื่องมือประมวลผลข้อความ ระบบจะกำหนดค่าเริ่มต้นไว้ที่ 55 วินาที
  • แต่ในพร็อกซี API ที่เฉพาะเจาะจง จะมีการกําหนดค่าเป็น 120 วินาที

โปรดทราบว่าค่าระยะหมดเวลาที่สูงกว่าจะได้รับการกำหนดค่าในพร็อกซี API เท่านั้น แต่เราเตอร์จะยังคงกำหนดค่าที่ 57 วินาที ดังนั้น เราเตอร์จะหมดเวลาที่ 57 วินาที ขณะที่ตัวประมวลผล/แบ็กเอนด์ข้อความยังคงประมวลผลคำขอของคุณ ซึ่งจะทำให้เราเตอร์ตอบกลับโดยมีข้อผิดพลาด 504 Gateway Timeout รายการในแอปพลิเคชันไคลเอ็นต์

ความละเอียด

โปรดทำตามขั้นตอนต่อไปนี้เพื่อกำหนดค่าการหมดเวลา I/O ที่เหมาะสมบนเราเตอร์และเครื่องมือประมวลผลข้อความเพื่อแก้ไขปัญหานี้

  1. ดู แนวทางปฏิบัติแนะนำสำหรับการกำหนดค่าระยะหมดเวลาของ I/O เพื่อทำความเข้าใจว่าควรตั้งค่าระยะหมดเวลาเท่าใดในคอมโพเนนต์ต่างๆ ที่เกี่ยวข้องกับโฟลว์คำขอ API ผ่าน Apigee Edge
  2. ในตัวอย่างข้างต้น ถ้าคุณมั่นใจว่าต้องตั้งค่าระยะหมดเวลาที่สูงขึ้นเนื่องจากเซิร์ฟเวอร์แบ็กเอนด์ใช้เวลานานกว่าปกติ และได้เพิ่มค่าระยะหมดเวลาของโปรแกรมประมวลผลข้อความเป็น 120 วินาทีแล้ว ให้กำหนดค่าระยะหมดเวลาที่สูงขึ้น เช่น 123 seconds บนเราเตอร์ หากต้องการหลีกเลี่ยงผลกระทบต่อพร็อกซี API ทั้งหมดเนื่องจากค่าระยะหมดเวลาใหม่ ให้กำหนดค่า 123 seconds เฉพาะในโฮสต์เสมือนที่ใช้ในพร็อกซี API ที่ระบุ
  3. ทำตามวิธีการใน การกำหนดค่าระยะหมดเวลาของ I/O บนเราเตอร์ เพื่อตั้งค่าระยะหมดเวลาบนโฮสต์เสมือน