نگهداری سرور سخت است.

شما باید با تمام بروزرسانی ها ، بسته های امنیتی و خطاهای گاه و بیگاه سرور (خطاهای مستعار از جهنم) سر و کار داشته باشید.

یکی از خطاهای رایج “Bad Gateway 502” می باشد.

خطای 3 کلمه ای - 502 bad gateway

خطای ۳ کلمه ای – ۵۰۲ bad gateway

این پیام خطا رمزنگاری شده است.

بنابراین ، بسیاری از استادان وب آستین های خود را بالازده و به  Log های خطای سیستم نگاه می کنند:

۲۰۱۷/۰۴/۰۴ ۰۸:۳۴:۴۳ [error] 949#949: *7 connect() failed (111: Connection refused) while connecting to upstream, client: XXX.XXX.XXX.XXX, server: myserver.com, request: “GET /myurl-this/ HTTP/1.0”, subrequest: “/redis-fetch”, upstream: “redis://127.0.0.1:6379”, host: “refserver.com”, referrer: “http://referalsite.com/myurl-this/”

بله متوجه هستم، خیلی نا مفهومه، درسته؟!

چراکه در متن خطا دوگانگی وجود دارد و دو حالت “failed” and “refused” را با هم آورده است.

اما چرا؟ میدونم وقت ندارید برید و دکترای علوم کامپوتر بگیرید.

ما سعی داریم به شما ۵ دلیل رایج برای این خطا را بیان کنیم تا مشکلات رایج را برطرف کنید.

۱- سرویس Backend مشکل دارد (یا Failed شده است)

وب سرور Nginx برای اجرای برنامه های وب به خدمات (سرویس های) پس زمینه مانند PHP-FPM ، خدمات پایگاه داده و سرورهای حافظه پنهان نیاز دارد.

بنابراین ، اگر هرکدام از این سرویس ها خراب یا قادر به پاسخگویی نبود ، Nginx هیچ اطلاعاتی از آنها دریافت نمی کند ، که منجر به خطای “۵۰۲ Bad Gateway” می شود.

برخی سرویس ها که ممکن است با خطا مواجه شده باشند:

  • PHP
  • Apache
  • Nginx
  • Cache
  • Database

دلایل خرابی سرویس می تواند از مشکلهای ترافیک شبکه و محدودیت منابع تا خطاهای دیسک و حملات DDoS باشد.

اگر گمان می کنید سرویس پس زمینه پاسخگو نیست یا شکست خورده است ، می توانید کلیه فرایندهای بی پاسخ را بکشید (با دستور kill در لینوکس) و سرویس را مجدداً راه اندازی کنید.

به عنوان مثال ، در اینجا یک روش برای از بین بردن فرآیندهای غیرفعال PHP-FPM و شروع مجدد خدمات بیان شده است.

# kill -9 $(pgrep php-fpm)
# /etc/init.d/php-fpm restart
* Restarting PHP FastCGI Process Manager php-fpm [ OK ]

هشدار: اگر مطمئن نیستید که این دستورات چگونه کار می کنند از این دستورات استفاده نکنید.

اگر با راه اندازی مجدد این سرویس کار نکرد، ممکن است لازم باشد از یک مشاور متخصص برای بررسی دقیق تر سلامتی سرور کمک بگیرید.

۲- بار سرور زیاد است

دومین دلیل شایع برای “۵۰۲ bad gateway” در Nginx متوسط بار زیاد در سرورهای پس زمینه است.

مشکل بار سرور باعث عدم پاسخگویی سرویس ها می شود.

برخی دلایل مشهود برای مشکل بار سیستم به شرح زیر هستند:

  • بالا رفتن ناگهانی بار ترافیکی وبسایت (که میتواند موقت باشد و بر روی بازاریابی (مارکتینگ) و تبلیعات تاثیر بگذارد) همچنین ممکن است بازاریابی یا تبلیغات دلیل عمده این رخداد باشد.
  • خضور بدافزار روی سرور.
  • نظر های هرز (spam) که  به جهت سو استفاده اس سرور شما رخ می دهد.
  • حملات بی رحمانه (Brute force attacks) که برای سوء استفاده از برنامه های وب طراحی شده اند.
  • اشکالات کاربردی که باعث کمبود حافظه یا اختلال منابع (resource hogging) می شوند.

چرا resource hogging در سیستم عامل رخ می دهد؟ این خطا زمانی رخ می دهد که سیستم عامل در عملیات اختصاص منابع به سرویس ناموفق باشد. این مورد می تواند به دلیل اولویت بندی هایی باشد که برای فرایند ها چیده شده است. چرا که ممکن است یک فرایند تمام منابع را دریافت کرده باشد و جلوی اختصاص منابه به سایرین را گرفته باشد. از دلایل عمده این مشکل میتواند هسته سیستم عامل باشد.

برای عیب یابی یک برنامه با بار زیاد ، ابتدا متوجه می شویم از کدام منبع سوء استفاده می شود (پردازنده، ورودی خروجی، حافظه یا شبکه)

ما سرویسی که از آن منبع سوءاستفاده می کند را پیدا می کنیم، و از این سرویس متوجه می شویم که کدام کاربر مالک فرایند سوء استفاده گر است.

پس از پیدا کرده فراید و مالک فرایند میتوان فرایند یا مالک آن را بست یا این که اختلال را برطرف کرد.

