سرویس 503 در دسترس نیست - ایجاد تونل پراکسی با 403 انجام نشد

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

علامت

برنامه‌ی کلاینت، کد وضعیت HTTP 503 Service Unavailable را به همراه کد خطای protocol.http.ProxyTunnelCreationFailed به عنوان پاسخی برای فراخوانی‌های API دریافت می‌کند.

پیام خطا

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

HTTP/1.1 503 Service Unavailable

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

{
   "fault":{
      "faultstring":"Proxy refused to create tunnel with response status 403",
      "detail":{
         "errorcode":"protocol.http.ProxyTunnelCreationFailed"
      }
   }
}

پروکسی رو به جلو و تونلینگ

Apigee Edge به پروکسی‌های API شما اجازه می‌دهد تا از طریق یک پروکسی سرور، همانطور که در بخش پیکربندی پروکسی رو به جلو توضیح داده شده است، با سرور backend شما ارتباط برقرار کنند. پروکسی سرور بسته به نوع پروکسی ( که با ویژگی HTTPClient.proxy.type نشان داده شده است) مورد استفاده، یک اتصال امن (HTTPS) یا غیر امن (HTTP) به سرور backend باز می‌کند و داده‌ها را در هر دو جهت منتقل می‌کند. این عمل به عنوان تونلینگ شناخته می‌شود.

به طور پیش‌فرض، Apigee Edge برای تمام ترافیک از تونلینگ استفاده می‌کند. برای غیرفعال کردن تونلینگ، ویژگی HTTPClient.use.tunneling باید روی false تنظیم شود.

کد خطا: protocol.http.ProxyTunnelCreationFailed

اگر سرور پروکسی به دلیل مشکلاتی مانند فایروال، محدودیت‌های ACL (لیست کنترل دسترسی)، مشکلات DNS، در دسترس نبودن سرور backend، timeout و غیره قادر به ایجاد تونل بین Apigee Edge و سرور backend نباشد، Apigee Edge کد خطای protocol.http.ProxyTunnelCreationFailed را برمی‌گرداند.

کد وضعیت موجود در رشته‌ی faultstring پاسخ از Apigee Edge معمولاً نشان‌دهنده‌ی یک علت سطح بالای احتمالی است که منجر به این خطا شده است.

الگوی رشته خطا:

Proxy refused to create tunnel with response status STATUS_CODE

دلایل احتمالی برخی از کدهای وضعیت مشاهده شده در faultstring:

جدول زیر دلایل احتمالی را بسته به کد وضعیت نشان داده شده در faultstring شرح می‌دهد:

رشته خطا توضیحات
پروکسی از ایجاد تونل با وضعیت پاسخ 403 خودداری کرد

403 - Forbidden

این می‌تواند به دلیل محدودیت‌های فایروال یا ACL پیکربندی شده روی سرور backend باشد که از ایجاد تونل جلوگیری می‌کند.

پروکسی از ایجاد تونل با وضعیت پاسخ 503 خودداری کرد

503 - Service Unavailable

این می‌تواند به دلیل مشکلات DNS، محدودیت‌های فایروال، عدم دسترسی به سرور backend که مانع ایجاد تونل می‌شود، رخ دهد.

پروکسی از ایجاد تونل با وضعیت پاسخ ۵۰۴ خودداری کرد

504 - Gateway Timeout

این اتفاق می‌تواند در صورت وجود وقفه در طول ایجاد تونل رخ دهد.

بسته به کد وضعیت مشاهده شده در faultstring ، شما باید از تکنیک‌های مناسب برای عیب‌یابی مشکل استفاده کنید. این راهنما توضیح می‌دهد که اگر کد وضعیت 403 را در faultstring برای کد خطای protocol.http.ProxyTunnelCreationFailed مشاهده کردید، چگونه مشکل را عیب‌یابی کنید.

علل احتمالی

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

علت توضیحات دستورالعمل‌های عیب‌یابی قابل اجرا برای
پروکسی از ایجاد تونل با وضعیت پاسخ ۴۰۳ خودداری کرد سرور پروکسی از ایجاد تونل خودداری می‌کند زیرا نام میزبان سرور پروکسی را به جای نام میزبان سرور Backend در هدر Host دریافت می‌کند. فقط برای کاربران Edge Private Cloud

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

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

ابزار ردیابی

