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

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

ลักษณะปัญหา

แอปพลิเคชันไคลเอ็นต์จะได้รับรหัสสถานะ 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 คือ Client > Router > Message Processor > Backend Server ดังที่แสดงในรูปต่อไปนี้

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

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

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

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

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

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

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

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

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

    เนื่องจากการตรวจสอบ API จะตั้งค่าพร็อกซีเป็น - (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 ที่กำหนดค่าไว้ในเราเตอร์/โฮสต์เสมือนหรือไม่ หากใช่ แสดงว่าเราเตอร์หมดเวลาแล้วก่อนที่ Message Processor จะตอบกลับภายในระยะเวลานี้

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

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

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

การวินิจฉัย

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

    โดยทำตามขั้นตอนในส่วนนี้

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

UI ของ Edge

หากต้องการยืนยันการหมดเวลาของโฮสต์เสมือนโดยใช้ UI ของ Edge ให้ทำดังนี้

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

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

API การจัดการ

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

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

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

    <Properties>
      <Property name="io.timeout.millis">120000</Property>
    </Properties>
ดูการหมดเวลา I/O ในนโยบาย ServiceCallout ของพร็อกซี API
  1. ใน UI ของ Edge ให้เลือกพร็อกซี API ที่ต้องการดูค่าการหมดเวลาของ I/O ใหม่ สำหรับนโยบาย ServiceCallout
  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 วินาทีใน Message Processor เรียบร้อยแล้ว

เมื่อกำหนดระยะหมดเวลาที่กำหนดค่าไว้ในเราเตอร์และ Message Processor แล้ว ให้ตรวจสอบว่าได้กำหนดค่าเราเตอร์/โฮสต์เสมือนที่มีค่าระยะหมดเวลาต่ำกว่าค่าใน Message Processor/พร็อกซี API หรือไม่

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

การหมดเวลาในเราเตอร์ (วินาที) หมดเวลาในโฮสต์เสมือน (วินาที) การหมดเวลาใน Message Processor (วินาที) การหมดเวลาในพร็อกซี API (วินาที)
57 - 55 120

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

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

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

ความละเอียด

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

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