504 זמן קצוב לתפוגה של Gateway - תם הזמן הקצוב לתפוגה של הנתב

כרגע מוצג התיעוד של Apigee Edge.
כניסה למסמכי התיעוד של Apigee X.
מידע

תיאור הבעיה

אפליקציית הלקוח מקבלת קוד סטטוס HTTP של 504 עם ההודעה Gateway Timeout בתגובה לקריאות ל-API.

הודעת השגיאה הזו מציינת שהלקוח לא קיבל תגובה בזמן מ-Apigee Edge או משרת הקצה העורפי במהלך הביצוע של קריאה ל-API.

הודעת השגיאה

אפליקציית הלקוח מקבלת את קוד התגובה הבא:

HTTP/1.1 504 Gateway Time-out

בקריאה לשרת proxy כזה באמצעות 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 לא נמשכת יותר מדי זמן. אם רכיב כלשהו בתהליך לא יקבל את התגובה מהרכיב של ה-upstream במהלך פרק הזמן שצוין בהגדרת הזמן הקצוב לתפוגה, הזמן הקצוב לתפוגה של הרכיב הספציפי יסתיים ובדרך כלל יחזיר שגיאת 504 Gateway Timeout.

המדריך הזה מסביר איך לפתור שגיאת 504 שנגרמת כשפג הזמן הקצוב לתפוגה של הנתב.

הזמן הקצוב לתפוגה של הנתב

הזמן הקצוב לתפוגה שמוגדר כברירת מחדל ב'נתבים' ב-Apigee Edge הוא 57 שניות. זה משך הזמן המרבי ששרת proxy ל-API יכול לפעול מהרגע שבו בקשת ה-API מתקבלת ב-Edge, עד שהתגובה נשלחת בחזרה, כולל התגובה בקצה העורפי וכל כללי המדיניות שבוצעו. כברירת מחדל, אפשר לעקוף את הזמן הקצוב לתפוגה בנתבים או במארחים הווירטואליים, כמו שמוסבר במאמר הגדרת זמן קצוב לתפוגה של קלט/פלט בנתבים.

גורמים אפשריים

ב-Edge, הסיבות הטיפוסיות לשגיאה 504 Gateway Timeout שנגרמות בגלל הזמן הקצוב לתפוגה של הנתב הן:

סיבה התיאור ההוראות לפתרון בעיות הרלוונטיות עבור
הגדרה שגויה של זמן קצוב לתפוגה בנתב זה קורה אם הנתב מוגדר עם פרק זמן שגוי של קלט/פלט (I/O). משתמשי Edge הציבוריים והפרטיים

שלבים נפוצים באבחון

אפשר להשתמש באחד מהכלים/הטכניקות הבאים כדי לאבחן את השגיאה הזו:

  • מעקב אחר API
  • יומני הגישה של NGINX

מעקב אחר API

כדי לאבחן את השגיאה באמצעות API Monitoring:

  1. עוברים לדף ניתוח > API Monitoring > חקירה.
  2. מסננים לפי 5xx שגיאות ובוחרים את מסגרת הזמן.
  3. יש להציב קוד סטטוס ביחס לזמן.
  4. כדי לראות פרטים נוספים ולהציג יומנים לגבי השגיאות האלה, צריך ללחוץ על התא הספציפי שבו מוצגות השגיאות 504, כמו בדוגמה הבאה:

    דוגמה להצגת שגיאות 504

  5. בחלונית השמאלית, לוחצים על View Logs (הצגת היומנים).

    בחלון יומני תנועה, מאתרים את הפרטים הבאים לגבי חלק מהשגיאות שקשורות ל-504:

    • בקשה: מספקת את שיטת הבקשה ואת ה-URI ששימשו לביצוע הקריאות
    • זמן תגובה: הזמן הכולל שחלף להגשת הבקשה.

    בדוגמה שלמעלה,

    • הבקשה מפנה אל GET /test-timeout.
    • זמן התגובה הוא 57.001 שניות. השגיאה מציינת שפג הזמן הקצוב לתפוגה של הנתב לפני שמעבד ההודעות יכול להגיב, כי הערך קרוב מאוד לזמן הקצוב לתפוגה שהוגדר כברירת מחדל בנתב, שהוא 57 שניות.

    תוכלו גם לקבל את כל היומנים באמצעות ממשק ה-API של GET יומנים של Monitoring API. לדוגמה, שליחת שאילתה ליומנים של org, env, timeRange ו-status, תאפשר לך להוריד את כל היומנים של עסקאות שבהן הזמן הקצוב לתפוגה של הלקוח פג.

    מאחר ש-API Monitoring מגדיר את שרת ה-Proxy כ-- (לא מוגדר) עבור שגיאות 504 אלה, אפשר להשתמש ב-API (Logs API) כדי לקבל את שרת ה-Proxy המשויך למארח ולנתיב הווירטואלי.

    לדוגמה :

    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) שהוגדר בנתב או במארח הווירטואלי. אם כן, המשמעות היא שפג הזמן הקצוב לתפוגה של הנתב לפני שמעבד ההודעות לא הגיב בפרק הזמן הזה.

    בדוגמה שלמעלה, הערך של Request Time (זמן הבקשה) של 57.001 שניות קרוב מאוד לזמן הקצוב לתפוגה של קלט/פלט (I/O) שהוגדר כברירת מחדל בנתב. זה סימן לכך שתם הזמן הקצוב לתפוגה של הנתב לפני שמעבד ההודעות הצליח להגיב.

  5. משתמשים בנתיב הבסיס בשדה Request כדי לקבוע מהו שרת ה-proxy של ה-API שעבורו נשלחה הבקשה.