برای تشخیص خطا با استفاده از ابزار Trace:

  1. جلسه ردیابی را فعال کنید و یکی از موارد زیر را انجام دهید:
    • منتظر بمانید تا خطا رخ دهد، یا
    • اگر می‌توانید مشکل را دوباره ایجاد کنید، فراخوانی API را برای ایجاد مجدد مشکل انجام دهید 503 Service Unavailable با Proxy refused to create tunnel with response status 403 .
  2. مطمئن شوید که گزینه‌ی Show all FlowInfos فعال است:

  3. یکی از درخواست‌های ناموفق را انتخاب کنید و مسیر پیگیری را بررسی کنید.
  4. مراحل مختلف ردیابی را طی کنید و محل وقوع خرابی را پیدا کنید.
  5. معمولاً پس از شروع مرحله‌ی «جریان درخواست هدف»، خطایی مانند تصویر زیر مشاهده خواهید کرد:

    به اطلاعات زیر توجه کنید:

    خطا: Proxy refused to create tunnel with response status 403

  6. در مسیر ردیابی، به مرحله AX (داده‌های تحلیلی ثبت‌شده) بروید و روی آن کلیک کنید.
  7. به پایین اسکرول کنید تا به بخش Phase Details Response Headers برسید و مقادیر X-Apigee-fault-code و X-Apigee-fault-source را مطابق شکل زیر تعیین کنید:

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

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

  8. مقادیر X-Apigee-fault-code و X-Apigee-fault-source را به صورت protocol.http.ProxyTunnelCreationFailed و target مشاهده خواهید کرد. target به ترتیب، نشان می‌دهد که این خطا به دلیل عدم موفقیت در ایجاد تونل پروکسی ایجاد شده است زیرا هدر میزبان مورد انتظار دریافت نشده است.

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

انجینکس

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

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

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

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

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

    نمونه خطای ۵۰۳ از لاگ دسترسی NGINX:

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

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

علت: پروکسی از ایجاد تونل با وضعیت پاسخ ۴۰۳ خودداری کرد

تشخیص

  1. کد خطا و منبع خطا را برای 503 Service Unavailable با استفاده از ابزار Trace یا گزارش‌های دسترسی NGINX، همانطور که در مراحل تشخیص مشترک توضیح داده شده است، تعیین کنید.
  2. پیام خطا را بررسی کنید و کد وضعیت نشان داده شده در faultstring را برای عدم موفقیت در ایجاد تونل تعیین کنید.
  3. در این سناریو، کد وضعیت 403 است که به معنی ممنوعه (Forbidden ) است.
  4. این بدان معناست که حقوق یا امتیازات کافی برای ایجاد تونل وجود ندارد. این معمولاً زمانی اتفاق می‌افتد که محدودیت‌هایی از سوی فایروال یا ACL (لیست کنترل دسترسی) وجود داشته باشد که از ایجاد تونل جلوگیری کند.
  5. هرگونه محدودیت فایروال و/یا ACL که روی سرور backend شما پیکربندی شده و می‌تواند از ایجاد تونل جلوگیری کند را بررسی کنید.
  6. بسته به نوع فایروال و/یا محدودیت‌های ACL، باید مشکل را به طور مناسب برطرف کنید.
  7. بیایید یک مثال از محدودیت فایروال بزنیم تا نحوه عیب‌یابی و حل این مشکل را توضیح دهیم:

    سناریو: محدودیت فایروال روی سرور backend انتظار دارد که Host Header همیشه حاوی نام میزبان سرور backend باشد.

    شما می‌توانید از یکی از روش‌های زیر برای تعیین Host Header ارسال شده توسط Apigee Edge استفاده کنید:

    ردیابی

    برای تعیین Host Header با استفاده از Trace:

    1. با استفاده از ردیابی، همانطور که در مراحل تشخیص مشترک توضیح داده شده است، مطمئن شوید که رشته faultstring شامل خطای Proxy refused to create tunnel with response status 403 .
    2. به مرحله‌ی «جریان درخواست هدف آغاز شده» بروید و هدرهای درخواست را بررسی کنید.
    3. مقدار نام میزبان مشخص شده در سربرگ میزبان در بخش سربرگ‌های درخواست را تأیید کنید.
    4. اگر هدر Host شامل نام میزبان پروکسی باشد، دلیل این خطا همین است.
    5. دلیل این امر این است که فایروال روی سرور backend پیکربندی شده است تا فقط درخواست‌هایی را بپذیرد که Host Header حاوی نام سرور backend باشد.
    6. بنابراین وقتی سرور پروکسی سعی می‌کند تونلی با سرور backend ایجاد کند، با خطای زیر مواجه می‌شود:

      Proxy refused to create tunnel with response status 403 .

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

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

      در نمونه ردیابی نشان داده شده در بالا، نشان می‌دهد که Host Header شامل نام پروکسی هاست www.proxyserver.com . از آنجایی که یک محدودیت فایروال روی سرور backend پیکربندی شده است که انتظار دارد فقط نام میزبان سرور backend در Host Header موجود باشد، خطای Proxy refused to create tunnel with response status 403 دریافت می‌کنید.

    تی‌سی‌پی‌دامپ

    برای تعیین Host Header با استفاده از tcpdump

    1. با دستور زیر، یک tcpdump روی سرور پروکسی برای درخواست‌های دریافتی از کامپوننت Message Processor در Apigee Edge ضبط کنید:

      tcpdump -i any -s 0 host MP_IP_ADDRESS -w FILE_NAME
      

      برای اطلاعات بیشتر در مورد استفاده از دستور tcpdump ، به tcpdump مراجعه کنید.

    2. داده‌های tcpdump را با استفاده از ابزار Wireshark یا ابزاری مشابه تجزیه و تحلیل کنید.
    3. در اینجا یک نمونه تحلیل از tcpdump با استفاده از Wireshark آورده شده است:

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

    4. بسته‌های شماره ۱۳ ، ۱۴ و ۱۵ نشان می‌دهند که پردازشگر پیام از طریق یک فرآیند دست‌دهی سه‌طرفه TCP در حال برقراری ارتباط با سرور پروکسی است.
    5. در بسته ۱۶ ، پردازشگر پیام به میزبان پروکسی httpbin.org (که در مثال بالا نشان داده شده است) متصل شده است.
    6. بسته ۱۶ را انتخاب کنید و محتوای بسته و به طور خاص Host Header که توسط پردازنده پیام به سرور پروکسی منتقل می‌شود را با جزئیات بررسی کنید.

    7. نمونه بالا Host Header httpin.org را نشان می‌دهد که نام میزبان سرور پروکسی است. بنابراین، هنگامی که سرور پروکسی سعی می‌کند با ارسال Host Header httpin.org فوق، تونلی با سرور backend ایجاد کند، با خطای Proxy refused to create tunnel with response status 403 مواجه می‌شود.

