خطای ⁦502 Bad Gateway⁩ چیست و چگونه رفع می‌شود؟

تاریخ انتشار:

16 دقیقه مطالعه

Acar Diveroli
نویسنده: Acar Diveroli
خطی از CLIENT، پس از گذشتن از بیضی نقطه‌چین GATEWAY، پیش از UPSTREAM می‌گسلد؛ پیکان آبی 502 به CLIENT برمی‌گردد

سایتی را باز می‌کنید و صفحه‌ای سفید و تقریباً خالی می‌بینید: ⁦"502 Bad Gateway"⁩ با حروف درشت و زیر آن واژه nginx. در سایتی دیگر عنوان صفحه ⁦"Proxy Error"⁩ است و متن آن می‌گوید سرور پروکسی از یک سرور upstream پاسخ نامعتبری دریافت کرده است. پشت Cloudflare ظاهر صفحه آراسته‌تر است: سه نماد در یک ردیف و زیر آخری، یعنی Host، نوشته شده Error.

هر سه همان کد وضعیت HTTP هستند و در بیشتر موارد ایراد از سمت شما نیست. در ادامه می‌خوانید «gateway» و «upstream» یعنی چه، هر نسخه از این صفحه را چگونه بخوانید، بازدیدکننده چه کارهایی می‌تواند بکند، صاحب سایت علت را چگونه در لاگ‌ها پیدا می‌کند و 502 از پروکسی خود شما چه معنایی دارد.

خطای ⁦502 Bad Gateway⁩ یعنی چه؟

بیشتر وب‌سایت‌ها یک رایانه نیستند. آدرسی که تایپ می‌کنید معمولاً به یک سرور جلویی می‌رسد: یک ریورس پروکسی مانند nginx یا Apache، یک متعادل‌کننده بار (load balancer) یا یک CDN مانند Cloudflare (شبکه توزیع محتوا، سرویسی که از مکان‌های بسیاری به جای سایت پاسخ می‌دهد). سرور جلویی صفحه را نمی‌سازد. درخواست شما را به سرور پشت خود می‌فرستد، جایی که برنامه سایت اجرا می‌شود، و پاسخ را به شما برمی‌گرداند. این ساختار را در فوروارد پروکسی و ریورس پروکسی: تفاوت در چیست؟ توضیح داده‌ایم.

استاندارد HTTP سرور جلویی را دروازه (gateway) و سرور پشت آن را سرور بالادستی (upstream) می‌نامد. ⁦RFC 9110⁩ کد 502 را در یک جمله تعریف می‌کند: سروری که در نقش دروازه یا پروکسی کار می‌کند، از سرور پشت خود پاسخ نامعتبری دریافت کرده است. «نامعتبر» هم اتصالی را در بر می‌گیرد که رد شده، هم اتصالی که در میانه راه بسته شده و هم پاسخی که دروازه نتوانسته بخواند.

آیا خطای 502 تقصیر شماست؟

تقریباً هرگز. اتصال شما درخواست را به سرور جلویی سایت رسانده است؛ خرابی پس از آن رخ داده، میان دو ماشینی که به خود سایت تعلق دارند. استثنا VPN، پروکسی یا افزونه VPN است: این‌ها صفحه‌ها را به جای شما می‌گیرند، پس خودشان هم دروازه‌اند و وقتی نتوانند پاسخ قابل‌استفاده‌ای از سایت بگیرند، ممکن است خودشان 502 گزارش کنند.

خطای 502 گام‌به‌گام چگونه رخ می‌دهد؟

  1. مرورگر شما سرور جلویی را پیدا می‌کند. DNS، یعنی دفترچه نشانی اینترنت، آدرس CDN یا ریورس پروکسی را برمی‌گرداند، نه آدرس برنامه را.
  2. سرور جلویی درخواست شما را می‌پذیرد و آن را به بالادست، یعنی به برنامه، می‌فرستد: یک فرایند PHP، یک برنامه Node.js یا یکی از چند سرور در یک مجموعه (pool).
  3. سرور بالادستی شکست می‌خورد. چون اجرا نمی‌شود اتصال را رد می‌کند، در میانه کار اتصال را قطع می‌کند یا چیزی می‌فرستد که HTTP معتبر نیست.
  4. دروازه با 502 پاسخ می‌دهد. اگر سرور بالادستی فقط کند بوده و دروازه از انتظار دست کشیده باشد، کد معمولاً 504 است.
  5. مرورگر شما صفحه خطای دروازه را نشان می‌دهد، یا اگر دروازه صفحه‌ای خالی فرستاده باشد، صفحه خودش را.

