درحال مشاهده اسناد Apigee Edge هستید.
به
اسناد Apigee X بروید. اطلاعات
نشانه
برنامه مشتری در پاسخ به فراخوانیهای API، کد وضعیت HTTP 504 را با پیام
Gateway Timeout دریافت میکند.
این پاسخ خطا نشان میدهد که کارخواه درطول اجرای فراخوانی API از Apigee Edge یا سرور زیرینه پاسخ بهموقع دریافت نکرده است.
پیام خطا
برنامه کارخواه کد پاسخ زیر را دریافت میکند:
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خطایی برمیگرداند.
این کتابچه راهنما نحوه عیبیابی و رفع خطای 504 را که در اثر
اتمام زمان «مسیریاب» ایجاد میشود شرح میدهد.
مهلت در رهیاب
مهلت زمانی پیشفرض پیکربندیشده در «مسیریابها» در Apigee Edge ۵۷ ثانیه است. این حداکثر مدت زمانی است که یک پراکسی API میتواند از زمان دریافت درخواست API در Edge تا زمان ارسال پاسخ، ازجمله پاسخ زیرینه و همه خطمشیهایی که اجرا میشوند، اجرا شود. مهلت زمانی پیشفرض را میتوان در «رهیابها/میزبانهای مجازی» همانطور که در پیکربندی مهلت زمانی ورودی/خروجی در «رهیابها» توضیح داده شده است ملغی کرد.
علل احتمالی
در Edge، دلایل معمول خطای 504 Gateway Timeout که بهدلیل
اتمام زمان روتر ایجاد میشود عبارتاند از:
| علت | شرح | دستورالعملهای عیبیابی برای موارد زیر قابلاجرا است |
|---|---|---|
| پیکربندی زمان اتمام نادرست در «رهیاب» | این اتفاق زمانی رخ میدهد که «مسیریاب» با دوره زمانبندی I/O نادرست پیکربندی شده باشد. | کاربران «فضای ابری خصوصی و عمومی لبهای» |
مراحل متداول تشخیص خرابی
برای تشخیص این خطا، از یکی از ابزارها/تکنیکهای زیر استفاده کنید:
- پایش میانای برنامهسازی کاربردی
- گزارشهای دسترسی NGINX
پایش میانای برنامهسازی کاربردی
برای تشخیص خطا بااستفاده از «پایش API»:
- به صفحه تجزیهوتحلیل > پایش API > بررسی پیمایش کنید.
- برای
5xxخطا فیلتر کنید و بازه زمانی را انتخاب کنید. - کد وضعیت را دربرابر زمان طرح کنید.
-
روی سلول خاصی که
504خطا را نشان میدهد کلیک کنید تا جزئیات بیشتری ببینید و گزارشهای مربوط به این خطاها را همانطور که در زیر نشان داده شده است مشاهده کنید:مثالی از نمایش خطاهای ۵۰۴

- در قاب سمت چپ، روی مشاهده گزارشها کلیک کنید.