הסיבה: הגדרה שגויה של זמן קצוב לתפוגה בנתב

אבחון

  1. קובעים אם השגיאות מסוג 504 נגרמות כי תם הזמן הקצוב לתפוגה של הנתב לפני שמעבד ההודעות הצליח להגיב. כדי לעשות זאת, בודקים אם זמן התגובה ב-API Monitoring/Request Time בנתב (שני השדות מייצגים את אותו מידע, אבל נקראים בשמות שונים) זהה לזמן הקצוב לתפוגה של קלט/פלט (I/O) שהוגדר בנתב/במארח הווירטואלי, ובשדות Fault Source (מקור כשל) וקוד Fault (שרת proxy) וקוד תקלה (Fault Code) שמוסברים כ-- באמצעות יומני Access Monitoring או NGIN.
  2. כדאי לבדוק אם ערך הזמן הקצוב לתפוגה של קלט/פלט (I/O) שהוגדר בנתב או במארח וירטואלי ספציפי נמוך בהשוואה לזה שהוגדר במעבד ההודעות או בשרת ה-API הספציפי.

    כדי לעשות זאת, בצעו את השלבים המפורטים בסעיף זה.

אימות הזמן הקצוב לתפוגה של קלט/פלט (I/O) במארחים וירטואליים

ממשק המשתמש של Edge

כדי לבדוק את הזמן הקצוב לתפוגה של המארח הווירטואלי באמצעות ממשק המשתמש של Edge, מבצעים את הפעולות הבאות:

  1. מתחברים לממשק המשתמש של Edge.
  2. עוברים אל ניהול > מארחים וירטואליים.
  3. בוחרים סביבה ספציפית שבה נתקלתם בבעיה של הזמן הקצוב לתפוגה.
  4. בוחרים את המארח הווירטואלי הספציפי שעבורו רוצים לאמת את ערך הזמן הקצוב לתפוגה של קלט/פלט.
  5. בקטע מאפיינים, מציגים את הערך הזמן הקצוב לתפוגה של קריאת שרת proxy בשניות.

    בדוגמה שלמעלה, הזמן הקצוב לתפוגה של קריאה לשרת proxy מוגדר עם הערך 120. פירוש הדבר הוא שהזמן הקצוב לתפוגה של קלט/פלט (I/O) שהוגדר במארח הווירטואלי הזה הוא 120 שניות.

ממשקי API לניהול

אפשר גם לוודא שתם הזמן הקצוב לתפוגה של קריאת שרת ה-Proxy באמצעות ממשקי ה-API הבאים לניהול:

  1. מפעילים את ה-API של קבלת מארח וירטואלי כדי לקבל את ההגדרות של virtualhost, כמו שמוצג בהמשך:

    משתמש ב-Public Cloud

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

    משתמש בענן פרטי

    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 של ה-API

אפשר להציג את הזמן הקצוב לתפוגה של קלט/פלט באופן הבא:

  • נקודת קצה (endpoint) של יעד של שרת proxy ל-API
  • המדיניות בנושא יתרונות מרכזיים של שירות proxy ב-API