صفحه 502 چه شکلی دارد و چه کسی آن را فرستاده است؟

ظاهر صفحه نشان می‌دهد کدام برنامه کار را نیمه‌تمام گذاشته است. گوگل کروم و مایکروسافت اج فقط وقتی صفحه خودشان را نشان می‌دهند که دروازه یک 502 بدون هیچ صفحه‌ای بفرستد.

آنچه می‌بینیدفرستندهمعنای معمول
⁦"502 Bad Gateway"⁩ و زیر آن nginxnginx، ریورس پروکسی سایتبرنامه پشت nginx خاموش است یا از کار افتاده
⁦"Proxy Error … received an invalid response from an upstream server"⁩ و ⁦"Reason: Error reading from remote server"⁩Apache httpdسرور پشتی اتصال را قطع کرده یا از مهلت پروکسی Apache گذشته است
⁦"Error 502, Bad gateway"⁩، نمادهای Browser، Cloudflare و Host، ⁦"Host: Error"⁩ و یک Ray IDCloudflareسرور خود سایت شکست خورده؛ Cloudflare کار می‌کند
⁦Error 520⁩Cloudflareسرور سایت پاسخی خالی یا نامتعارف فرستاده است
⁦Error 521⁩Cloudflareسرور سایت اتصال را رد کرده است
⁦Error 522⁩Cloudflareمهلت اتصال به سرور سایت تمام شده است
⁦Error 523⁩Cloudflareمسیری به سرور سایت وجود ندارد
⁦Error 524⁩Cloudflareسرور سایت در زمان لازم پاسخی نفرستاده است
«این صفحه کار نمی‌کند» (در رابط انگلیسی ⁦"This page isn't working"⁩) و ⁦"HTTP ERROR 502"⁩گوگل کروم یا مایکروسافت اجیک 502 خالی بدون جزئیات

سطر Reason (علت) در صفحه Apache نام دقیق خرابی را می‌گوید. همان عنوان ⁦"Proxy Error"⁩ اگر با سطر ⁦"Error during SSL Handshake with remote server"⁩ بیاید، کد وضعیت 500 دارد: Apache نتوانسته اتصال رمزگذاری‌شده با سرور پشتی را برقرار کند. Cloudflare هر یک از کدهای خود را در راهنمای خطاهای 5xx توضیح می‌دهد (برای 524 به‌طور پیش‌فرض 125 ثانیه منتظر می‌ماند)؛ همه آن‌ها مشکلی میان Cloudflare و سرور سایت را نشان می‌دهند.

تفاوت 502، 503 و 504 چیست؟

کدنامچه رخ داده استچه کسی رفعش می‌کند
500Internal Server Errorخود برنامه به خطا خورده استصاحب سایت
502Bad Gatewayدروازه پاسخی خراب گرفته یا اصلاً پاسخی نگرفتهصاحب سایت
503Service Unavailableبار بیش از حد یا نگه‌داری برنامه‌ریزی‌شدهمعمولاً گذشت زمان
504Gateway Timeoutدروازه بیش از حد منتظر مانده استصاحب سایت

⁦RFC 9110⁩ کد 504 را هم با همان زبان دروازه تعریف می‌کند: «پاسخ نامعتبر» در برابر «نرسیدن پاسخ در زمان لازم». برای بازدیدکننده توصیه در هر سه حالت یکسان است. برای صاحب سایت، 502 به برنامه‌ای از کار افتاده یا نادرست‌کار اشاره دارد و 504 به برنامه‌ای کند. یک نکته: وقتی Apache اصلاً نتواند به سرور پشتی وصل شود، 503 برمی‌گرداند.

