502 Bad Gateway - TooBigLine

شما در حال مشاهده مستندات Apigee Edge هستید.
به مستندات Apigee X مراجعه کنید .
اطلاعات

علامت

برنامه‌ی کلاینت، کد وضعیت HTTP 502 Bad Gateway را به همراه کد خطای protocol.http.TooBigLine به عنوان پاسخی برای فراخوانی‌های API دریافت می‌کند.

پیام خطا

برنامه‌ی کلاینت کد پاسخ زیر را دریافت می‌کند:

HTTP/1.1 502 Bad Gateway

علاوه بر این، ممکن است پیام خطای زیر را مشاهده کنید:

{
   "fault":{
      "faultstring":"response line size exceeding 2,048",
      "detail":{
         "errorcode":"protocol.http.TooBigLine"
      }
   }
}

علل احتمالی

این خطا زمانی رخ می‌دهد که اندازه خط پاسخ ارسالی توسط سرور هدف/بک‌اند به Apigee Edge به عنوان بخشی از پاسخ HTTP، بیشتر از حداکثر حد مجاز در Apigee Edge باشد.

قبل از اینکه به دلایل احتمالی این خطا بپردازیم، بیایید بفهمیم که Response-Line به چه معناست و چگونه می‌توان اندازه آن را بررسی کرد.

درک خط پاسخ

یک پاسخ HTTP معمولی از سه بخش تشکیل شده است:

  1. خط وضعیت (که در زبان Apigee به آن خط پاسخ می‌گویند)
  2. (مجموعه‌ای از هدرهای HTTP)
  3. [بدن]

خط پاسخ از سه بخش تشکیل شده است: نسخه پروتکل و به دنبال آن یک کد وضعیت عددی و عبارت متنی مرتبط با آن، همانطور که در زیر نشان داده شده است:

Response-Line   = <HTTP-Version> <Status-Code> <Reason-Phrase>

وقتی یک پاسخ HTTP توسط برنامه سرور هدف/بک‌اند ارسال می‌شود، اولین خطی که ارسال می‌شود، نشان‌دهنده خط پاسخ ( Response-Line) است که در بالا توضیح داده شد. به دنبال آن هدرها و بدنه/بار پاسخ (response body/payload) قرار می‌گیرند. تصویر نمونه زیر یک درخواست معمولی curl ، بخش درخواست (Request ) و بخش پاسخ (Response) (همراه با خط پاسخ) را نشان می‌دهد.

درک اندازه خط پاسخ

  1. در نمونه مورد بحث در بالا، خط شروع (خط اول) در پاسخ که به آن خط پاسخ نیز گفته می‌شود، به شرح زیر است:

    HTTP/1.1 200 OK

    این خط پاسخ، اندازه‌ای در حدود ~15 bytes دارد، زیرا شامل 15 ASCII characters است. از آنجایی که این مقدار در محدوده مجاز Apigee Edge است، پاسخ بدون هیچ خطایی توسط Apigee Edge به کلاینت ارسال می‌شود.

  2. به طور مشابه، اگر به faultstring در پیام خطای نشان داده شده در بالا نگاه کنید، شامل "response line size exceeding 2,048" است. این نشان می‌دهد که خط پاسخ در پاسخ HTTP ارسال شده توسط سرور هدف/backend از 2,048 بایت فراتر رفته است.

درک خط پاسخ بزرگ

طبق تعریف خط وضعیت (که در اینجا به آن خط پاسخ گفته می‌شود) و درخواست‌ها و پاسخ‌های HTTP معمولی، اندازه بسیار کوچکتر از حد پیش‌فرض تعریف شده ۲ کیلوبایت در Apigee Edge خواهد بود، بنابراین ممکن است به این حد نرسیم. با این حال، در اینجا چند سناریوی ممکن وجود دارد که ممکن است از این حد تجاوز کنید:

  1. سرور هدف/backend یک سیستم HTTP نیست. ممکن است با پاسخی غیر از HTTP پاسخ دهد.
  2. سرور هدف/پشتیبان دارای مشکلاتی است و یک خط پاسخ طولانی را به عنوان بخشی از پاسخ HTTP ارسال می‌کند.

