حل ارور 502 Bad Gateway برای Python و Gunicorn

با سلام و درود، خیلی سریع میرم سر اصل مطلب، فرضیات ما این هست که شما از Gunicorn استفاده می کنید و به ارور NGINX 502 Bad Gateway برخورده اید.

Gunicorn یکی از اپلیکیشن سرور های رایجح برای اپلیکیشن های پایتونی هست که از WSGI استفاده می کند که چگونگی ارتباط و درخواست از وب سرور با اپلیکیشن پایتونی را تعریف می کند. در عمل، Gunicornاغلب پشت یک وب سرور Nginx راه اندازی می شود. Nginx درخواست های وب را پروکسی کرده و آنها را به سمت Gunicorn worker processes می فرستد که اپلیکیشن را اجرا کرده است.

Nginx هرگاه نتواند یک درخواست را به سمت Gunicoprnبا موفقیت پروکسی کند یا Gunicornدر جواب دادن موفق نباشد، یک ارور 502 Bad Gateway می دهد. در این مطلب به تعدادی از موارد رایج بروز خطای ۵۰۲ در پشته Nginx/Gunicorn پرداخته ایم.

بعضی از خطاهای رایج منجر به 502

۱- Gunicorn اجرا نباشد.

۲- Nginx نتواند با Gunicornارتباط برقرار کند.

۳- یونیکورن Time out شده باشد.

اگر Nginxنتواند به هر کدام از این دلایل نتواند با Gunicornارتباط برقرار کند. ارور ۵۰۲ خواهد برگرداند. که می تواند از access log به آن دسترسی داشت.

(/var/log/nginx/access.log)

برای مثال :

172.16.1.54 - - [05/May/2021:04:09:57 +0000] "GET /manifest.json HTTP/2.0" 502 552 ...

access log ان جین ایکس، دلیل ارور ۵۰۲ را تشریح نمی کند. اما برای ان منظور می توانید از error logاستفاده کنید. (/var/log/nginx/error.log)

برای مثال به Nginx Error Log زیر توجه نمایید که نشنون میده socket وجود ندارد و احتمالا Gunicornاجرا نمی باشد.

2020/01/08 18:13:50 [crit] 1078#1078: *189 connect() to unix:/home/ubuntu/myproject/myproject.sock failed (2: No such file or directory) while connecting to upstream, client: 127.0.0.1, server: localhost, request: "GET / HTTP/1.1", upstream: "http://unix:/home/ubuntu/myproject/myproject.sock:/", host: "localhost"

اجرا نبودن Gunicorn

اگر Gunicorn فعال نباشد،‌Nginx ارور ۵۰۲ خواهد داد. اول از همه مطمین شوید که Gunicorn در حال اجرا می باشد. برای این منظور از دستور ps در لینوکس استفاده کنید.

ps aux | grep gunicorn

بر فرض ما gunicorn خود را با نام logistic ساخته ایم. باید در لیست حاصل از دستور فوق، حداقل یه worker یا master-primaryداشته باشیم.

ubuntu    3717  0.3  2.3  65104 23572 pts/0    S    15:45   0:00 gunicorn: master [logistic:app]
ubuntu    3720  0.0  2.0  78084 20576 pts/0    S    15:45   0:00 gunicorn: worker [logistic:app]

اگر ردیفی از نوع worker یا master نداشتیم. به هر دلیلی gunicorn اجرا نیست 🙁

بهتره که ابتدا سرویس Gunicornای که ساخته اید را ریست کنید.

sudo systemctl restart logistic.service

اسمی که برای سرویس یونیکورن اپلیکیشن logistic ساخته بودیم logistic.service بوده.

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

sudo systemctl is-active logistic.service

یا برای دیدن وضعیت ارجا شدن Gunicornمی توانید از دستور زیر استفاده کنید که اگر اروری در هنگام اجرا کردن پروژه Pythonشما وجود داشته بوده، اینجا قابل نمایش است:

sudo systemctl status logistic.service

Nginx تنواند به Socketدسترسی داشته باشد

تکمیل خواهد شد.

یونیکورن Time Out شده باشد

تکمیل خواهد شد.