به‌عنوان بازدیدکننده چه کاری از دستتان برمی‌آید؟

  1. یک دقیقه صبر کنید، سپس صفحه را دوباره بارگذاری کنید. بسیاری از خطاهای 502 فقط تا وقتی ادامه دارند که برنامه در حال راه‌اندازی دوباره است، مثلاً هنگام یک به‌روزرسانی. کلید F5 یا دکمه مجدد بار کردن (در رابط انگلیسی Reload) را در صفحه خطای کروم بزنید؛ یکی دو بار کافی است.
  2. ببینید سایت برای همه از دسترس خارج است یا نه. سایت را در گوشی خود با اینترنت همراه، نه وای‌فای، باز کنید. اگر آنجا هم باز نشد، مشکل از سمت سایت است؛ بسیاری از سرویس‌ها قطعی‌ها را در یک صفحه وضعیت (status page) اعلام می‌کنند.
  3. VPN یا پروکسی خود را خاموش کنید. برنامه VPN، افزونه VPN یا پروکسی را خاموش کنید و صفحه را دوباره بارگذاری کنید. در کروم افزونه‌ها در مسیر بیشتر > افزونه‌ها > مدیریت افزونه‌ها هستند (گام‌های گوگل). اگر صفحه حالا باز شد، دروازه‌ای که شکست خورده سرور همان VPN بوده است. مطمئن نیستید پروکسی‌ای تنظیم شده است یا نه؟ خطای پروکسی چیست؟ نشان می‌دهد کجا را نگاه کنید.
  4. اگر سایت به‌تازگی جابه‌جا شده، آدرس آن را دوباره بگیرید. گاهی، هرچند به‌ندرت، رایانه شما هنوز آدرس قدیمی سایتی را نگه داشته که میزبانش را عوض کرده است. راه‌اندازی دوباره رایانه، یا پاک کردن کش DNS همان‌طور که در DNS چیست؟ آمده است، آدرس تازه را می‌گیرد.
  5. به سایت خبر دهید. زمان، آدرس دقیق و متن روی صفحه را بفرستید؛ اگر صفحه Cloudflare است، Ray ID را هم اضافه کنید.

پاک کردن کوکی‌ها و کش کمکی نمی‌کند: طبق استاندارد HTTP، مرورگر پاسخ 502 را برای استفاده دوباره نگه نمی‌دارد، مگر اینکه سرور صریحاً اجازه دهد.

اگر سایت متعلق به شماست: چه چیزی باعث 502 می‌شود؟

بازدیدکننده یک سطر می‌بیند؛ علت در لاگ خطای (error log) دروازه شماست. در nginx، سطر error_log در nginx.conf نام فایل را مشخص می‌کند و بسته‌های لینوکسی خود nginx در /var/log/nginx/error.log می‌نویسند (error_log). Apache لاگ خطای خود را نخستین جایی که باید نگاه کرد می‌نامد؛ Debian و Ubuntu آن را در /var/log/apache2/error.log و Fedora و RHEL در /var/log/httpd/error_log نگه می‌دارند. دقیقه‌ای را که 502 ظاهر شد در لاگ جست‌وجو کنید.

سطر لاگ nginxیعنی چهچه چیزی را بررسی کنید
connect() failed (111: Connection refused) while connecting to upstreamهیچ برنامه‌ای روی آدرس بالادستی منتظر اتصال نیستآیا برنامه روی پورت proxy_pass اجرا می‌شود؟
connect() to unix:… failed (2: No such file or directory)فایل سوکتی که در پیکربندی آمده وجود نداردمسیر سوکت، مثلاً پس از ارتقای PHP
upstream prematurely closed connection while reading response header from upstreamبرنامه درخواست را گرفته و از کار افتاده استلاگ خود برنامه، محدودیت‌های حافظه
upstream sent too big header while reading response header from upstreamهدرها در بافر nginx جا نشده‌اندکوکی‌های بزرگ؛ proxy_buffer_size
no live upstreams while connecting to upstreamهمه سرورهای گروه خراب علامت خورده‌اندبلوک upstream
upstream timed out (110: Connection timed out)برنامه بیش از حد کند بوده استاین یک 504 است؛ proxy_read_timeout