برای اطلاعات بیشتر در این مورد به Getting error protocol.http.TooBigLine مراجعه کنید، "اندازه خط پاسخ بیش از 2,048 است ."

در اینجا علل احتمالی خطا آورده شده است:

علت توضیحات دستورالعمل‌های عیب‌یابی قابل اجرا برای
اندازه خط پاسخ بزرگتر از حد مجاز است اندازه خط پاسخ ارسال شده توسط سرور هدف/بک‌اند به عنوان بخشی از پاسخ HTTP به Apigee Edge بیشتر از حد مجاز در Apigee Edge است. کاربران فضای ابری عمومی و خصوصی Edge

مراحل تشخیص مشترک

برای تشخیص این خطا از یکی از ابزارها/تکنیک‌های زیر استفاده کنید:

نظارت بر API

برای تشخیص خطا با استفاده از مانیتورینگ API:

  1. به عنوان کاربری با نقش کاربری مناسب، وارد Apigee Edge UI شوید .
  2. به سازمانی که می‌خواهید مشکل را در آن بررسی کنید، مراجعه کنید.

  3. به صفحه Analyze > API Monitoring > Investigate بروید.
  4. بازه زمانی خاصی را که در آن خطاها را مشاهده کرده‌اید، انتخاب کنید.
  5. شما می‌توانید فیلتر پروکسی را برای محدود کردن کد خطا انتخاب کنید.
  6. رسم کد خطا در مقابل زمان .
  7. سلولی را انتخاب کنید که کد خطا protocol.http.TooBigLine مانند تصویر زیر داشته باشد:

    ( تصویر را بزرگتر ببینید )

  8. اطلاعات مربوط به کد خطا protocol.http.TooBigLine را مطابق شکل زیر مشاهده خواهید کرد:

    ( تصویر را بزرگتر ببینید )

  9. روی «مشاهده گزارش‌ها» کلیک کنید و ردیف مربوط به درخواست ناموفق را باز کنید.

  10. از پنجره Logs ، جزئیات زیر را یادداشت کنید:
    • کد وضعیت: 502
    • منبع خطا: target
    • کد خطا: protocol.http.TooBigLine .
  11. اگر منبع خطا مقدار target و کد خطا مقدار protocol.http.TooBigLine داشته باشد، نشان می‌دهد که پاسخ HTTP از سرور target/backend دارای اندازه خط پاسخ بزرگتر از حداکثر حد مجاز در Apigee Edge است.

ابزار ردیابی

  1. جلسه ردیابی را فعال کنید و یکی از موارد زیر را انجام دهید:
    1. منتظر بمانید تا خطای 502 Bad Gateway رخ دهد. یا
    2. اگر می‌توانید مشکل را دوباره ایجاد کنید، فراخوانی API را انجام دهید و خطای 502 Bad Gateway را دوباره ایجاد کنید.
  2. یکی از درخواست‌های ناموفق را انتخاب کنید و مسیر پیگیری را بررسی کنید.
  3. مراحل مختلف ردیابی را طی کنید و محل وقوع خرابی را پیدا کنید.
  4. معمولاً خطا را درست پس از ارسال درخواست به سرور هدف، مطابق شکل زیر، در قسمت خطای flowinfo مشاهده خواهید کرد:

    به مقادیر خطا از ردیابی توجه کنید:

    • خطا: response line exceeding 2,048
    • کلاس خطا : com.apigee.errors.http.server.BadGateway

    این نشان می‌دهد که Apigee Edge (مؤلفه پردازنده پیام) به محض دریافت پاسخ از سرور backend به دلیل تجاوز اندازه خط پاسخ از حد مجاز، خطا را ارسال می‌کند.

  5. همانطور که در زیر نشان داده شده است، پیام خطایی را که در مرحله پاسخ ارسال شده به کلاینت به کلاینت ارسال می‌شود، مشاهده خواهید کرد:

    ( تصویر را بزرگتر ببینید )

  6. به مقادیر خطا از ردیابی توجه کنید:
    • خطا: 502 Bad Gateway .
    • محتوای خطا: {"fault":{"faultstring":"response line exceeding 2,048","detail":{"errorcode":"protocol.http.TooBigLine"}}}
  7. همچنین می‌توانید در مسیر ردیابی به مرحله AX (داده‌های تحلیلی ثبت‌شده) بروید و روی آن کلیک کنید تا جزئیات خطا را مشاهده کنید.

    ( تصویر را بزرگتر ببینید )

    به مقدار زیر توجه کنید:

    درخواست سربرگ‌ها ارزش
    کد خطای X-Apigee protocol.http.TooBigLine
    منبع گسل X-Apigee target
    محتوای خطا: بدنه {"fault":{"faultstring":"response line size exceeding 2,048","detail":{"errorcode":"protocol.http.TooBigLine"}}}

