شما در حال مشاهده مستندات Apigee Edge هستید.
به مستندات Apigee X مراجعه کنید . اطلاعات
علامت
برنامهی کلاینت، کد وضعیت HTTP 502 Bad Gateway را به همراه کد خطای protocol.http.DuplicateHeader به عنوان پاسخی برای فراخوانیهای API دریافت میکند.
پیام خطا
برنامهی کلاینت کد پاسخ زیر را دریافت میکند:
HTTP/1.1 502 Bad Gateway
علاوه بر این، ممکن است پیام خطایی مشابه آنچه در زیر نشان داده شده است را مشاهده کنید:
{
"fault":{
"faultstring":"Duplicate Header \"Expires\"",
"detail":{
"errorcode":"protocol.http.DuplicateHeader"
}
}
}علل احتمالی
این خطا زمانی رخ میدهد که یک هدر HTTP خاص که در Apigee Edge مجاز به داشتن تکرار نیست، بیش از یک بار با مقادیر یکسان یا متفاوت، به عنوان بخشی از پاسخ HTTP ارسالی توسط سرور backend به Apigee Edge، ظاهر شود.
طبق RFC 7230، بخش 3.2.2: ترتیب فیلد ، فرستنده نباید چندین فیلد هدر با نام فیلد یکسان در یک پیام ایجاد کند، مگر اینکه یا کل مقدار فیلد برای آن فیلد هدر به عنوان یک لیست جدا شده با کاما تعریف شده باشد، [یعنی #(values)] یا فیلد هدر یک استثنای شناخته شده باشد. اگر Apigee Edge متوجه شود که یک هدر خاص یکسان، که مجاز به داشتن موارد تکراری نیست، بیش از یک بار در پاسخ HTTP ارسال شده توسط سرور هدف/backend ارسال شده است، با خطای 502 Bad Gateway و error code protocol.http.DuplicateHeader پاسخ میدهد.
در اینجا علل احتمالی این خطا آورده شده است:
| علت | توضیحات | دستورالعملهای عیبیابی قابل اجرا برای |
|---|---|---|
| هدر تکراری در پاسخ | پاسخ از سرور backend شامل هدرهای تکراری است. | کاربران فضای ابری عمومی و خصوصی Edge |
مراحل تشخیص مشترک
برای تشخیص این خطا از یکی از ابزارها/تکنیکهای زیر استفاده کنید:
نظارت بر API
برای تشخیص خطا با استفاده از مانیتورینگ API:
- به عنوان کاربری با نقش کاربری مناسب، وارد Apigee Edge UI شوید .
به سازمانی که میخواهید مشکل را در آن بررسی کنید، مراجعه کنید.

- به صفحه Analyze > API Monitoring > Investigate بروید.
- بازه زمانی خاصی را که در آن خطاها را مشاهده کردهاید، انتخاب کنید.
- مطمئن شوید که فیلتر پروکسی روی «همه» تنظیم شده است.
- رسم کد خطا در مقابل زمان .
سلولی را انتخاب کنید که کد خطا
protocol.http.DuplicateHeaderمانند تصویر زیر داشته باشد:
اطلاعات مربوط به کد خطا
protocol.http.DuplicateHeaderمطابق شکل زیر نمایش داده میشود:
- مطمئن شوید که کد وضعیت (Status Code) مطابق مثال بالا
502باشد. - روی «مشاهده گزارشها» کلیک کنید و ردیف مربوط به درخواست ناموفق را باز کنید.

از پنجره Logs، جزئیات زیر را یادداشت کنید:
- کد وضعیت:
502 - منبع خطا:
target - کد خطا:
protocol.http.DuplicateHeader.
- کد وضعیت:
- منبع خطا
targetاست که نشان میدهد پاسخ از سرور backend حاوی هدرهای تکراری بوده است.
ابزار ردیابی
برای تشخیص خطا با استفاده از ابزار Trace:
- جلسه ردیابی را فعال کنید و یا
- منتظر بمانید تا خطای
502 Bad Gatewayرخ دهد یا - اگر میتوانید مشکل را دوباره ایجاد کنید، فراخوانی API را انجام دهید و خطای
502 Bad Gatewayرا دوباره ایجاد کنید.
- منتظر بمانید تا خطای
مطمئن شوید که گزینهی «نمایش تمام اطلاعات جریان» فعال است:

- یکی از درخواستهای ناموفق را انتخاب کنید و مسیر پیگیری را بررسی کنید.
- مراحل مختلف ردیابی را طی کنید و محل وقوع خرابی را پیدا کنید.
معمولاً خطا را در جریانی پس از ارسال درخواست به سرور هدف، مطابق شکل زیر، مشاهده خواهید کرد:

مقدار خطا را از ردیابی یادداشت کنید.
ردیابی نمونه بالا خطایی با عنوان
Duplicate Header "Expires"را نشان میدهد. از آنجایی که این خطا توسط Apigee پس از ارسال درخواست به سرور backend ایجاد شده است، نشان میدهد که سرور backend بیش از یک بار headerExpiresارسال کرده است.- در مسیر ردیابی، به مرحله AX (دادههای تحلیلی ثبتشده) بروید و روی آن کلیک کنید.
به پایین اسکرول کنید تا به بخش Phase Details - Response Headers برسید و مقادیر X-Apigee-fault-code و X-Apigee-fault-source را مطابق شکل زیر تعیین کنید:

- مقادیر X-Apigee-fault-code و X-Apigee-fault-source را به صورت
protocol.http.DuplicateHeaderوtargetمشاهده خواهید کرد که نشان میدهد این خطا به دلیل ارسال هدرهای تکراری توسط سرور backend برای هدر پاسخExpiresایجاد شده است.هدرهای پاسخ ارزش کد خطای X-Apigee protocol.http.DuplicateHeaderمنبع گسل X-Apigee target بررسی کنید که آیا از زنجیرهسازی پروکسی استفاده میکنید یا خیر؛ یعنی، آیا سرور یا نقطه پایانی هدف، پروکسی دیگری را در Apigee فراخوانی میکند یا خیر.
برای تعیین این موضوع، به مرحله درخواست ارسال شده به سرور هدف برگردید. روی نمایش حلقه کلیک کنید.

پنجرهی Curl for Request Sent to Target Server باز میشود که از طریق آن میتوانید نام مستعار میزبان سرور هدف را تعیین کنید.
- اگر نام مستعار میزبان سرور هدف به یک نام مستعار میزبان مجازی اشاره کند، در این صورت از زنجیرهسازی پروکسی استفاده میشود. در این حالت، باید تمام مراحل فوق را برای پروکسی زنجیرهای تکرار کنید تا زمانی که مشخص شود چه چیزی باعث خطای
502 Bad Gatewayمیشود. - اگر نام مستعار میزبان سرور هدف به سرور backend شما اشاره کند، نشان میدهد که سرور backend شما هدرهای تکراری را در پاسخ به Apigee ارسال میکند.
انجینکس
برای تشخیص خطا با استفاده از گزارشهای دسترسی NGINX:
- اگر شما یک کاربر Private Cloud هستید، میتوانید از گزارشهای دسترسی NGINX برای تعیین اطلاعات کلیدی در مورد خطاهای HTTP
502استفاده کنید. گزارشهای دسترسی NGINX را بررسی کنید:
/opt/apigee/var/log/edge-router/nginx/ ORG ~ ENV . PORT# _access_logکه در آن: ORG ، ENV و PORT# با مقادیر واقعی جایگزین شدهاند.
- جستجو کنید تا ببینید آیا در یک بازه زمانی خاص خطای
502وجود دارد یا خیر (اگر مشکل در گذشته رخ داده است) یا اینکه آیا درخواستهایی وجود دارد که هنوز با خطای502مواجه میشوند. اگر هرگونه خطای
502با کد خطای X-Apigee-fault-code که با مقدارprotocol.http.DuplicateHeaderمطابقت دارد، پیدا کردید، مقدار منبع خطای X-Apigee-fault را تعیین کنید.نمونه خطای ۵۰۲ از لاگ دسترسی NGINX:

ورودی نمونه بالا از لاگ NGINX Access دارای مقادیر زیر برای X-Apigee-fault-code و X-Apigee-fault-source است:
هدرهای پاسخ ارزش کد خطای X-Apigee protocol.http.DuplicateHeaderمنبع گسل X-Apigee target
علت: هدر تکراری در پاسخ
تشخیص
- کد خطا و منبع خطا را برای خطای مشاهده شده با استفاده از API Monitoring یا گزارشهای دسترسی NGINX، همانطور که در مراحل تشخیص مشترک توضیح داده شده است، تعیین کنید.
- اگر منبع خطا مقدار
targetداشته باشد، نشان میدهد که پاسخ ارسالی توسط سرور هدف حاوی هدرهای تکراری است. شما میتوانید با استفاده از یکی از روشهای زیر، هدر واقعی که بیش از یک بار به عنوان بخشی از پاسخ ارسال میشود را تعیین کنید:
پیام خطا
استفاده از پیام خطا:
اگر به پیام خطای کامل دریافتی از Apigee Edge دسترسی دارید، به
faultstringمراجعه کنید.faultstringشامل نام هدری است که بیش از یک بار ارسال شده است.نمونه پیام خطا:
"faultstring":"Duplicate Header \"Expires\""
- در پیام خطای بالا، همانطور که در
faultstringمشاهده میشود، میتوانید ببینید که هدرExpiresبیش از یک بار ارسال شده است.
درخواست واقعی
استفاده از درخواست واقعی:
- اگر به درخواست واقعی ارسال شده به سرور هدف دسترسی ندارید، دستور
curlمربوطه را از بخش «استفاده از ابزار Trace» در مراحل 10.a و 10.b دریافت کنید. اگر به درخواست واقعی ارسال شده به برنامه سرور هدف دسترسی دارید، مراحل زیر را انجام دهید:
با سرور هدف تماس بگیرید.
نمونه درخواست برای سرور هدف مورد استفاده در این مثال:
curl -X GET "https://BACKEND_SERVER_HOST/response-headers?Expires=Mon%2C%2021%20June%202021%2007%3A28%3A00%20GMT&Expires=Mon%2C%2021%20June%202021%2007%3A28%3A00%20GMT" -v
لیست هدرهای مشاهده شده در پاسخ را تأیید کنید.
نمونه پاسخ از سرور هدف مورد استفاده در این مثال:
* ...Trimmed... > GET /response-headers?Expires=Mon%2C%2021%20June%202021%2007%3A28%3A00%20GMT&Expires=Mon%2C%2021%20June%202021%2007%3A28%3A00%20GMT HTTP/2 > Host: BACKEND_SERVER_HOST > User-Agent: curl/7.64.1 > Accept: */* > * Connection state changed (MAX_CONCURRENT_STREAMS == 128)! < HTTP/2 200 < date: Fri, 02 Jul 2021 05:29:07 GMT < content-type: application/json < content-length: 166 < server: gunicorn/19.9.0 < Expires: Mon, 21 June 2021 07:28:00 GMT < Expires: Mon, 21 June 2021 07:28:00 GMT < access-control-allow-origin: * < access-control-allow-credentials: true < ----<Response BODY>------ * Connection #0 to host httpbin.org left intact * Closing connection 0
در درخواست مثال بالا، هدر
Expiresبیش از یک بار ارسال میشود. بنابراین، این درخواست با خطای502 Bad Gatewayو کد خطا:protocol.http.DuplicateHeaderبا شکست مواجه میشود.اگر هدری که نام آن در
faultstringآمده است، بیش از یک بار در پاسخ سرور backend ظاهر شود، دلیل این خطا همین است. در مورد فوق، هدرExpiresبیش از یک بار ارسال شده است.
وضوح تصویر
رفع مشکل تکراری بودن
گزینه شماره ۱ [گزینه پیشنهادی] سرور بکاند را طوری تنظیم کنید که هدرهای تکراری را شامل نشود
- دلیل ارسال تکراری بودن هدر
Expiresتوسط سرور بکاند خاص را تجزیه و تحلیل کنید و بررسی کنید که آیا پذیرش آن توسط پراکسیهای API اشکالی ندارد یا خیر. در بیشتر موارد، طبق مشخصات HTTP RFC7230 ، این کار مطلوب نخواهد بود. - اگر مطلوب نیست، برنامه سرور هدف خود را طوری تغییر دهید که هدرهای تکراری ارسال نکند. در مثالی که در بالا مورد بحث قرار گرفت، مشاهده میشود که هدر
Expiresدو بار با مقدار یکسان ارسال میشود که مطلوب نیست. میتوانید با اطمینان از اینکه سرور هدف فقط یک بار هدرExpiresرا ارسال میکند، این مشکل را برطرف کنید. - اگر مطلوب است و میخواهید هدرهای تکراری را مجاز کنید، به گزینه شماره ۲ با استفاده از ویژگی CwC بروید.
سی دبلیو سی
گزینه شماره ۲ استفاده از ویژگی CwC
Apigee یک ویژگی CwC HTTPHeader.<HeaderName> ارائه میدهد که به برنامههای کلاینت و سرورهای هدف اجازه میدهد تا هدرهای تکراری را به پروکسیهای API در Apigee Edge ارسال کنند.
| ملک CwC | ارزشها |
|---|---|
HTTPHeader.<HeaderName> | allowDuplicates,multivalued |
برای مثال، میتوان ویژگی زیر را روی پردازندههای پیام تنظیم کرد تا مقادیر تکراری و چندگانه برای هدر Expires مجاز باشند.
HTTPHeader.Expires=allowDuplicates, multiValued
- اگر شما یک کاربر Private Cloud هستید، میتوانید با استفاده از راهنمای نحوهی پیکربندی پردازندههای پیام برای استفاده از هدرهای تکراری ، این ویژگی را طوری پیکربندی کنید که از ایجاد خطای
502 Bad Gatewayدر Apigee Edge جلوگیری کند، حتی اگر درخواست حاوی هدرهای تکراری باشد. - اگر شما یک کاربر فضای ابری عمومی هستید، برای پیکربندی این ویژگی برای سازمان خود با پشتیبانی Apigee Edge تماس بگیرید.
مشخصات
Apigee با خطای 502 Bad Gateway پاسخ میدهد، زیرا انتظار دارد سرور backend مطابق با مشخصات RFC زیر رفتار کند:
| مشخصات |
|---|
| RFC 7230، بخش 3.2.2: ترتیب فیلد |
| RFC 7230، بخش 3.2: فیلدهای سرآیند |
اگر هنوز به هرگونه کمکی از پشتیبانی Apigee نیاز دارید، به بخش «باید اطلاعات تشخیصی را جمعآوری کنید» بروید.
باید اطلاعات تشخیصی جمعآوری کند
اطلاعات تشخیصی زیر را جمعآوری کنید و سپس با پشتیبانی Apigee Edge تماس بگیرید.
اگر کاربر فضای ابری عمومی هستید، اطلاعات زیر را ارائه دهید:
- نام سازمان
- نام محیط
- نام پروکسی API
- دستور
curlکامل که برای بازتولید خطای502استفاده میشود - فایل ردیابی برای درخواستهای API
اگر کاربر Private Cloud هستید، اطلاعات زیر را ارائه دهید:
- پیام خطای کامل مشاهده شده برای درخواستهای ناموفق
- نام محیط
- بسته پروکسی API
- فایل ردیابی برای درخواستهای API
گزارشهای دسترسی NGINX:
/opt/apigee/var/log/edge-router/nginx/ ORG ~ ENV . PORT# _access_logکه در آن: ORG ، ENV و PORT# با مقادیر واقعی جایگزین شدهاند.
- گزارشهای سیستم پردازشگر پیام
/opt/apigee/var/log/edge-message-processor/logs/system.log