در کد منبع nginx، تمام شدن مهلت انتظار (timeout) به 504 تبدیل می‌شود و هر خرابی دیگر سرور بالادستی به 502. پاسخی که بخش نخست آن در proxy_buffer_size جا نشود نامعتبر شمرده می‌شود و به همین دلیل کوکی‌های بیش از اندازه بزرگ به 502 می‌رسند. پیام 11: Resource temporarily unavailable روی یک سوکت یونیکس هم یعنی صف آن پر است: برنامه زیر بار بیش از حد است، نه متوقف.

علت‌های رایج دیگر:

  • پیام ⁦"Error reading from remote server"⁩ در Apache. سرور پشتی اتصال را بسته یا بیش از ProxyTimeout ساکت مانده است؛ مقدار پیش‌فرض این مهلت همان Timeout سرور است (mod_proxy). Apache برخلاف nginx، سرور پشتی کند را هم با 502 نشان می‌دهد.
  • ناهماهنگی keep-alive. keep-alive یعنی باز نگه داشتن یک اتصال برای درخواست‌های بعدی. اگر برنامه اتصال‌های بیکار را زودتر از آنچه دروازه انتظار دارد ببندد، درخواستی که روی اتصالی تازه بسته‌شده فرستاده شود شکست می‌خورد. AWS این را در میان علت‌های 502 متعادل‌کننده بار خود آورده و توصیه می‌کند مهلت keep-alive برنامه از مهلت بیکاری (idle timeout) متعادل‌کننده بار بیشتر باشد.
  • فایروال CDN را مسدود می‌کند. پشت یک CDN، همه بازدیدکنندگان از آدرس‌های CDN می‌رسند و یک افزونه امنیتی ممکن است این آدرس‌ها را مهاجم بپندارد. Cloudflare این وضعیت را با 521 یا 522 گزارش می‌کند و محدوده‌های IP خود را در cloudflare.com/ips منتشر می‌کند.
  • استقرار نسخه تازه. هر انتشاری که برنامه را از نو راه‌اندازی می‌کند، تا بازگشت برنامه 502 تولید می‌کند؛ راه‌اندازی دوباره سرورها یکی‌یکی این فاصله را از میان می‌برد.

طولانی‌تر کردن مهلت‌ها برنامه‌ای را که از کار افتاده درمان نمی‌کند؛ پس نخست سرور بالادستی را درست کنید. خطاهای تکراری به نتایج جست‌وجو هم می‌رسند: خزنده‌های گوگل با دیدن خطاهای سرور سرعت خزش را کم می‌کنند و آدرس‌هایی که پیوسته این خطاها را برمی‌گردانند سرانجام از ایندکس حذف می‌شوند. ابزار پایشی که هر دقیقه سایت را بررسی کند، پیش از همه به شما هشدار می‌دهد. اگر این بررسی‌ها را از خروجی‌های پروکسی ISP در چند کشور اجرا کنید، می‌بینید آیا فقط یک منطقه CDN شکست می‌خورد؛ بررسی‌ها هم از آدرس‌های ثابتی می‌آیند که می‌توانید در لیست سفید فایروال خود بگذارید.

خطای 502 از پروکسی خودتان یعنی چه؟

وقتی یک اسکرپر (برنامه‌ای که داده صفحه‌ها را خودکار جمع می‌کند)، یک ابزار پایش یا یک برنامه ترافیک خود را از پروکسی عبور می‌دهد، دروازه دومی در زنجیره هست: دروازه شما. وقتی یک فوروارد پروکسی نتواند به سایت برسد، بسیاری از پروکسی‌ها خودشان با 502 پاسخ می‌دهند و سایت هرگز درخواست را نمی‌بیند. این دو حالت ظاهر متفاوتی دارند:

  • 502 پروکسی پاسخ به درخواستی است که تونل را باز می‌کند، پیش از آنکه صفحه‌ای برسد. curl عبارت CONNECT tunnel failed, response 502 را چاپ می‌کند؛ کتابخانه Requests در پایتون خطای ProxyError همراه Tunnel connection failed: 502 Bad Gateway می‌دهد (خطای Max Retries Exceeded With URL این پیام را جزءبه‌جزء باز می‌کند).
  • 502 سایت از تونلی سالم می‌آید، همراه صفحه خطا و هدرهای خود سایت.