انجینکس

برای تشخیص خطا با استفاده از گزارش‌های دسترسی NGINX:

  1. اگر شما یک کاربر Private Cloud هستید، می‌توانید از گزارش‌های دسترسی NGINX برای تعیین اطلاعات کلیدی در مورد خطاهای HTTP 502 استفاده کنید.
  2. گزارش‌های دسترسی NGINX را بررسی کنید:

    /opt/apigee/var/log/edge-router/nginx/ ORG ~ ENV . PORT# _access_log

    که در آن: ORG ، ENV و PORT# با مقادیر واقعی جایگزین شده‌اند.

  3. جستجو کنید تا ببینید آیا در یک بازه زمانی خاص خطای 502 وجود دارد یا خیر (اگر مشکل در گذشته رخ داده است) یا اینکه آیا درخواست‌هایی وجود دارد که هنوز با خطای 502 مواجه می‌شوند.
  4. اگر هرگونه خطای 502 با کد خطای X-Apigee-fault-code که با مقدار protocol.http.TooBigLine مطابقت دارد، پیدا کردید، مقدار منبع خطای X-Apigee-fault-source را تعیین کنید.

    ورودی نمونه بالا از لاگ دسترسی NGINX دارای مقادیر زیر برای X-Apigee-fault-code و X-Apigee-fault-source است:

    هدرهای پاسخ ارزش
    کد خطای X-Apigee protocol.http.TooBigLine
    منبع گسل X-Apigee target

علت: اندازه خط پاسخ بزرگتر از حد مجاز است.