۳-  پیکربندی نامناسب سرویس است

سرور Nginx و سرویس های پس زمینه شما (برای درست کار کردن) به بسیاری از سیستمهای فرعی وابسته هستند.

این سیستم ها شامل:

ارائه دهنده  DNS ، فرآیندهای Apache ، سرویس های PHP ، سرور DB و غیره می شود.

اگر حتی یکی از این سرویس ها اشتباه پیکربندی شده باشد ، آن سرویس پاسخی نخواهد داد و Nginx خطای “۵۰۲ Bad Gateway” را نشان می دهد.

برخی از موارد پیکربندی که تجربه شده اند:

  • ارائه دهنده DNS در Nginx به خوبی پیکربندی نشده و باعث عدم موفقیت جستجوی دامنه می شود.
  • جزئیات ورود به سیستم پایگاه داده پس از مهاجرت اخیر ، به اشتباه تنظیم شده ، که معمولا در اثر بازیابی یا بروزرسانی اتفاق می افتد.
  • تنظیمات دیوار آتش وب سرور آپاچی (mod_security) خطای نحوی ارسال می کند که نمایان گر خطای آپاچی است.
  • محدودیت حافظه یا فایل نادرست برای برنامه های PHP تنظیم شده باشد.
  • محدودیت های ظرفیت (مانند: نبود هیچ اتصالی برای هر IP) بسیار محدود شده و باعث می شود بازدیدکننده در تعداد اتصال محدود باشد.
  • و …

راه ساده ای برای پیدا کردن اشکالات پیکربندی وجود ندارد.

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

برای مثال: این خطا در اینجا می گوید که برنامه PHP به حداکثر فرآیند مجاز خود رسیده است (تعریف شده توسط تنظیمات pm.max_children).

WARNING: [mysite.com] server reached max_children setting (30), consider raising it

ERROR: unable to read what child say: Bad file descriptor (9)

اگر با تنظیمات وب سرور و PHP یا پایگاه داده آشنایی ندارید با مدیر سیستم خود تماس حاصل نمایید.

همچنین می توانید با خرید و مشاهده دوره نصب و راه اندازی لاگ سرور بر روی توزیع centos 7 را بررسی نمایید تا یک سیستم اتوماتیک برای بررسی لاگها راه اندازی کرده و تمام لاگهای سیستم عامل های لینوکسی را در محیطی گرافیکی و بصورت یکجا مشاهده نموده و مورد بررسی قرار دهید.

۴- پورت (درگاه) سرویس توسط فایروال بسته شده است

فایروال ها پایه و اساس امنیت سرورها هستند. اما اگر درست تنظیم نشود ، این فایروال ها می توانند باعث مسدود شدن درخواست های قانونی یا عدم موفقیت سرویس شوند.

به عنوان مثال ، در سرورهای لینوکس که مجموعه اتوماسیون Plesk را دارند ، Nginx روی پورت ۸۰ اجرا می شود و Apache در پورت ۷۰۸۰ اجرا می شود.

اما فایروال ها به طور پیش فرض پورت های غیرمعمول مانند ۷۰۸۰ را مسدود می کنند ، و این باعث می شود Nginx نتواند به Apache وصل شود.

نتیجه؟ خطای “۵۰۲ Bad Gateway” را نشان می دهد.

چنین مواردی اغلب وقتی یک سرویس جدید در پس زمینه فعال می شود (مثلاً سرور کش، Ruby و غیره) یا هنگام مهاجرت یا بعد از بروزرسانی یک سرور رخ می دهند.

برای رفع آن ، با دستور زیر مشاهده می شود که سرویس با اتسفاده از کدام پورت اجرا می شود و نیاز مند آن پورت می باشد:

# netstat -lpn
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 19785/nginx
tcp6 0 0 :::80 :::* LISTEN 19785/nginx

و در صورت یافتن هرگونه سرویس در پورت های غیر استاندارد ، ما باید پیکربندی سرویس را تغییر دهیم یا آن را به یک پورت استاندارد تغییر دهیم ، و  یا این که پیکربندی فایروال را ویرایش کنیم تا پورت غیر استاندارد را مجاز اعلام کنیم.

۵- خطای نرم افزار وب

یک مورد نادر برای خطای “۵۰۲ Bad Gateway” خطای کد برنامه است.

اگر گزارشهای مربوط به سرور وب شما خطای ترسناکی مانند این را نشان می دهد ، ممکن است کد برنامه ما با نسخه سرور ناسازگار باشد.

[notice] child pid 27831 exit signal Segmentation fault (11)

برای مطابقت با نسخه های مورد نیاز ، باید پیشنیاز های مورد نیاز برنامه خود را بازرسی کنید و مجدداً پیکربندی کنید.

خلاصه

۵۰۲ Bad Gateway در Nginx معمولاً هنگامی اتفاق می افتد که Nginx به عنوان یک پروکسی معکوس عمل می کند ، و قادر به اتصال به خدمات پس زمینه نیست. از این رو خطای مذکور می تواند به دلیل خرابی سرویس ها، خطاهای شبکه ، مشکلات پیکربندی و موارد دیگر باشد. امروز ۵ دلیل برتر برای این خطا و نحوه رفع آن را مشاهده کردیم.

منابع