به این ترتیب پیش بروید:

  1. همان URL را بدون پروکسی باز کنید. اگر آنجا هم شکست خورد، سایت از دسترس خارج است؛ بعداً امتحان کنید.
  2. میزبان و پورت را در کد خود بررسی کنید. یک غلط تایپی هر بار در پروکسی شکست می‌خورد.
  3. چند بار با فاصله‌هایی که هر بار بلندتر می‌شوند دوباره تلاش کنید، سپس متوقف شوید. کدهای وضعیت HTTP در وب اسکرپینگ در بخش «خطاهای 502، 504 و اتصال» فهرست می‌کند کدام کدها را باید دوباره تلاش کرد.
  4. اگر URL بدون پروکسی کار می‌کند اما از یک خروجی شکست می‌خورد، نشست تازه‌ای شروع کنید. با پروکسی مسکونی نشست تازه یک IP خروجی تازه و مسیر دیگری می‌آورد.

502 یک اتصال ناموفق است، نه مسدودسازی: اگر سایت با 429 یا صفحه مسدودی پاسخ داد، به جای عوض کردن آدرس، سرعت را کم کنید. و اگر سایتی هنگام اجرای خزنده شما شروع به برگرداندن 502 کرد، ممکن است ترافیک شما بخشی از بار باشد؛ تعداد درخواست‌های موازی را کم کنید.

سطح پیشرفته: فرستنده 502 را با یک فرمان ببینید

این بخش برای کسانی است که با خط فرمان راحت‌اند. curl در ویندوز 10، ویندوز 11 و مک از پیش نصب است؛ در PowerShell ویندوز به جای آن curl.exe بنویسید.

bash
curl -sSI https://example.com

گزینه -I فقط هدرها را می‌خواهد؛ -sS نوار پیشرفت را پنهان می‌کند اما پیام‌های خطا را نگه می‌دارد. برای عبور از پروکسی خود، پیش از آدرس -x http://user:pass@pr.proxynet.io:8000 را اضافه کنید. فرمان را روی یک چیدمان آزمایشی در رایانه خودمان اجرا کردیم (⁦curl 8.21.0⁩، ویندوز 11). نخست دروازه‌ای که برنامه پشت آن خاموش شده بود:

text
HTTP/1.1 502 Bad Gateway
Content-Type: text/html
Content-Length: 112

سپس با -x، یک پروکسی آزمایشی که از آن خواسته شد به پورتی برسد که هیچ برنامه‌ای روی آن منتظر اتصال نبود:

text
HTTP/1.1 502 Bad Gateway

curl: (7) CONNECT tunnel failed, response 502

سطر نخست وضعیت را نشان می‌دهد. در یک سایت واقعی، هدر server: معمولاً نام برنامه‌ای را که پاسخ داده می‌آورد (cloudflare، nginx، Apache). سطر CONNECT tunnel failed فقط وقتی ظاهر می‌شود که 502 را پروکسی خود شما ساخته باشد.

کجا ممکن است با 502 روبه‌رو شوید

اشتباه‌های رایج

  • پاک کردن پیاپی کوکی‌ها و کش. 502 در سمت سرور ساخته می‌شود.
  • راه‌اندازی دوباره مودم یا بارگذاری دوباره صفحه در هر ثانیه. اتصال شما درخواست را رسانده است و بارگذاری‌های اضافه فقط بار را بیشتر می‌کنند.
  • صاحبان سایت: طولانی کردن مهلت‌ها برای پنهان کردن 502. در nginx، 502 یعنی برنامه اتصال را رد کرده، از کار افتاده یا پاسخ نادرست داده است.
  • صاحبان سایت: مسدود کردن آدرس‌های CDN با فایروال یا افزونه امنیتی.
  • کاربران پروکسی: مقصر دانستن پروکسی پیش از آزمودن URL بدون آن.

راهنمای انتخاب

