כרגע מוצג התיעוד של 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:
- עוברים לדף ניתוח > API Monitoring > חקירה.
- מסננים לפי
5xx
שגיאות ובוחרים את מסגרת הזמן. - יש להציב קוד סטטוס ביחס לזמן.
-
כדי לראות פרטים נוספים ולהציג יומנים לגבי השגיאות האלה, צריך ללחוץ על התא הספציפי שבו מוצגות השגיאות
504
, כמו בדוגמה הבאה:דוגמה להצגת שגיאות 504
- בחלונית השמאלית, לוחצים על 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
- בודקים את זמן התגובה כדי לראות אם יש שגיאות נוספות של
504
ולבדוק אם זמן התגובה עקבי (הזמן הקצוב לתפוגה של קלט/פלט (I/O) שהוגדר בנתב הוא 57 שניות) בכל השגיאות של504
.
יומני הגישה של NGINX
כדי לאבחן את השגיאה באמצעות יומני הגישה של NGINX:
- בודקים את יומני הגישה של NGINX:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
- אפשר לחפש כדי לראות אם יש שגיאות
504
במהלך פרק זמן ספציפי (אם הבעיה אירעה בעבר) או אם יש בקשות שעדיין נכשלות עם504
. - כדאי לשים לב לפרטים הבאים לגבי חלק משגיאות ה-
504
:- זמן תגובה
- URI של בקשה
בדוגמה הזו אנחנו רואים את הפרטים הבאים:
-
זמן הבקשה:
57.001
שניות. זה סימן לכך שתם הזמן הקצוב לתפוגה של הנתב אחרי 57.001 שניות. - הבקשה:
GET /test-timeout
- כינוי מארח:
myorg-test.apigee.net
-
בודקים אם זמן הבקשה זהה לזמן הקצוב לתפוגה של קלט/פלט (I/O) שהוגדר בנתב או במארח הווירטואלי. אם כן, המשמעות היא שפג הזמן הקצוב לתפוגה של הנתב לפני שמעבד ההודעות לא הגיב בפרק הזמן הזה.
בדוגמה שלמעלה, הערך של Request Time (זמן הבקשה) של
57.001
שניות קרוב מאוד לזמן הקצוב לתפוגה של קלט/פלט (I/O) שהוגדר כברירת מחדל בנתב. זה סימן לכך שתם הזמן הקצוב לתפוגה של הנתב לפני שמעבד ההודעות הצליח להגיב. - משתמשים בנתיב הבסיס בשדה Request כדי לקבוע מהו שרת ה-proxy של ה-API שעבורו נשלחה הבקשה.
הסיבה: הגדרה שגויה של זמן קצוב לתפוגה בנתב
אבחון
- קובעים אם השגיאות מסוג
504
נגרמות כי תם הזמן הקצוב לתפוגה של הנתב לפני שמעבד ההודעות הצליח להגיב. כדי לעשות זאת, בודקים אם זמן התגובה ב-API Monitoring/Request Time בנתב (שני השדות מייצגים את אותו מידע, אבל נקראים בשמות שונים) זהה לזמן הקצוב לתפוגה של קלט/פלט (I/O) שהוגדר בנתב/במארח הווירטואלי, ובשדות Fault Source (מקור כשל) וקוד Fault (שרת proxy) וקוד תקלה (Fault Code) שמוסברים כ--
באמצעות יומני Access Monitoring או NGIN. -
כדאי לבדוק אם ערך הזמן הקצוב לתפוגה של קלט/פלט (I/O) שהוגדר בנתב או במארח וירטואלי ספציפי נמוך בהשוואה לזה שהוגדר במעבד ההודעות או בשרת ה-API הספציפי.
כדי לעשות זאת, בצעו את השלבים המפורטים בסעיף זה.
אימות הזמן הקצוב לתפוגה של קלט/פלט (I/O) במארחים וירטואליים
ממשק המשתמש של Edge
כדי לבדוק את הזמן הקצוב לתפוגה של המארח הווירטואלי באמצעות ממשק המשתמש של Edge, מבצעים את הפעולות הבאות:
- מתחברים לממשק המשתמש של Edge.
- עוברים אל ניהול > מארחים וירטואליים.
- בוחרים סביבה ספציפית שבה נתקלתם בבעיה של הזמן הקצוב לתפוגה.
- בוחרים את המארח הווירטואלי הספציפי שעבורו רוצים לאמת את ערך הזמן הקצוב לתפוגה של קלט/פלט.
- בקטע מאפיינים, מציגים את הערך הזמן הקצוב לתפוגה של קריאת שרת proxy בשניות.
בדוגמה שלמעלה, הזמן הקצוב לתפוגה של קריאה לשרת proxy מוגדר עם הערך
120
. פירוש הדבר הוא שהזמן הקצוב לתפוגה של קלט/פלט (I/O) שהוגדר במארח הווירטואלי הזה הוא 120 שניות.
ממשקי API לניהול
אפשר גם לוודא שתם הזמן הקצוב לתפוגה של קריאת שרת ה-Proxy באמצעות ממשקי ה-API הבאים לניהול:
-
מפעילים את ה-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 הוא שם המארח הווירטואלי
-
בדיקת הערך שהוגדר למאפיין
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
- מתחברים למכונה של נתב.
- מחפשים את הנכס
proxy_read_timeout
בספרייה/opt/nginx/conf.d
ובודקים אם הוא הוגדר עם הערך החדש באופן הבא:grep -ri "proxy_read_timeout" /opt/nginx/conf.d
-
צריך לבדוק את הערך שהוגדר למאפיין
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
- בממשק המשתמש של Edge, בוחרים את שרת ה-API הספציפי שבו רוצים לראות את ערך הזמן הקצוב לתפוגה של קלט/פלט.
- בוחרים את נקודת הקצה הספציפית של היעד שרוצים לבדוק.
- אפשר לראות את המאפיין
io.timeout.millis
עם ערך מתאים ברכיב<HTTPTargetConnection>
בהגדרהTargetEndpoint
.לדוגמה, הזמן הקצוב לתפוגה של קלט/פלט (I/O) בקוד הבא מוגדר ל-120 שניות:
<Properties> <Property name="io.timeout.millis">120000</Property> </Properties>
הצגת הזמן הקצוב לתפוגה של קלט/פלט (I/O) במדיניות 'יתרונות מרכזיים של שירות' של API מסוג 'שרת proxy'
- בממשק המשתמש של Edge, בוחרים את שרת ה-API הספציפי שבו רוצים להציג את ערך הזמן הקצוב לתפוגה החדש של קלט/פלט במדיניות (Serviceרחב).
- בוחרים את המדיניות הספציפית בנושא יתרונות מרכזיים של שירות שרוצים לבדוק.
-
אפשר לראות את הרכיב
<Timeout>
עם ערך מתאים במסגרת ההגדרה של<ServiceCallout>
.לדוגמה, הזמן הקצוב לתפוגה של קלט/פלט (I/O) בקוד הבא יהיה 120 שניות:
<Timeout>120000</Timeout>
אימות הזמן הקצוב לתפוגה של קלט/פלט (I/O) במעבדי ההודעות
- מתחברים למכונה של מעבד ההודעות.
-
מחפשים את המאפיין
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
- בפלט לדוגמה שלמעלה, שימו לב שהמאפיין
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) בנתב ובמעבד ההודעות.
- כדאי לעיין בשיטות המומלצות להגדרת זמן קצוב לתפוגה של קלט/פלט (I/O) כדי להבין אילו ערכים של זמן קצוב לתפוגה צריך להגדיר ברכיבים שונים שקשורים לתהליך בקשת ה-API דרך Apigee Edge.
- בדוגמה שלמעלה, אם החלטתם שצריך להגדיר ערך גבוה יותר של זמן קצוב לתפוגה כי השרת העורפי דורש זמן ארוך יותר, והגדלתם את ערך הזמן הקצוב לתפוגה של מעבד ההודעות ל-120 שניות, עליכם להגדיר ערך גבוה יותר של זמן קצוב לתפוגה. לדוגמה:
123 seconds
בנתב. כדי למנוע השפעה על כל שרתי ה-API של ה-API כתוצאה מערך הזמן החדש, צריך להגדיר את הערך123 seconds
רק במארח הווירטואלי הספציפי שנמצא בשימוש בשרת ה-proxy הספציפי של ה-API. - פועלים לפי ההוראות ב הגדרת זמן קצוב לתפוגה של קלט/פלט בנתבים כדי לקבוע את הזמן הקצוב לתפוגה במארח הווירטואלי.