از پنجره گزارشهای ترافیک، جزئیات زیر را برای برخیاز خطاهای
504یادداشت کنید:- درخواست: این بخش روش درخواست و نشانی وب استفادهشده برای برقراری تماسها را ارائه میدهد
- زمان پاسخ: این مورد کل زمان سپریشده برای درخواست را ارائه میدهد.
در مثال بالا،
- درخواست به
GET /test-timeoutاشاره میکند. - زمان پاسخ
57.001ثانیه است. این نشان میدهد که «رهیاب» قبلاز اینکه «پردازنده پیام» بتواند پاسخ دهد زمانبندی شده است، زیرا مقدار بسیار نزدیک به مهلت زمانی I/O پیشفرض تنظیمشده در «رهیاب» است که ۵۷ ثانیه است.
همچنین میتوانید بااستفاده از API «نظارت بر API» دریافت گزارشهای API همه گزارشها را دریافت کنید. برای مثال، با پُرسمان کردن گزارشهای
org،env،timeRange، وstatus، میتوانید همه گزارشهای مربوط به تراکنشهایی را که مشتری برای آنها زمانبندی کرده است بارگیری کنید.ازآنجاییکه «پایش میانای برنامهسازی کاربردی» پراکسی را برای این
504خطاها روی-(تنظیمنشده) تنظیم میکند، میتوانید از میانای برنامهسازی کاربردی (میانای برنامهسازی کاربردی گزارشها) برای دریافت پراکسی مرتبط با میزبان مجازی و مسیر استفاده کنید.برای مثال :
curl "https://apimonitoring.enterprise.apigee.com/logs/apiproxies?org=ORG&env=ENV&select=https
- زمان پاسخ را برای خطاهای اضافی
504مرور کنید و بررسی کنید آیا زمان پاسخ در همه خطاهای504یکسان است یا نه (مقدار مهلت زمانی ورودی/خروجی در «مسیریاب» روی ۵۷ ثانیه تنظیم شده است).
گزارشهای دسترسی NGINX
برای تشخیص خطا بااستفاده از گزارشهای دسترسی NGINX:
- گزارشهای دسترسی NGINX را بررسی کنید:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log - جستجو کنید تا ببینید آیا در طول مدت مشخصی
504خطا وجود دارد یا نه (اگر مشکل در گذشته رخ داده است) یا اینکه آیا هنوز درخواستهایی با504ناموفق هستند یا نه. - اطلاعات زیر را برای برخیاز خطاهای
504درنظر داشته باشید:- زمان پاسخدهی
- URI درخواست

در این مثال، اطلاعات زیر را میبینیم:
-
زمان درخواست:
57.001ثانیه. این نشان میدهد که «رهیاب» پساز ۵۷٫۰۰۱ ثانیه زمانسنجی را متوقف کرد. - درخواست:
GET /test-timeout - نام مستعار میزبان:
myorg-test.apigee.net
-
بررسی کنید که آیا زمان درخواست با زمان اتمام I/O پیکربندیشده در «میزبان مجازی/رهیاب» یکسان است یا نه. اگر بله، یعنی «مسیریاب» قبلاز اینکه «پردازشگر پیام» در این دوره پاسخ دهد، زمانش بهپایان رسیده است.
در ورودی «گزارش دسترسی NGINX» نشاندادهشده در بالا، زمان درخواست
57.001ثانیه بسیار نزدیک به زمان وقفه I/O پیشفرض تنظیمشده در «مسیریاب» است. این خطا بهوضوح نشان میدهد که «روتر» قبلاز اینکه «پردازشگر پیام» بتواند پاسخ دهد، زمانبندیاش بهپایان رسیده است. - بااستفاده از مسیر پایه در فیلد درخواست ، «پراکسی میانای برنامهسازی کاربردی» را که درخواست برای آن ارسال شده است تعیین کنید.
دلیل: پیکربندی زمان اتمام نادرست در «مسیریاب»
تشخیص
- تعیین کنید که آیا خطاهای
504بهدلیل این است که «مسیریاب» قبلاز اینکه «پردازشگر پیام» بتواند پاسخ دهد، زمانش بهپایان رسیده است. میتوانید این کار را با بررسی اینکه آیا زمان پاسخ در «پایش میانای برنامهسازی کاربردی»/ زمان درخواست در «مسیریاب» (هر دو فیلد اطلاعات یکسانی را نشان میدهند، اما نامهای متفاوتی دارند) با مهلت زمانی ورودی/خروجی پیکربندیشده در «مسیریاب»/ میزبان مجازی یکسان است یا نه و فیلدهای منبع خطا، پراکسی خطا، و کد خطا روی-تنظیم شدهاند یا نه بااستفاده از «پایش میانای برنامهسازی کاربردی» یا گزارشهای «دسترسی NGINX» همانطور که در مراحل تشخیص خرابی رایج توضیح داده شده است انجام دهید. -
بررسی کنید که مقدار مهلت زمانی ورودی/خروجی پیکربندیشده در «رهیاب» یا میزبان مجازی خاص در مقایسه با مقدار پیکربندیشده در «پردازشگر پیام» یا «پراکسی API» خاص پایینتر باشد.
با دنبال کردن مراحل این بخش میتوانید این کار را انجام دهید.
درحال درستیسنجی کردن مهلت زمانی ورودی/خروجی در میزبانهای مجازی
میانای کاربر Edge
برای تأیید کردن زمان اتمام میزبان مجازی بااستفاده از «واسط کاربر Edge»، این کارها را انجام دهید:
- به سیستم «واسط کاربر Edge» وارد شوید.
- به سرپرست > میزبانهای مجازی پیمایش کنید.
- محیط خاصی را که در آن با مشکل اتمام زمان مواجه هستید انتخاب کنید.
- میزبان مجازی خاصی را که میخواهید مقدار مهلت زمانی ورودی/خروجی آن را درستیسنجی کنید انتخاب کنید.
- در بخش داراییها، مقدار زمان انتظار خواندن پراکسی را برحسب ثانیه مشاهده کنید.

