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 สาธารณะและ Private Cloud

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

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

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

การตรวจสอบ API

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

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

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

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

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

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

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

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

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

    เนื่องจากการตรวจสอบ API ตั้งค่าพร็อกซีเป็น - (not set) สำหรับ 504 เหล่านี้ คุณสามารถใช้ API (บันทึก 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 ที่มีการส่งคำขอโดยใช้เส้นทางฐานใน Request

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

การวินิจฉัย

  1. ตรวจสอบว่าข้อผิดพลาด 504 เกิดจากการที่เราเตอร์หมดเวลาก่อน โปรแกรมประมวลผลข้อความสามารถตอบกลับได้ โดยตรวจสอบว่า เวลาตอบกลับใน API Monitoring/เวลาของคำขอในเราเตอร์ (ทั้ง 2 ช่อง แสดงข้อมูลเดียวกัน แต่เรียกด้วยชื่อที่ต่างกัน) จะเหมือนกับ การหมดเวลา I/O ที่กำหนดค่าบนเราเตอร์/โฮสต์เสมือนและช่อง Fault Source, Fault มีการตั้งค่าพร็อกซีและรหัสข้อผิดพลาดเป็น - โดยใช้การตรวจสอบ API หรือการเข้าถึง NGINX ตามที่อธิบายไว้ใน ขั้นตอนการวิเคราะห์ทั่วไป
  2. ตรวจสอบว่าค่าระยะหมดเวลา I/O ที่กำหนดค่าไว้บนเราเตอร์หรือโฮสต์เสมือนบางรายการคือ lower เมื่อเทียบกับที่กำหนดค่าไว้ใน Message Processor หรือพร็อกซี 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 ในไฟล์เราเตอร์.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
  • นโยบาย Serviceข้อความไฮไลต์ ของพร็อกซี 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 ในนโยบาย Serviceข้อความไฮไลต์ ของพร็อกซี API
  1. ใน Edge UI ให้เลือกพร็อกซี API ที่คุณต้องการดู I/O ใหม่ ค่าระยะหมดเวลาสำหรับนโยบาย Serviceข้อความไฮไลต์
  2. เลือกนโยบายข้อความไฮไลต์บริการที่ต้องการตรวจสอบ
  3. ดูองค์ประกอบ <Timeout> ที่มีค่าที่เหมาะสมใต้ การกำหนดค่า <ServiceCallout>

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

    <Timeout>120000</Timeout>
    

กำลังตรวจสอบระยะหมดเวลา I/O บน Message Processor

  1. ลงชื่อเข้าใช้เครื่อง Message Processor
  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 บนเราเตอร์เพื่อตั้งค่าระยะหมดเวลาบนโฮสต์เสมือน