הצגת הזמן הקצוב לתפוגה של קלט/פלט (I/O) בנקודת הקצה של היעד של שרת proxy ל-API
  1. בממשק המשתמש של Edge, בוחרים את שרת ה-API הספציפי שבו רוצים לראות את ערך הזמן הקצוב לתפוגה של קלט/פלט.
  2. בוחרים את נקודת הקצה הספציפית של היעד שרוצים לבדוק.
  3. אפשר לראות את המאפיין io.timeout.millis עם ערך מתאים ברכיב <HTTPTargetConnection> בהגדרה TargetEndpoint.

    לדוגמה, הזמן הקצוב לתפוגה של קלט/פלט (I/O) בקוד הבא מוגדר ל-120 שניות:

    <Properties>
      <Property name="io.timeout.millis">120000</Property>
    </Properties>
    
הצגת הזמן הקצוב לתפוגה של קלט/פלט (I/O) במדיניות 'יתרונות מרכזיים של שירות' של API מסוג 'שרת proxy'
  1. בממשק המשתמש של Edge, בוחרים את שרת ה-API הספציפי שבו רוצים להציג את ערך הזמן הקצוב לתפוגה החדש של קלט/פלט במדיניות (Serviceרחב).
  2. בוחרים את המדיניות הספציפית בנושא יתרונות מרכזיים של שירות שרוצים לבדוק.
  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.

רושמים את הערכים שהוגדרו בכל השכבות, כמוצג בטבלה הבאה:

הזמן הקצוב לתפוגה של הנתב (בשניות) זמן קצוב לתפוגה במארח וירטואלי (שניות) זמן קצוב לתפוגה של מעבד ההודעות (בשניות) זמן קצוב לתפוגה בשרת proxy של API (שניות)
57 - 55 120

במשפט הזה,

  • ערך ברירת המחדל של 57 שניות מוגדר בנתב.
  • ערך הזמן הקצוב לתפוגה לא מוגדר במארח הווירטואלי הספציפי. כלומר, ייעשה שימוש בערך ברירת המחדל של 57 שניות שהוגדר בנתב עצמו.
  • במעבד ההודעות מוגדר ערך ברירת מחדל של 55 שניות.
  • עם זאת, בשרת ה-Proxy הספציפי של ה-API, מוגדר ערך של 120 שניות.

שימו לב שערך הזמן הקצוב הגבוה יותר מוגדר רק בשרת ה-API של ה-API, אבל הנתב עדיין מוגדר עם 57 שניות. לכן, הזמן הקצוב לתפוגה של הנתב הוא 57 שניות בזמן שמעבד ההודעות או הקצה העורפי עדיין מעבדים את הבקשה. בעקבות זאת, הנתב מגיב בהודעת השגיאה 504 Gateway Timeout לאפליקציית הלקוח.

רזולוציה

כדי לפתור את הבעיה, מבצעים את השלבים הבאים כדי להגדיר את הזמן הקצוב לתפוגה של קלט/פלט (I/O) בנתב ובמעבד ההודעות.

  1. כדאי לעיין בשיטות המומלצות להגדרת זמן קצוב לתפוגה של קלט/פלט (I/O) כדי להבין אילו ערכים של זמן קצוב לתפוגה צריך להגדיר ברכיבים שונים שקשורים לתהליך בקשת ה-API דרך Apigee Edge.
  2. בדוגמה שלמעלה, אם החלטתם שצריך להגדיר ערך גבוה יותר של זמן קצוב לתפוגה כי השרת העורפי דורש זמן ארוך יותר, והגדלתם את ערך הזמן הקצוב לתפוגה של מעבד ההודעות ל-120 שניות, עליכם להגדיר ערך גבוה יותר של זמן קצוב לתפוגה. לדוגמה: 123 seconds בנתב. כדי למנוע השפעה על כל שרתי ה-API של ה-API כתוצאה מערך הזמן החדש, צריך להגדיר את הערך 123 seconds רק במארח הווירטואלי הספציפי שנמצא בשימוש בשרת ה-proxy הספציפי של ה-API.
  3. פועלים לפי ההוראות ב הגדרת זמן קצוב לתפוגה של קלט/פלט בנתבים כדי לקבוע את הזמן הקצוב לתפוגה במארח הווירטואלי.