در مثال بالا، Proxy Read Timeout با مقدار
120پیکربندی شده است. این یعنی زمان وقفه ورودی/خروجی پیکربندیشده در این میزبان مجازی ۱۲۰ ثانیه است.
میاناهای برنامهسازی کاربردی مدیریت
همچنین میتوانید مهلت خواندن پراکسی را بااستفاده از میاناهای برنامهسازی کاربردی مدیریت زیر بهتأیید برسانید:
-
میانای برنامهسازی کاربردی دریافت میزبان مجازی را اجرا کنید تا پیکربندی
virtualhostرا همانطور که در زیر نشان داده شده است دریافت کنید:کاربر «ابر عمومی»
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 که در این میزبان مجازی پیکربندی شده است ۱۲۰ ثانیه است.
درحال درستیسنجی کردن مهلت زمانی ورودی/خروجی در فایل 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 در «رهیاب» برای میزبان مجازی پیشفرض روی ۵۷ ثانیه پیکربندی شده است. اگر چندین میزبان مجازی دارید، این اطلاعات را برای هریک از آنها خواهید دید. مقدارproxy_read_timeoutرا برای میزبان مجازی خاصی که برای انجام دادن تماسهای میانای برنامهسازی کاربردی استفاده کردهاید و با خطاهای504ناموفق بوده است دریافت کنید.
درحال درستیسنجی کردن زمان اتمام ورودی/خروجی در پراکسی میانای برنامهسازی کاربردی
میتوانید مهلت زمانی ورودی/خروجی را در موارد زیر مشاهده کنید:
- نقطه پایان هدف میانای برنامهسازی کاربردی وکالتی
- خطمشی «فراخوانی سرویس» میانای برنامهسازی کاربردی
مشاهده درنگ ورودی/خروجی در نقطه پایان هدف میانای برنامهسازی کاربردی
- در «میانای کاربر Edge»، پراکسی API خاصی را که میخواهید مقدار مهلت زمانی I/O در آن را مشاهده کنید انتخاب کنید.
- نقطه پایانی هدف خاصی را که میخواهید بررسی کنید انتخاب کنید.
- دارایی
io.timeout.millisرا با مقدار مناسب در عنصر<HTTPTargetConnection>در پیکربندیTargetEndpointببینید.برای مثال، مهلت زمانی ورودی/خروجی در کد زیر روی ۱۲۰ ثانیه تنظیم شده است:
<Properties> <Property name="io.timeout.millis">120000</Property> </Properties>
مشاهده زمان اتمام I/O در خطمشی ServiceCallout میانای برنامهسازی کاربردی
- در «میانای کاربر Edge»، پراکسی API خاصی را که میخواهید مقدار جدید مهلت زمانی I/O را برای خطمشی «تماس با سرویس» در آن مشاهده کنید انتخاب کنید.
- خطمشی «خدماتتماس» خاصی را که میخواهید بررسی کنید انتخاب کنید.
-
عنصر
<Timeout>را با مقدار مناسب در پیکربندی<ServiceCallout>ببینید.برای مثال، زمان اتمام I/O کد زیر ۱۲۰ ثانیه خواهد بود:
<Timeout>120000</Timeout>
درحال درستیسنجی درنگ ورودی/خروجی در «پردازشگرهای پیام»
- به سیستم ماشین «پردازشگر پیام» وارد شوید.
-
بااستفاده از فرمان زیر، دارایی
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 باموفقیت روی «پردازشگر پیام» روی ۵۵ ثانیه پیکربندی شده است.
پساز اینکه زمان اتمام پیکربندیشده در «رهیاب» و «پردازشگر پیام» را تعیین کردید، بررسی کنید که آیا «رهیاب»/ میزبان مجازی با مقدار زمان اتمام کمتری نسبت به مقدار زمان اتمام در «پردازشگر پیام»/ کارگزار میانای برنامهسازی کاربردی پیکربندی شده است یا نه.
مقادیر تنظیمشده در همه لایهها را همانطور که در جدول زیر نشان داده شده است یادداشت کنید:
| پایان درنگ در «رهیاب» (ثانیه) | مهلت میزبان مجازی (ثانیه) | پایان درنگ در «پردازشگر پیام» (ثانیه) | مهلت تمام شدن کارگزار نیابتی API (ثانیه) |
|---|---|---|---|
| 57 | - | ۵۵ | ۱۲۰ |
در این مثال،
- مقدار پیشفرض ۵۷ ثانیه در «رهیاب» پیکربندی شده است.
- مقدار مهلت زمانی در میزبان مجازی خاص تنظیم نشده است. این یعنی از مقدار پیشفرض ۵۷ ثانیه که در خود «مسیریاب» پیکربندی شده است استفاده خواهد کرد.
- در «پردازشگر پیام»، مقدار پیشفرض ۵۵ ثانیه پیکربندی شده است.
- بااینحال، در «پراکسی میانای برنامهسازی کاربردی» خاص، مقدار ۱۲۰ ثانیه پیکربندی شده است.
توجه داشته باشید که مقدار مهلت زمانی بالاتر فقط در پراکسی API پیکربندی شده است، اما «مسیریاب» همچنان با ۵۷ ثانیه پیکربندی شده است. بنابراین، «مسیریاب» در ۵۷ ثانیه زمانبندی میشود درحالیکه «پردازنده پیام»/ زیرینه همچنان درحال پردازش درخواست شما است. این کار باعث میشود «مسیریاب» با
504 Gateway Timeout خطا به برنامه کلاینت پاسخ دهد.
وضوح
برای پیکربندی کردن زمان اتمام مناسب ورودی/خروجی در «مسیریاب» و «پردازشگر پیام» برای حل این مشکل، مراحل زیر را انجام دهید.
- برای درک اینکه مقادیر مهلت زمانی باید روی اجزای مختلف درگیر در جریان درخواست API ازطریق Apigee Edge تنظیم شود، به روالهای مطلوب برای پیکربندی مهلت زمانی ورودی/خروجی مراجعه کنید.
- در مثال بالا، اگر متوجه شدید که مقدار مهلت زمانی بالاتری باید تنظیم شود
زیرا سرور زیرینه به زمان بیشتری نیاز دارد، و مقدار مهلت زمانی
«پردازنده پیام» را به ۱۲۰ ثانیه افزایش دادهاید، مقدار مهلت زمانی بالاتری را برای
مثال:
123 secondsدر «مسیریاب» تنظیم کنید. برای اینکه مقدار جدید مهلت زمانی روی همه «پراکسیهای API» تأثیر نگذارد، مقدار123 secondsرا فقط در میزبان مجازی خاصی که در «پراکسی API» خاص استفاده میشود تنظیم کنید. - برای تنظیم زمان اتمام در میزبان مجازی، دستورالعملهای پیکربندی زمان اتمام ورودی/خروجی در مسیریابها را دنبال کنید.