وضوح تصویر

سناریو: محدودیت فایروال روی سرور پروکسی انتظار دارد که Host Header همیشه حاوی نام میزبان سرور backend باشد.

اگر متوجه شدید که این خطا به دلیل پیکربندی فایروال سرور backend به گونه‌ای است که انتظار دارد Host Header همیشه حاوی نام میزبان سرور backend باشد، در حالی که پردازنده پیام، نام میزبان سرور پروکسی را ارسال می‌کند، مراحل زیر را برای حل مشکل انجام دهید:

  1. همانطور که در مثال زیر نشان داده شده است، ویژگی use.proxy.host.header.with.target.uri را در TargetEndpoint روی true تنظیم کنید:

    نمونه پیکربندی TargetEndpoint:

    <TargetEndpoint name="default">
      <HTTPTargetConnection>
        <URL>https://mocktarget.apigee.net/json</URL>
        <Properties>
          <Property name="use.proxy.host.header.with.target.uri">true</Property>
        </Properties>
      </HTTPTargetConnection>
    </TargetEndpoint>
  2. مطمئن شوید که سایر ویژگی‌های مربوط به forward proxy در Message Processor به صورت زیر پیکربندی شده‌اند:

    1. فایل /opt/apigee/customer/application/message-processor.properties را روی هر یک از پردازنده‌های پیام بررسی کنید.
    2. مطمئن شوید که ویژگی‌های زیر مطابق با مورد استفاده یا الزامات شما تنظیم شده‌اند:

      مقادیر نمونه برای ویژگی‌ها:

      conf_http_HTTPClient.use.proxy=true
      conf/http.properties+HTTPClient.proxy.type=HTTP
      conf/http.properties+HTTPClient.proxy.host=PROXY_SERVER_HOST_NAME
      conf/http.properties+HTTPClient.proxy.port=PORT_#
      conf/http.properties+HTTPClient.proxy.user=USERNAME
      conf/http.properties+HTTPClient.proxy.password=PASSWORD

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

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

اگر کاربر 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

منابع