כרגע מוצג התיעוד של Apigee Edge.
כניסה למסמכי התיעוד של
Apigee X. מידע
סרטונים
לקבלת מידע נוסף על שגיאות 503, אפשר לצפות בסרטונים הבאים:
וידאו | התיאור |
---|---|
פתרון בעיות ופתרון בעיות בשירות 503 לא זמין – NoActiveTargets | מידע על הנושאים הבאים:
|
תיאור הבעיה
אפליקציית הלקוח מקבלת את קוד הסטטוס 503 של תגובת HTTP עם ההודעה Service Unavailable וקוד השגיאה NoActiveTargets של בקשות שרת ה-API של שרת ה-API.
הודעת השגיאה
תוצג הודעת השגיאה הבאה:
HTTP/1.1 503 Service Unavailable
בתגובת ה-HTTP תופיע הודעת השגיאה הבאה:
{ "fault": { "faultstring": "The Service is temporarily unavailable", "detail": { "errorcode": "messaging.adaptors.http.flow.NoActiveTargets" } } }
גורמים אפשריים
תגובת ה-HTTP 503 Service לא זמין עם קוד השגיאה NoActiveTargets בדרך כלל מתועדת כשמשתמשים בשרת יעד אחד או יותר בהגדרת נקודת הקצה (endpoint) של היעד ב-API של שרת ה-proxy.
המדריך הזה כולל מידע על השירות 503 לא זמין עם קוד השגיאה NoActiveTargets שנוצר עקב כשלים בבדיקות התקינות. במדריך הזה מוסבר על סיבות אחרות לשגיאה הזו.
כשלים בבדיקת התקינות
הכשלים בבדיקת התקינות ייבדקו רק אם הגדרתם Health Monitor כחלק מהגדרת איזון העומסים ביעד של השרת, בנקודת הקצה של היעד של שרת ה-proxy של ה-API.
כששרת יעד נכשל בבדיקת תקינות, Edge מגדיל את מספר הכישלונות של אותו שרת.
אם מספר הכישלונות בבדיקת התקינות של אותו שרת מגיע לסף המוגדר מראש (<MaxFailures>
),
מעבד ההודעות רושם את הודעת האזהרה הבאה בקובץ היומן שלו, כפי שמוצג בהמשך:
Apigee-Timer-7 WARN ADAPTORS.HTTP.FLOW - LBServer.incrementFailureCount() : Max failure count(10) reached for server : mocktarget2{Environment=<orgname>__prod,Application=mocktargetapigee__1,Target=default}
הודעת האזהרה כוללת את הפרטים הבאים.
כך תוכלו להבין איזה שרת יעד הגיע לספירה של MaxFailure
:
- השם של שרת היעד
- שמות של ארגונים וסביבות
- שם שרת proxy ל-API
- השם של נקודת הקצה (endpoint) של היעד
לאחר מכן, Edge מפסיק לשלוח בקשות נוספות לשרת הספציפי הזה. אחרי שכל שרתי
היעד שהוגדרו בהגדרות של Load Balancer מגיעים למספר MaxFailure
, בקשות ה-API הבאות מגיבות עם קוד השגיאה 503 Service Unavailable, עם קוד השגיאה NoActiveTargets.
השימוש ב-Health Monitor עוזר ל-Apigee Edge לכלול באופן אוטומטי שרת יעד בחזרה לסבב כשהוא הופך לתקין, ללא צורך בפריסה מחדש של שרת ה-proxy של ה-API.
הנה הסיבות האפשריות לכשלים בבדיקת התקינות:
סיבה | התיאור | מי יכול לבצע את השלבים לפתרון בעיות |
---|---|---|
שגיאה לגבי הזמן הקצוב לתפוגה של החיבור | מעבד ההודעות לא יכול להתחבר לשרת היעד במהלך פרק הזמן הקצוב שצוין בהגדרה של Load Balancer. | משתמשי ענן פרטי של Edge |
בקשה מאובטחת ביציאה לא מאובטחת |
|
משתמשי ענן פרטי של Edge |
בקשה לא מאובטחת ביציאה מאובטחת |
|
משתמשי ענן פרטי של Edge |
ה-API של Health Check מגיב עם שגיאה | אם ה-API של בדיקת התקינות מגיב עם שגיאה או קוד תגובה, כל דבר מלבד שצוין ברכיב SuccessResponse של Health Monitor. | משתמשי ענן פרטי של Edge |
שלבים נפוצים באבחון
זיהוי ההודעה של הבקשה שנכשלה
כלי המעקב
כדי לאתר את מזהה ההודעה של הבקשה שנכשלה באמצעות כלי המעקב:
- מפעילים את סשן המעקב, מבצעים את הקריאה ל-API ומשחזרים את הבעיה – השירות 503 לא זמין עם קוד השגיאה NoActiveTargets.
- בוחרים אחת מהבקשות שנכשלו.
- צריך לנווט אל שלב AX ולקבוע את מזהה ההודעה (
X-Apigee.Message-ID
) של הבקשה על ידי גלילה למטה בקטע פרטי השלב, כפי שמתואר באיור הבא.
יומני הגישה של NGINX
כדי לאתר את מזהה ההודעה של הבקשה שנכשלה באמצעות יומני הגישה של NGINX:
ניתן גם לעיין ביומני הגישה של NGINX כדי לאתר את מזהה ההודעה של שגיאות 503. האפשרות הזו שימושית במיוחד אם הבעיה התרחשה בעבר או אם הבעיה מתרחשת לסירוגין ולא ניתן לתעד את נתוני המעקב בממשק המשתמש. כדי לזהות את המידע הזה מיומני הגישה של NGINX, יש לפעול לפי השלבים הבאים:
- כדאי לבדוק את יומני הגישה של NGINX: (
/opt/apigee/var/log/edge-router/nginx/ <org>~ <env>.<port#>_access_log
) - חיפוש אם יש שגיאות 503 לשרת ה-API הספציפי במשך פרק זמן ספציפי (אם הבעיה אירעה בעבר) או אם יש בקשות שעדיין נכשלות עם 503.
- אם יש שגיאות 503 ב-X-Apigee-fault-code messages.adaptors.http.flow.NoActiveTargets,
שימו לב למזהה ההודעה של בקשה אחת או יותר, כפי שמוצג בדוגמה הבאה:
רשומה לדוגמה שמציגה את השגיאה 503
הודעות שגיאה נפוצות
כשמשתמשים בשרתי יעד ומופיעה שגיאה בזמן שמעבד ההודעות מנסה להתחבר לשרת הקצה העורפי, יופיעו כמה הודעות שגיאה נפוצות ביומנים של מעבד ההודעות. השגיאות האלה מתועדות אחרי הודעת החריגה או הודעת השגיאה שהובילו לכישלון.
אלה הודעות השגיאה הנפוצות שהוצגו ביומנים של מעבד ההודעות (/opt/apigee/var/log/edge-message-processor/logs/system.log
) עבור השירות 503 לא זמין עם קוד השגיאה NoActiveTargets:
org:myorg env:prod api:TestTargetServer rev:2 messageid:<messageid> NIOThread@0 INFO ADAPTORS.HTTP.FLOW - LBTargetRequestSender.sendRequest() : Failed to send request to target servers : [demo-target] for default{Organization=myorgEnvironment=prod,Application=TestTargetServer__2} org:myorg env:prod api:TestTargetServer rev:2 messageid:<messageid> NIOThread@0 ERROR ADAPTORS.HTTP.FLOW - LBTargetRequestSender.sendRequest() : No Active Target server Found for default{Organization=myorgEnvironment=prod,Application=TestTargetServer__2} org:myorg env:prod api:TestTargetServer rev:2 messageid:<messageid> NIOThread@0 ERROR ADAPTORS.HTTP.FLOW - LBTargetRequestSender.sendRequest() : Unexpected error while sending request com.apigee.errors.http.server.ServiceUnavailableException: The Service is temporarily unavailable at com.apigee.messaging.adaptors.http.flow.data.LBTargetRequestSender.sendRequest(LBTargetRequestSender.java:299) at com.apigee.messaging.adaptors.http.flow.data.LBTargetRequestSender.access$400(LBTargetRequestSender.java:57) …<snipped>
הודעות השגיאה האלה מצביעות על כך שלא ניתן היה לשלוח את הבקשה לשרת הקצה העורפי עקב כשל. כתוצאה מכך, מעבד ההודעות שולח את הערך 503 Service Unavailable (שירות לא זמין 503) עם קוד השגיאה NoActiveTargets כתגובה ללקוח.
הסיבה: הזמן הקצוב לחיבור פג
אבחון
- כך בודקים מה מזהה ההודעה של הבקשה שנכשלה.
- עליך לחפש את מזהה ההודעה ביומן של מעבד ההודעות (
/opt/apigee/var/log/edge-message-processor/logs/system.log
). - יוצגו הודעות השגיאה הנפוצות שתואמות למזהה ההודעה. עם זאת,
כדי לברר מה הסיבה בפועל לכשלים בבדיקת התקינות, גוללים מעל
הודעות השגיאה הנפוצות ומחפשים שגיאות תקינות.
לדוגמה, הודעת השגיאה הבאה של HEALTH MONITOR מציינת שמעבד ההודעות נכשל והשגיאה תם הזמן הקצוב לתפוגה של החיבור בעת שליחת בקשת ה-API לבדיקת תקינות:
Apigee-Timer-6 ERROR SERVICES.HEALTH_MONITOR - HTTPMonitor.getResponseFromCache() : Error sending request Request URL : https://<BackendServer-Hostname>:443/status java.net.ConnectException: Connection timed out (Connection timed out) at java.net.PlainSocketImpl.socketConnect(Native Method) at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) …<snipped>
אם השגיאה הזו חוזרת על עצמה
MaxFailure
פעמים במשך מספר הפעמים שהוגדר ב-Health Monitor, תוצג הודעת אזהרה כזו:Apigee-Timer-7 WARN ADAPTORS.HTTP.FLOW - LBServer.incrementFailureCount() : Max failure count(10) reached for server : mocktarget2{Environment=<orgname>__prod,Application=mocktargetapigee__1,Target=default}
קוראים בעיון את המידע שנמסר בהודעת האזהרה. צריך לוודא שהגעתם למספר
MaxFailure
של שרת יעד שבו נעשה שימוש בשרת ה-proxy הספציפי של ה-API, שעבורו מופיע קוד התגובה 503 עם קוד השגיאה NoActiveTargets. - בדוגמה שלמעלה, בדיקת התקינות נכשלה עם השגיאה
connection timed out
. בודקים אם אפשר להתחבר לשרת הקצה העורפי הספציפי ישירות מכל אחד ממעבדי ההודעות באמצעות הפקודהtelnet
: - אם אתם מצליחים להתחבר לשרת הקצה העורפי, יכול להיות שתוצג לכם הודעה כמו מחובר לשרת הקצה העורפי. יכול להיות שהבעיה זמנית ונפתרת או שמדובר בבעיה זמנית. חוזרים על שלב 4 כמה פעמים (יותר מ-10 פעמים) ומאמתים את הפלט.
- אם אין שגיאות בפקודה
telnet
באופן עקבי, הבעיה נפתרה. בודקים שוב אם הכשלים בבדיקת התקינות הופסקו. אם כן, אין צורך לעשות דבר. - אם לא ניתן להתחבר לסירוגין לשרת הקצה העורפי באמצעות הפקודה
telnet
, יכול להיות שיש בעיה ברשת או ששרת הקצה העורפי עמוס. - אם לא הצלחת להתחבר לשרת הקצה העורפי באמצעות הפקודה
telnet
באופן עקבי, יכול להיות שתעבורת הנתונים הזו לא מותרת על ידי מעבדי ההודעות בשרת הקצה העורפי הספציפי.
telnet <BackendServer-HostName> 443
רזולוציה
אם השגיאה connection timed out
מזוהה באופן עקבי, צריך לוודא שבשרת הקצה העורפי אין הגבלות של חומת אש ושהוא מאפשר תעבורת נתונים ממעבדי ההודעות של Apigee Edge.
לדוגמה, ב-Linux אפשר להשתמש ב-iptables כדי לאפשר תעבורת נתונים מכתובות ה-IP של מעבד ההודעות בשרת הקצה העורפי.
אם הבעיה נמשכת, כדאי לפנות למנהל הרשת כדי לבדוק ולפתור את הבעיה. אם אתם צריכים עזרה נוספת מ-Apigee, אפשר לפנות לתמיכה של Apigee.
הסיבה: בקשה מאובטחת ביציאה לא מאובטחת
אבחון
- כך בודקים מה מזהה ההודעה של הבקשה שנכשלה.
- עליך לחפש את מזהה ההודעה ביומן של מעבד ההודעות (
/opt/apigee/var/log/edge-message-processor/logs/system.log
). - יוצגו הודעות השגיאה הנפוצות שתואמות למזהה ההודעה.
עם זאת, כדי לברר מה הסיבה בפועל לכשלים בבדיקת התקינות, אפשר לגלול מעל
הודעות השגיאה הנפוצות ולבדוק אם יש שגיאות תקינות.
לדוגמה, ייתכן שתופיע שגיאת 'מעקב בריאות' כפי שמוצג בהמשך:
Apigee-Timer-1 ERROR SERVICES.HEALTH_MONITOR - HTTPMonitor.getResponseFromCache() : Error sending request Request URL : https://mocktarget.apigee.net:80/status javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection? at sun.security.ssl.InputRecord.handleUnknownRecord(InputRecord.java:710) at sun.security.ssl.InputRecord.read(InputRecord.java:527) at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:983) at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1385) at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1413) at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1397) …<snipped>
אם השגיאה הזו חוזרת על עצמה במשך מספר פעמים אחד (
MaxFailure
) שהוגדר ב-Health Monitor, תוצג הודעת אזהרה כזו:Apigee-Timer-7 WARN ADAPTORS.HTTP.FLOW - LBServer.incrementFailureCount() : Max failure count(10) reached for server : mocktarget{Environment=<orgname>__prod,Application=mocktargetapigee__1,Target=default}
קוראים בעיון את המידע שנמסר בהודעת האזהרה. צריך לוודא שהגעתם למספר
MaxFailure
של שרת יעד שבו נעשה שימוש בשרת ה-proxy הספציפי של ה-API, שעבורו מופיע קוד התגובה 503 עם קוד השגיאה NoActiveTargets. - בדיקת התקינות נכשלה עם השגיאה:
Error sending request Request URL : https://mocktarget.apigee.net:80/statuscode/200 javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?
בהודעת השגיאה ובכתובת ה-URL צוין שהסיבה לבעיה היא שבוצעה שיחה מאובטחת (HTTPS) ביציאה לא מאובטחת 80.
השגיאה הזו יכולה להתרחש בשני התרחישים הבאים:
- שרת יעד מאובטח הוגדר עם יציאה לא מאובטחת
- הוגדר שרת יעד מאובטח, אבל Health Monitor הוגדרה באמצעות יציאה לא מאובטחת
יציאה לא מאובטחת של יעד מאובטח
תרחיש 1: שרת יעד מאובטח הוגדר באמצעות יציאה לא מאובטחת
אם הגדרתם שרת יעד מאובטח אבל עם יציאה לא מאובטחת כמו 80, הודעת השגיאה הזו תופיע. כדי לבדוק אם זו הסיבה לבעיה:
- צריך לבדוק את ההגדרה של שרת היעד המשמש בהגדרה של נקודת הקצה (endpoint) של היעד.
- עכשיו צריך לבדוק את ההגדרה של Health Monitor של שרת היעד בהגדרה של נקודת הקצה (endpoint) של היעד:
הגדרה של Health Monitor
<HealthMonitor> <IsEnabled>true</IsEnabled> <IntervalInSec>5</IntervalInSec> <HTTPMonitor> <Request> <ConnectTimeoutInSec>10</ConnectTimeoutInSec> <SocketReadTimeoutInSec>30</SocketReadTimeoutInSec> <Verb>GET</Verb> <Path>/statuscode/200</Path> </Request> <SuccessResponse> <ResponseCode>200</ResponseCode> </SuccessResponse> </HTTPMonitor> </HealthMonitor>
שימו לב שלא צוין רכיב
<Port>
בהגדרות האישיות של Health Monitor שלמעלה. במקרה כזה, מעבד ההודעות של Edge משתמש ביציאה שצוינה בהגדרה של שרת היעד (שהיא 80) כדי לבצע קריאות ל-API לבדיקת תקינות. - על סמך המידע שלמעלה, הסיבה לשגיאה הזו היא ששרת היעד מוגדר כשרת מאובטח (מכיוון שמופעל בלוק SSLInfo), אבל עם יציאה לא מאובטחת 80.
משתמשים ב-Get TargetServer API כדי לקבל את ההגדרה של שרת היעד.
פלט של הגדרת שרת היעד
<TargetServer name="mocktarget"> <Host>mocktarget.apigee.net</Host> <Port>80</Port> <IsEnabled>true</IsEnabled> <SSLInfo> <Enabled>true</Enabled> </SSLInfo> </TargetServer>
בדוגמה שלמעלה, ההגדרה מראה ששרת היעד
mocktarget
הוא שרת מאובטח, כפי שמצוין בבלוק SSLInfo. עם זאת, הוא מוגדר באמצעות יציאה לא מאובטחת 80.יציאת HM לא מאובטחת עם יעד מאובטח
תרחיש 2: הוגדר שרת יעד מאובטח, אבל Health Monitor הוגדרה עם יציאה לא מאובטחת
אם הגדרתם שרת יעד מאובטח אבל ב-Health Monitor הוגדרה יציאה לא מאובטחת כמו 80, הודעת השגיאה הזו תופיע. כדי לבדוק אם זו הסיבה לבעיה:
- צריך לבדוק את ההגדרה של שרת היעד המשמש בהגדרה של נקודת הקצה (endpoint) של היעד.
משתמשים ב- Get TargetServer API כדי לקבל את ההגדרה של שרת היעד.
פלט של הגדרת שרת היעד
<TargetServer name="mocktarget"> <Host>mocktarget.apigee.net</Host> <Port>443</Port> <IsEnabled>true</IsEnabled> <SSLInfo> <Enabled>true</Enabled> </SSLInfo> </TargetServer>
בדוגמה שלמעלה, ההגדרה מראה ששרת היעד
mocktarget
הוא שרת מאובטח, כפי שמצוין בבלוק SSLInfo. - בשלב הבא, צריך לבדוק את ההגדרה של Health Monitor של שרת היעד בהגדרה של נקודת הקצה (endpoint) של היעד:
הגדרה של Health Monitor
<HealthMonitor> <IsEnabled>true</IsEnabled> <IntervalInSec>5</IntervalInSec> <HTTPMonitor> <Request> <ConnectTimeoutInSec>10</ConnectTimeoutInSec> <SocketReadTimeoutInSec>30</SocketReadTimeoutInSec> <Port>80</Port> <Verb>GET</Verb> <Path>/statuscode/200</Path> </Request> <SuccessResponse> <ResponseCode>200</ResponseCode> </SuccessResponse> </HTTPMonitor>
בדוגמה שלמעלה, ה-Health Monitor מוגדר עם יציאה לא מאובטחת 80, כפי שמצוין על ידי הרכיב
<Port>
. - על סמך המידע שלמעלה, הסיבה לשגיאה הזו היא ששרת היעד מוגדר כשרת מאובטח (מכיוון שבלוק SSLInfo מופעל) ומשתמש ביציאה מאובטחת 443, אבל ה-Health Monitor מוגדר לבצע בדיקות תקינות באמצעות יציאה לא מאובטחת 80 (המצוינת ברכיב
<Port>
).כלומר, במקרה כזה, Edge הופך את ממשקי ה-API לבדיקת תקינות כקריאה מאובטחת עם יציאה 80 לא מאובטחת, ונכשלת עם השגיאה שצוינה למעלה.
רזולוציה
יציאה לא מאובטחת של יעד מאובטח
תרחיש 1: שרת יעד מאובטח הוגדר באמצעות יציאה לא מאובטחת
כדי לתקן את השגיאה הזו, צריך לעדכן את ההגדרה של שרת היעד כך שישתמש ביציאה מאובטחת מתאימה.
משתמשים ב- Update a TargetServer API כדי לעדכן את ההגדרה של שרת היעד ולוודא שנעשה שימוש ביציאה מאובטחת (לדוגמה: 443) , כפי שמוצג בדוגמה הבאה:
<TargetServer name="mocktarget"> <Host>mocktarget.apigee.net</Host> <Port>443</Port> <IsEnabled>true</IsEnabled> <SSLInfo> <Enabled>true</Enabled> </SSLInfo> </TargetServer>
יציאת HM לא מאובטחת עם יעד מאובטח
תרחיש 2: הוגדר שרת יעד מאובטח, אבל Health Monitor הוגדרה עם יציאה לא מאובטחת
כדי לתקן את השגיאה, בצע את ההוראות הבאות:
- צריך לשנות את ההגדרה של Health Monitor כך שתשתמש ביציאה מאובטחת (למשל: 443) לצורך ביצוע בדיקות תקינות של שרת היעד בתצורת היעד של נקודת הקצה (endpoint) של שרת ה-API שנכשל, כפי שמוצג כאן:
<HealthMonitor> <IsEnabled>true</IsEnabled> <IntervalInSec>5</IntervalInSec> <HTTPMonitor> <Request> <ConnectTimeoutInSec>10</ConnectTimeoutInSec> <SocketReadTimeoutInSec>30</SocketReadTimeoutInSec> <Port>443</Port> <Verb>GET</Verb> <Path>/statuscode/200</Path> </Request> <SuccessResponse> <ResponseCode>200</ResponseCode> </SuccessResponse> </HTTPMonitor> </HealthMonitor>
- שומרים את השינויים ב-API Proxy.
הסיבה: בקשה לא מאובטחת ביציאה מאובטחת
אבחון
- כך בודקים מה מזהה ההודעה של הבקשה שנכשלה.
- עליך לחפש את מזהה ההודעה ביומן של מעבד ההודעות (
/opt/apigee/var/log/edge-message-processor/logs/system.log
). - יוצגו הודעות השגיאה הנפוצות שתואמות למזהה ההודעה.
עם זאת, כדי לברר מה הסיבה בפועל לכשלים בבדיקת התקינות, אפשר לגלול מעל
הודעות השגיאה הנפוצות ולבדוק אם יש שגיאות תקינות.
לדוגמה, ייתכן שתופיע שגיאת 'מעקב בריאות' כפי שמוצג בהמשך:
Apigee-Timer-2 ERROR SERVICES.HEALTH_MONITOR - HTTPMonitor.getResponseFromCache() : Error sending request Request URL : http://mocktarget.apigee.net:443/status java.net.SocketException: Unexpected end of file from server at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:851) at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:678) at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:848) at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:678) at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1587) …<snipped>
אם השגיאה הזו חוזרת על עצמה במשך מספר פעמים אחד (
MaxFailure
) שהוגדר ב-Health Monitor, תוצג הודעת אזהרה כזו:Apigee-Timer-7 WARN ADAPTORS.HTTP.FLOW - LBServer.incrementFailureCount() : Max failure count(10) reached for server : mocktarget{Environment=<orgname>__prod,Application=mocktargetapigee__1,Target=default}
קוראים בעיון את המידע שנמסר בהודעת האזהרה. צריך לוודא שהגעתם למספר
MaxFailure
של שרת יעד שבו נעשה שימוש בשרת ה-proxy הספציפי של ה-API, שעבורו מופיע קוד התגובה 503 עם קוד השגיאה NoActiveTargets. - בדיקת התקינות נכשלה עם השגיאה:
Error sending request Request URL : http://mocktarget.apigee.net:443/status java.net.SocketException: Unexpected end of file from server
בהודעת השגיאה ובכתובת ה-URL צוין שהסיבה לבעיה היא שבוצעה קריאה לא מאובטחת (HTTP) ביציאה המאובטחת 443.
השגיאה הזו יכולה להתרחש בשני התרחישים הבאים:
- הוגדר שרת יעד לא מאובטח עם יציאה מאובטחת
- הוגדר שרת יעד לא מאובטח, אבל Health Monitor הוגדרה עם יציאה מאובטחת
יציאה לא מאובטחת ליעד
תרחיש 1: שרת יעד לא מאובטח שהוגדר עם יציאה מאובטחת
אם הגדרתם שרת יעד לא מאובטח אבל עם יציאה מאובטחת כמו 443, תופיע הודעת השגיאה הזו. כדי לבדוק אם זו הסיבה לבעיה:
- צריך לבדוק את ההגדרה של שרת היעד המשמש בהגדרה של נקודת הקצה (endpoint) של היעד.
משתמשים ב- Get TargetServer API כדי לקבל את ההגדרה של שרת היעד.
פלט של הגדרת שרת היעד
<TargetServer name="mocktarget"> <Host>mocktarget.apigee.net</Host> <Port>443</Port> <IsEnabled>true</IsEnabled> </TargetServer>
בדוגמה שלמעלה, ההגדרה מראה ששרת היעד
mocktarget
הוא שרת לא מאובטח, כי אין חסימה של SSLInfo. עם זאת, היא מוגדרת בצורה שגויה באמצעות יציאה מאובטחת 443. - עכשיו צריך לבדוק את ההגדרה של Health Monitor של שרת היעד בהגדרה של נקודת הקצה (endpoint) של היעד:
הגדרה של Health Monitor
<HealthMonitor> <IsEnabled>true</IsEnabled> <IntervalInSec>5</IntervalInSec> <HTTPMonitor> <Request> <ConnectTimeoutInSec>10</ConnectTimeoutInSec> <SocketReadTimeoutInSec>30</SocketReadTimeoutInSec> <Verb>GET</Verb> <Path>/statuscode/200</Path> </Request> <SuccessResponse> <ResponseCode>200</ResponseCode> </SuccessResponse> </HTTPMonitor> </HealthMonitor>
שימו לב שלא מצוין אף רכיב
<Port>
בהגדרות של Health Monitor שלמעלה. במקרה כזה, מעבד ההודעות של Edge ישתמש ביציאה שצוינה בהגדרה של שרת היעד, 443. - על סמך המידע שלמעלה, הסיבה לשגיאה הזו היא ששרת היעד מוגדר כשרת לא מאובטח (מכיוון שלא הוגדר בלוק SSLInfo), אבל עם יציאה מאובטחת 443.
כלומר, כשאפליקציית Edge מבצעת את בדיקות התקינות כשיחה לא מאובטחת ביציאה מאובטחת 443, היא נכשלת בעקבות השגיאה שצוינה למעלה.
יציאת HM מאובטחת ליעד לא מאובטח
תרחיש 2: הוגדר שרת יעד לא מאובטח, אבל Health Monitor הוגדרה עם יציאה מאובטחת
אם הגדרתם שרת יעד לא מאובטח אבל ב-Health Monitor הוגדרה יציאה מאובטחת כמו 443, תופיע הודעת השגיאה הזו. כדי לבדוק אם זו הסיבה לבעיה:
- צריך לבדוק את ההגדרה של שרת היעד המשמש בהגדרה של נקודת הקצה (endpoint) של היעד.
משתמשים ב- Get TargetServer API כדי לקבל את ההגדרה של שרת היעד.
פלט של הגדרת שרת היעד
<TargetServer name="mocktarget"> <Host>mocktarget.apigee.net</Host> <Port>80</Port> <IsEnabled>true</IsEnabled> </TargetServer>
בדוגמה שלמעלה, ההגדרה מראה ששרת היעד
mocktarget
הוא שרת לא מאובטח (מכיוון שלא קיים בלוק SSLInfo) שמוגדר עם יציאה לא מאובטחת 80 נכון. - בשלב הבא, צריך לבדוק את ההגדרה של Health Monitor של שרת היעד בהגדרה של נקודת הקצה (endpoint) של היעד:
הגדרה של Health Monitor
<HealthMonitor> <IsEnabled>true</IsEnabled> <IntervalInSec>5</IntervalInSec> <HTTPMonitor> <Request> <ConnectTimeoutInSec>10</ConnectTimeoutInSec> <SocketReadTimeoutInSec>30</SocketReadTimeoutInSec> <Port>443</Port> <Verb>GET</Verb> <Path>/statuscode/200</Path> </Request> <SuccessResponse> <ResponseCode>200</ResponseCode> </SuccessResponse> </HTTPMonitor> </HealthMonitor>
בדוגמה שלמעלה, ה-Health Monitor מוגדר עם יציאה מאובטחת 443 כפי שמצוין על ידי הרכיב
<Port>
. - על סמך המידע שלמעלה, הסיבה לשגיאה הזו היא ששרת היעד מוגדר כשרת לא מאובטח (כי בלוק SSLInfo לא מוגדר בצורה נכונה) עם יציאה לא מאובטחת 80, אבל ה-Health Monitor מוגדר לבצע בדיקות תקינות עם יציאה מאובטחת 443 (מצוין ברכיב
<Port>
).כלומר, במקרה הזה, Edge מבצע את בדיקות התקינות כקריאה לא מאובטחת באמצעות יציאה מאובטחת 443, ונכשל עם השגיאה שצוינה למעלה.
רזולוציה
יציאה לא מאובטחת ליעד
תרחיש 1: שרת יעד לא מאובטח שהוגדר עם יציאה מאובטחת
כדי לתקן את השגיאה הזו, צריך לעדכן את ההגדרה של שרת היעד כך שישתמש ביציאה מאובטחת מתאימה.
משתמשים ב עדכון ממשק API לטירגוט של שרת יעד כדי לעדכן את ההגדרה של שרת היעד ולוודא שנעשה שימוש ביציאה לא מאובטחת (למשל: 80) כפי שמוצג בדוגמה הבאה:
<TargetServer name="mocktarget"> <Host>mocktarget.apigee.net</Host> <Port>80</Port> <IsEnabled>true</IsEnabled> </TargetServer>
יציאת HM מאובטחת ליעד לא מאובטח
תרחיש 2: הוגדר שרת יעד לא מאובטח, אבל Health Monitor הוגדרה עם יציאה מאובטחת
כדי לתקן את השגיאה, בצע את ההוראות הבאות:
- מסירים את הרכיב
<Port>
מההגדרה של Health Monitor או משנים את ההגדרה של Health Monitor כך שתשתמש ביציאה לא מאובטחת (לדוגמה: 80) כדי לבצע בדיקות תקינות של שרת היעד בתצורה של נקודת הקצה של נקודת הקצה ב-API הנכשל, כפי שמוצג בהמשך:<HealthMonitor> <IsEnabled>true</IsEnabled> <IntervalInSec>5</IntervalInSec> <HTTPMonitor> <Request> <ConnectTimeoutInSec>10</ConnectTimeoutInSec> <SocketReadTimeoutInSec>30</SocketReadTimeoutInSec> <Port>80</Port> <Verb>GET</Verb> <Path>/statuscode/200</Path> </Request> <SuccessResponse> <ResponseCode>200</ResponseCode> </SuccessResponse> </HTTPMonitor> </HealthMonitor>
- שומרים את השינויים ב-API Proxy.
הסיבה: ה-API לבדיקת התקינות מגיב עם שגיאה
אבחון
- כך בודקים מה מזהה ההודעה של הבקשה שנכשלה.
- עליך לחפש את מזהה ההודעה ביומן של מעבד ההודעות (
/opt/apigee/var/log/edge-message-processor/logs/system.log
). - יוצגו הודעות השגיאה הנפוצות שתואמות למזהה ההודעה.
עם זאת, כדי לברר מה הסיבה בפועל לכשלים בבדיקת התקינות, גוללים מעל
הודעות השגיאה הנפוצות האלה ובודקים אם יש שגיאות או אזהרות לגבי מצב התקינות.
לדוגמה, ייתכן שתוצג לכם אזהרה בנושא 'מעקב בריאות', כפי שמוצג בהמשך:
Apigee-Timer-7 INFO SERVICES.HEALTH_MONITOR - HTTPMonitor.sendRequest() : HTTPMonitor.monitor() : Connecting to https://mocktarget.apigee.net:443/status/200 Apigee-Timer-7 WARN SERVICES.HEALTH_MONITOR - HTTPMonitor.monitor() : HTTP response code from health monitoring service does not match.Expected response code : [200]. Received response code : 404
אם השגיאה הזו חוזרת על עצמה במשך מספר פעמים אחד (
MaxFailure
) שהוגדר ב-Health Monitor, תוצג הודעת אזהרה כזו:Apigee-Timer-7 WARN ADAPTORS.HTTP.FLOW - LBServer.incrementFailureCount() : Max failure count(10) reached for server : mocktarget{Environment=<orgname>__prod,Application=mocktargetapigee__1,Target=default}
קוראים בעיון את המידע שנמסר בהודעת האזהרה. צריך לוודא שהגעתם למספר
MaxFailure
של שרת יעד שבו נעשה שימוש בשרת ה-proxy הספציפי של ה-API, שעבורו מופיע קוד התגובה 503 עם קוד השגיאה NoActiveTargets. - בדיקת התקינות החזירה את הודעת האזהרה:
HTTP response code from health monitoring service does not match.Expected response code : [200]. Received response code : 404
בהודעת האזהרה שלמעלה מצוין שקוד התגובה הצפוי ל-API של בדיקת התקינות היה 200, אבל התגובה שהתקבלה בפועל היא 404. לכן, אנחנו מתייחסים לכך כאל כשל.
- לפני שבודקים את הסיבה לתגובה שגיאה מה-API לבדיקת תקינות, צריך להבין למה Edge
מצפה שקוד התגובה יהיה 200 ל-API של בדיקת התקינות. כדי לעשות את זה, צריך לבדוק את ההגדרה של Health Monitor
של שרת היעד בהגדרה של נקודת הקצה (endpoint):
הגדרה של Health Monitor
<HealthMonitor> <IsEnabled>true</IsEnabled> <IntervalInSec>5</IntervalInSec> <HTTPMonitor> <Request> <ConnectTimeoutInSec>10</ConnectTimeoutInSec> <SocketReadTimeoutInSec>30</SocketReadTimeoutInSec> <Port>443</Port> <Verb>GET</Verb> <Path>/status/200</Path> </Request> <SuccessResponse> <ResponseCode>200</ResponseCode> </SuccessResponse> </HTTPMonitor> </HealthMonitor>
שימו לב שההגדרה של Health Monitor מוגדרת עם קוד התגובה 200 מתחת לרכיב
<SuccessResponse>
. כלומר, אם Edge יקבל קוד תגובה כלשהו (כמו 400, 401, 404, 500) מלבד 200 מה-API לבדיקת תקינות, המערכת תתייחס אליו כשגיאה ותגדיל את מספר הכישלונות. - עכשיו, כדי לבדוק מה הסיבה לתגובה לשגיאה מה-API לבדיקת תקינות, צריך לפעול לפי השלבים הבאים:
- עליך לקרוא את ההודעה שלפני הודעת האזהרה ביומן של מעבד ההודעות.
Apigee-Timer-7 INFO SERVICES.HEALTH_MONITOR - HTTPMonitor.sendRequest() : HTTPMonitor.monitor() : Connecting to https://mocktarget.apigee.net:443/status/200
יש לרשום לפניכם את כתובת ה-URL של בדיקת התקינות מההודעה הזו.
- אפשר לבצע שיחה ישירה לכתובת ה-URL הזו ממעבד ההודעות ולבדוק את התגובה בפועל
curl -i https://mocktarget.apigee.net:443/status/200
התשובה מהשיחה שלמעלה נותנת קוד 404, כמו ביומנים של מעבד ההודעות:
< HTTP/2 404
- האפשרות הזו מראה שאפילו הקריאה הישירה לכתובת ה-URL של בדיקת התקינות נכשלה עם אותו קוד תגובה 404. המשמעות היא שיכול להיות שכתובת ה-URL של בדיקת התקינות שגויה או שהמשאב שאליו מתבצעת גישה כחלק מכתובת ה-URL לא זמין יותר.
- ב-API לדוגמה של בדיקת התקינות שסופקה למעלה, הבעיה מתרחשת כי נעשה שימוש בכתובת URL שגויה בהגדרה של Health Monitor.
כתובת ה-URL הנכונה נמצאה היא
https://mocktarget.apigee.net:443/statuscode/200
מ-Mock Target API. - אם מתקבלת הודעת שגיאה אחרת, צריך לבצע את השלבים שמפורטים למעלה כדי לקבוע מה הסיבה לשגיאה. במקרה הצורך, עובדים עם צוות הקצה העורפי.
רזולוציה
- פותרים את הבעיה ב-API לבדיקת תקינות בשרת הקצה העורפי.
- כדי לתקן את הבעיה בדוגמה שלמעלה:
- משנים את הרכיב
<Path>
בהגדרות של Health Monitor ל-/statuscode/200
, כמו שמוצג בהמשך:<Path>/statuscode/200</Path>
- שומרים את השינויים ב-API Proxy.
אם הבעיה נמשכת, עליכם לקרוא את המאמר חובה לאסוף פרטי אבחון.
אבחון בעיות באמצעות מעקב אחר API
בעזרת API Monitoring אפשר לבודד במהירות אזורים בעייתיים כדי לאבחן שגיאות, ביצועים וזמן אחזור ואת המקור שלהן, כמו אפליקציות למפתחים, שרתי proxy של API, יעדים לקצה העורפי או פלטפורמת ה-API.
שלב תרחיש לדוגמה
שמדגים איך לפתור בעיות של 5xx בממשקי ה-API באמצעות API Monitoring. לדוגמה,
יכול להיות שתרצו להגדיר התראה לקבלת התראה כשמספר השגיאות של messaging.adaptors.http.flow.NoActiveTargets
חורג מסף מסוים.
צריך לאסוף פרטי אבחון
אם הבעיה נמשכת גם אחרי שביצעת את ההוראות שלמעלה, עליך לאסוף את פרטי האבחון הבאים. אפשר לפנות אל התמיכה של Apigee ולשתף אותה:
- אם את/ה משתמש/ת ב-Public Cloud, עליך לספק את הפרטים הבאים:
- שם הארגון
- שם הסביבה
- שם שרת proxy ל-API
- השלמה של פקודת curl לשחזור השגיאה
- קובץ מעקב המכיל את הבקשות עם שירות 503 לא זמין עם קוד השגיאה NoActiveTargets
- אם אתם משתמשים בענן פרטי, עליכם לספק את הפרטים הבאים:
- זוהתה הודעת השגיאה המלאה
- שם הסביבה
- חבילת שרת proxy ל-API
- קובץ מעקב המכיל את הבקשות עם שירות 503 לא זמין עם קוד השגיאה NoActiveTargets
- יומני הגישה של NGINX
(
/opt/apigee/var/log/edge-router/nginx/<org>~<env>.<port#>_access_log
) - יומנים של מעבד הודעות
(
/opt/apigee/var/log/edge-message-processor/logs/system.log
)