تشخیص

  1. کد خطا و منبع خطا را برای خطای مشاهده شده با استفاده از API Monitoring، ابزار Trace یا گزارش‌های دسترسی NGINX، همانطور که در مراحل تشخیص مشترک توضیح داده شده است، تعیین کنید.
  2. اگر منبع خطا مقدار target داشته باشد، نشان می‌دهد که اندازه خط پاسخ ارسال شده توسط برنامه سرور target/backend به Apigee بیشتر از حد مجاز در Apigee Edge است.
  3. شما می‌توانید با استفاده از یکی از روش‌های زیر تأیید کنید که اندازه خط پاسخ از حد مجاز ۲ کیلوبایت فراتر رفته است:

    پیام خطا

    برای اعتبارسنجی با استفاده از پیام خطا:

    اگر به پیام خطای کامل دریافتی از Apigee Edge دسترسی دارید، به faultstring مراجعه کنید.

    نمونه پیام خطا:

    "faultstring":"response line size exceeding 2,048"

    faultstring فوق نشان می‌دهد که اندازه خط پاسخ از حد مجاز ۲ کیلوبایت فراتر رفته است.

    درخواست واقعی

    برای اعتبارسنجی با استفاده از درخواست واقعی:

    اگر به درخواست واقعی ارسال شده به برنامه سرور هدف/بک‌اند دسترسی دارید، مراحل زیر را انجام دهید:

    1. اندازه خط پاسخ را بررسی کنید
    2. اگر متوجه شدید که اندازه URI بیشتر از حد مجاز در Apigee Edge است، پس مشکل از همین جا ناشی می‌شود.

      نمونه پاسخ از سرور هدف/بک‌اند:

      curl -v http://HOSTALIAS/test
      
      *   Trying 3.2.1.4...
      * TCP_NODELAY set
      * Connected to <hostalias> (3.2.1.4) port 80 (#0)
      > GET /test HTTP/1.1
      > Host: HOSTALIAS
      > User-Agent: curl/7.64.1
      > Accept: */*
      >
      < HTTP/1.1 200 1111…<trimmed>...11111111
      < Date: Mon, 26 Jul 2021 07:07:18 GMT
      < Content-Type: application/json
      < Content-Length: 269
      < Connection: keep-alive
      < Server: gunicorn/19.9.0
      < Access-Control-Allow-Origin: *
      < Access-Control-Allow-Credentials: true
      <
      {
      <Response Body>
      }
      * Connection #0 to host <hostalias> left intact
      * Closing connection 0

      در مورد فوق، خط پاسخ HTTP/1.1 200 1111…<trimmed>...11111111 بزرگتر از ۲ کیلوبایت است، یعنی حاوی بیش از ۲ هزار کاراکتر ASCII است.

      اگر از کلاینت دیگری استفاده می‌کنید، می‌توانید لاگ‌های کلاینت را بررسی کنید و سعی کنید اندازه خط پاسخی که به Apigee Edge ارسال می‌شود را پیدا کنید.

    گزارش‌های پردازنده پیام

    برای اعتبارسنجی با استفاده از گزارش‌های پردازشگر پیام:

    اگر شما یک کاربر Private Cloud هستید، می‌توانید از گزارش‌های Message Processor برای تأیید اینکه آیا اندازه خط پاسخ از حد مجاز در Apigee Edge فراتر رفته است یا خیر، استفاده کنید.

    1. شناسه پیام درخواست ناموفق را با استفاده از API Monitoring، ابزار Trace یا گزارش‌های دسترسی NGINX، همانطور که در مراحل تشخیص مشترک توضیح داده شده است، تعیین کنید.
    2. شناسه پیام را در گزارش پردازشگر پیام جستجو کنید:

      /opt/apigee/var/log/edge-message-processor/logs/system.log

    3. خطوطی مشابه خطوط زیر را در system.log خواهید یافت:

      2021-07-26 06:45:41,451 org:myorg env:prod api:testtoobigline rev:1 messageid:r-5110240-1
      NIOThread@1 ERROR HTTP.CLIENT - HTTPClient$Context$3.onException() :
      ClientChannel[Connected: Remote:3.2.1.2:80 Local:192.168.205.251:44398]@20592
      useCount=1 bytesRead=0 bytesWritten=201 age=144ms  lastIO=0ms  isOpen=true.onExceptionRead
      exception: {}
      com.apigee.errors.http.server.BadGateway: response line size exceeding 2,048
      at <snipped>
      
      2021-07-26 06:45:41,451 org:myorg env:prod api:testtoobigline rev:1
      messageid:r-5110240-1  NIOThread@1 ERROR ADAPTORS.HTTP.FLOW -
      AbstractResponseListener.onException() : AbstractResponseListener.onError
      (HTTPResponse@6a5d6c33, response line size exceeding 2,048)

      message = response line size exceeding 2,048 در پیام خطای بالا نشان می‌دهد که اندازه خط پاسخ بیش از 2 کیلوبایت است. بنابراین، Apigee Edge استثنا را صادر می‌کند و کد وضعیت 502 را با کد خطا protocol.http.TooBigline به برنامه‌های کلاینت برمی‌گرداند.

وضوح تصویر

اندازه را ثابت کنید

گزینه شماره ۱ [توصیه شده]: برنامه سرور هدف/بک‌اند را طوری تنظیم کنید که خطوط پاسخ با اندازه بزرگتر از حد مجاز ارسال نکند.

  1. دلیل ارسال خط پاسخ (Response-Line) با اندازه‌ای بیش از حد مجاز، همانطور که در Limits تعریف شده است، توسط یک کلاینت خاص را تجزیه و تحلیل کنید.
  2. اگر مطلوب نیست، برنامه سرور هدف/بک‌اند خود را طوری تغییر دهید که یک خط پاسخ با اندازه کمتر از حد مجاز ارسال کند.
  3. اگر مطلوب است و می‌خواهید یک خط پاسخ با اندازه‌ای بیشتر از حد مجاز ارسال کنید، به گزینه‌های بعدی بروید.

سی دبلیو سی

گزینه شماره ۲: استفاده از ویژگی CwC برای افزایش محدودیت خط پاسخ

Apigee یک ویژگی CwC ارائه می‌دهد که به آن اجازه می‌دهد محدودیت اندازه خط پاسخ را افزایش دهد. برای جزئیات بیشتر، به تنظیم محدودیت خط پاسخ در پردازنده پیام مراجعه کنید.

محدودیت‌ها

شرکت Apigee انتظار دارد که برنامه‌ی کلاینت و سرور backend، خطوط درخواست / پاسخی که اندازه‌ی آنها بزرگتر از حد مجاز ذکر شده در Apigee Edge Limits است را ارسال نکنند.

  1. اگر شما یک کاربر ابر عمومی هستید، حداکثر محدودیت برای اندازه خط درخواست و پاسخ، همانطور که برای اندازه خط درخواست/پاسخ در Apigee Edge Limits مستند شده است، می‌باشد.
  2. اگر شما یک کاربر Private Cloud هستید، ممکن است حداکثر محدودیت پیش‌فرض برای اندازه خط درخواست و پاسخ را تغییر داده باشید (هرچند که این یک روش توصیه شده نیست). می‌توانید حداکثر محدودیت اندازه خط پاسخ را با دنبال کردن دستورالعمل‌های موجود در بخش «نحوه بررسی محدودیت فعلی» تعیین کنید.

چگونه حد فعلی را بررسی کنیم؟

این بخش توضیح می‌دهد که چگونه می‌توان تأیید کرد که ویژگی HTTPResponse.line.limit با مقدار جدیدی در پردازنده‌های پیام به‌روزرسانی شده است.

  1. در دستگاه پردازشگر پیام، در دایرکتوری /opt/apigee/edge-message-processor/conf به دنبال ویژگی HTTPResponse.line.limit بگردید و بررسی کنید که چه مقداری مطابق شکل زیر تنظیم شده است:
    grep -ri "HTTPResponse.line.limit" /opt/apigee/edge-message-processor/conf
    
  2. نتیجه نمونه از دستور بالا به شرح زیر است:
    /opt/apigee/edge-message-processor/conf/http.properties:HTTPResponse.line.limit=2k
  3. در خروجی مثال بالا، توجه کنید که ویژگی HTTPResponse.line.limit با مقدار 2k در http.properties تنظیم شده است.

    این نشان می‌دهد که محدودیت اندازه خط پاسخ پیکربندی‌شده در Apigee برای ابر خصوصی، ۲ کیلوبایت است.

اگر هنوز به هرگونه کمکی از پشتیبانی Apigee نیاز دارید، به بخش «باید اطلاعات تشخیصی را جمع‌آوری کنید» بروید.

باید اطلاعات تشخیصی جمع‌آوری کند

اطلاعات تشخیصی زیر را جمع‌آوری کنید و سپس با پشتیبانی Apigee Edge تماس بگیرید:

اگر کاربر فضای ابری عمومی هستید، اطلاعات زیر را ارائه دهید:

  • نام سازمان
  • نام محیط
  • نام پروکسی API
  • دستور curl کامل که برای بازتولید خطای 502 استفاده می‌شود
  • فایل ردیابی برای درخواست‌های API

اگر کاربر Private Cloud هستید، اطلاعات زیر را ارائه دهید:

  • پیام خطای کامل مشاهده شده برای درخواست‌های ناموفق
  • نام سازمان
  • نام محیط
  • بسته پروکسی API
  • فایل ردیابی برای درخواست‌های ناموفق API
  • دستور curl کامل که برای بازتولید خطای 502 استفاده می‌شود
  • گزارش‌های دسترسی 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