‫۵۰۲ دروازه نادرست - 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 باشد.

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

آشنایی با «خط پاسخ»

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

  1. خط وضعیت (در Apigee به‌عنوان خط پاسخ نامیده می‌شود)
  2. ( مجموعه سرصفحه‌های HTTP )
  3. [ Body ]

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

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

وقتی برنامه سرور هدف/زیرینه پاسخ HTTP را ارسال می‌کند، اولین خطی که ارسال می‌شود نشان‌دهنده خط پاسخ است که در بالا توضیح داده شد. پس‌از آن، سرصفحه‌ها و بدنه/بار پاسخ می‌آید.نماگرفت نمونه زیر یک curl درخواست معمولی، بخش درخواست، و بخش پاسخ (به‌همراه «خط پاسخ») را نشان می‌دهد.

آشنایی با اندازه «خط پاسخ»

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

    HTTP/1.1 200 OK

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

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

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

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

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

درباره این موضوع در دریافت خطای protocol.http.TooBigLine،‏ «اندازه خط پاسخ از ۲٬۰۴۸ فراتر رفته است» بیشتر بخوانید.

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

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

مراحل متداول تشخیص خرابی

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

پایش میانای برنامه‌سازی کاربردی

برای تشخیص خطا بااستفاده از «پایش API»:

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

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

    ( مشاهده تصویر بزرگ‌تر)

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

    ( مشاهده تصویر بزرگ‌تر)

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

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

ابزار ردیابی

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

    مقادیر خطا را از ردیابی یادداشت کنید:

    • خطا: response line exceeding 2,048
    • error.class: com.apigee.errors.http.server.BadGateway

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

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

    ( مشاهده تصویر بزرگ‌تر)

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

    ( مشاهده تصویر بزرگ‌تر)

    مقدار موارد زیر را یادداشت کنید:

    سرایندهای درخواست مقدار
    X-Apigee-fault-code protocol.http.TooBigLine
    X-Apigee-fault-source target
    محتوای خطا : بدنه {"fault":{"faultstring":"response line size exceeding 2,048","detail":{"errorcode":"protocol.http.TooBigLine"}}}

NGINX

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

  1. اگر کاربر «ابر خصوصی» هستید، می‌توانید از گزارش‌های دسترسی NGINX برای تعیین اطلاعات کلیدی درباره خطاهای 502 HTTP استفاده کنید.
  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-fault-code protocol.http.TooBigLine
    X-Apigee-fault-source target

دلیل: اندازه «خط پاسخ» از حد مجاز بیشتر است

تشخیص

  1. کد خطا و منبع خطا را برای خطای مشاهده‌شده بااستفاده از API Monitoring، ابزار Trace، یا گزارش‌های دسترسی NGINX همان‌طور که در مراحل تشخیص متداول توضیح داده شده است تعیین کنید.
  2. اگر منبع خطا مقدار target را داشته باشد، این نشان می‌دهد که اندازه «خط پاسخ» ارسال‌شده توسط برنامه سرور هدف/زیرینه به 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 را پیدا کنید.

    گزارش‌های «پردازشگر پیام»

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

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

    1. شناسه پیام درخواست ناموفق را بااستفاده از «پایش میانای برنامه‌سازی کاربردی»، ابزار «ردیابی»، یا گزارش‌های دسترسی 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 در پیام خطای بالا نشان می‌دهد که اندازه «خط پاسخ» بیش‌از ۲ کیلوبایت است. بنابراین، Apigee Edge استثنا را ایجاد می‌کند و کد وضعیت 502 را با کد خطای protocol.http.TooBigline به برنامه‌های مشتری برمی‌گرداند.

وضوح

اندازه ثابت

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

  1. دلیل ارسال «خط پاسخ» با اندازه بیشتر از حد مجاز تعریف‌شده در حدود توسط مشتری خاص را تجزیه‌وتحلیل کنید.
  2. اگر مطلوب نیست، برنامه سرور هدف/زیرین خود را به‌گونه‌ای اصلاح کنید که «خط پاسخ» با اندازه کمتر از حد مجاز ارسال کند.
  3. اگر مطلوب است و می‌خواهید «خط پاسخ» با اندازه بیشتر از حد مجاز ارسال کنید، به گزینه‌های بعدی بروید.

CwC

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

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

محدودیت‌ها

‫Apigee انتظار دارد که برنامه کارخواه و سرور پشتیبان «خطوط درخواست/پاسخ» با اندازه‌های بزرگ‌تر از حد مجاز را که در محدودیت خط درخواست/پاسخ در محدودیت‌های Apigee Edge مستند شده است ارسال نکنند.

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

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

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

  1. در ماشین «پردازشگر پیام»، دارایی HTTPResponse.line.limit را در /opt/apigee/edge-message-processor/conf دایرکتوری جستجو کنید و بررسی کنید چه مقداری تنظیم شده است، همان‌طور که در زیر نشان داده شده است:
    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 برای Private Cloud ۲ کیلوبایت است.

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

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

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

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

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