وضعیت شماچه کنید
صفحه ⁦"502 Bad Gateway"⁩، سایت‌های دیگر باز می‌شوندیک دقیقه صبر کنید و دوباره بارگذاری کنید
با اینترنت همراه هم باز نمی‌شودسایت از دسترس خارج است؛ صفحه وضعیت آن را ببینید
با خاموش کردن VPN یا پروکسی باز می‌شودموقعیت دیگری برای VPN انتخاب کنید یا پروکسی را بررسی کنید
صفحه Cloudflare با ⁦"Host: Error"⁩Ray ID و زمان را برای سایت بفرستید
سایت شما، nginx می‌گوید ⁦"Connection refused"⁩برنامه را راه بیندازید و پورت proxy_pass را بررسی کنید
سایت شما، Apache می‌گوید ⁦"Error reading from remote server"⁩نخست سرور پشتی و سپس ProxyTimeout را بررسی کنید
اسکریپت شما CONNECT tunnel failed, response 502 چاپ می‌کندبدون پروکسی بیازمایید، سپس نشست تازه‌ای شروع کنید

پرسش‌های متداول

خطای ⁦502 Bad Gateway⁩ چقدر طول می‌کشد؟

زمان ثابتی ندارد. راه‌اندازی دوباره یا به‌روزرسانی برای چند ثانیه یا چند دقیقه 502 ایجاد می‌کند؛ برنامه‌ای که بی‌آنکه کسی متوجه شود از کار افتاده، ممکن است ساعت‌ها 502 برگرداند.

آیا VPN یا پروکسی می‌تواند باعث خطای 502 شود؟

بله. سرور VPN یا پروکسی صفحه‌ها را به جای شما می‌گیرد، پس وقتی نتواند به سایتی برسد، ممکن است خودش با 502 پاسخ دهد. آن را خاموش کنید و صفحه را دوباره بارگذاری کنید؛ اگر صفحه باز شد، موقعیت دیگری انتخاب کنید.

پیام ⁦"Proxy Error: the proxy server received an invalid response from an upstream server"⁩ یعنی چه؟

این صفحه 502 در Apache است. Apache در نقش ریورس پروکسی جلوی سایت اجرا می‌شود و برنامه پشت آن اتصال را قطع کرده یا در زمان لازم پاسخ نداده است. این پروکسیِ خود سایت است، نه پروکسی‌ای روی رایانه شما.

آیا 502 همان 504 است؟

نه، اما به هم نزدیک‌اند: در 502 دروازه پاسخ نامعتبری گرفته و در 504 در زمان لازم پاسخی نگرفته است. nginx برای پایان مهلت از 504 استفاده می‌کند، در حالی که Apache سرور پشتی کند را هم با 502 نشان می‌دهد.

آیا خطای 502 به رتبه سایت در گوگل آسیب می‌زند؟

یک قطعی کوتاه اثر چندانی ندارد. خزنده‌های گوگل با دیدن خطاهای سرور کندتر می‌شوند و آدرس‌هایی که مدت طولانی این خطاها را برمی‌گردانند سرانجام از ایندکس حذف می‌شوند.

چرا 502 فقط در برخی صفحه‌ها یا فقط گاهی ظاهر می‌شود؟

یک صفحه سنگین، مانند جست‌وجو، ممکن است برنامه را از کار بیندازد؛ یکی از سرورهای یک مجموعه ممکن است ناسالم باشد؛ یا ناهماهنگی keep-alive یک درخواست تصادفی را خراب کند. زمان‌های لاگ خطا را با آدرس‌های درخواست‌شده مقایسه کنید.

خلاصه

خطای ⁦502 Bad Gateway⁩ یعنی سرور جلویی سایت از سرور پشت خود پاسخی خراب گرفته یا اصلاً پاسخی نگرفته است. اگر بازدیدکننده‌اید، صبر کنید و دوباره بارگذاری کنید، شبکه دیگری را بیازمایید، VPN و پروکسی را خاموش کنید و اگر خطا ماند، زمان و Ray ID را به سایت گزارش دهید. اگر صاحب سایت هستید، لاگ خطای دروازه را بخوانید. اگر از پروکسی استفاده می‌کنید، نخست 502 پروکسی خود را از 502 سایت جدا کنید. انواع پروکسی برای اسکرپینگ و پایش را می‌توانید در صفحه پروکسی ما مقایسه کنید.

پرسش از ChatGPTپرسش از Claude