عیبیابی nginx: خطاهای 502، 504، 413، 403 و 404
وقتی nginx خطا میدهد، تقریباً همیشه پاسخ در لاگ خطا و چند دستور بررسی است. این راهنما یک روش ثابت برای پیدا کردن مشکل و راهحل رایجترین خطاها را ارائه میکند.
۱قدم اول: وضعیت سرویس و تست کانفیگ
اول مطمئن شوید nginx در حال اجراست و کانفیگ خطای نحوی ندارد.
sudo systemctl status nginx --no-pager
sudo nginx -t
sudo journalctl -u nginx -n 30 --no-pager۲قدم دوم: لاگ خطا
بیشتر مشکلات با یک نگاه به لاگ خطا مشخص میشوند. برای دیدن مشکل هنگام تکرار درخواست، لاگ را زنده دنبال کنید.
sudo tail -n 50 /var/log/nginx/error.log
sudo tail -f /var/log/nginx/error.log۳بررسی اینکه nginx روی کدام پورتهاست
اگر nginx بالا نمیآید معمولاً پورت ۸۰ یا ۴۴۳ توسط برنامهٔ دیگری (مثل Apache) اشغال است.
sudo ss -tlnp | grep -E ':80|:443'
sudo lsof -i :80۴خطای 502 Bad Gateway
nginx نتوانسته به برنامهٔ پشت خود وصل شود. برنامه خاموش است، پورت اشتباه است یا سوکت PHP-FPM درست نیست. در SELinux هم ممکن است اتصال شبکه ممنوع باشد.
# برنامه روی چه پورتی است؟
sudo ss -tlnp | grep 3000
curl -I http://127.0.0.1:3000
# PHP-FPM
ls -l /run/php/*.sock
# SELinux (RHEL و CentOS)
sudo setsebool -P httpd_can_network_connect 1۵خطای 504 Gateway Timeout
برنامه دیر پاسخ میدهد. علت برنامه را پیدا کنید (کوئری کند، درخواست خارجی) و اگر واقعاً عملیات طولانی است مهلتها را افزایش دهید.
proxy_connect_timeout 10s;
proxy_read_timeout 120s;
proxy_send_timeout 120s;
# برای PHP
fastcgi_read_timeout 120s;افزایش timeout علامت پنهان کردن مشکل است؛ عملیات سنگین را به صف (queue) و پسزمینه ببرید.
۶خطای 413 Request Entity Too Large
حجم فایل آپلود بیشتر از client_max_body_size است (پیشفرض یک مگابایت).
# در http یا server یا location
client_max_body_size 50m;۷خطای 403 Forbidden
معمولاً دسترسی فایلها یا فقدان فایل index است. کاربر nginx باید بتواند همهٔ پوشههای مسیر را ببیند (x) و فایل را بخواند.
namei -l /var/www/example.com/html/index.html
ps aux | grep 'nginx: worker'
sudo chmod o+x /var/www /var/www/example.com
sudo chmod -R o+rX /var/www/example.com/htmlدر RHEL با SELinux ممکن است لازم باشد restorecon -Rv /var/www را اجرا کنید.
۸خطای 404 با وجود فایل
root یا alias اشتباه است. تفاوت این دو: root مسیر location را به انتهای مسیر اضافه میکند ولی alias آن را جایگزین میکند. آدرس را با curl و هدر Host تست کنید.
# با root: /assets/a.css -> /var/www/site/assets/a.css
location /assets/ {
root /var/www/site;
}
# با alias: /assets/a.css -> /srv/static/a.css
location /assets/ {
alias /srv/static/;
}۹تست بدون DNS با هدر Host
اگر دامنه هنوز به سرور اشاره نمیکند یا میخواهید بدانید کدام server block پاسخ میدهد:
curl -I -H "Host: example.com" http://127.0.0.1
curl -I --resolve example.com:443:127.0.0.1 https://example.com
sudo nginx -T | grep -E 'server_name|listen'۱۰هشدار conflicting server name و server block اشتباه
اگر پیام «conflicting server name» میگیرید، دو server block برای یک دامنه و پورت دارید و nginx اولی را استفاده میکند. با nginx -T همهٔ تنظیمات را ببینید و تکراری را حذف کنید. برای درخواستهایی که هیچ دامنهای با آنها مطابقت ندارد یک default_server بسازید.
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
return 444; # اتصال را بدون پاسخ ببندد
}پرسشهای پرتکرار دربارهٔ عیبیابی nginx: خطاهای 502، 504، 413، 403 و 404
لاگهای nginx کجا هستند؟
بهصورت پیشفرض /var/log/nginx/access.log و /var/log/nginx/error.log. هر سایت میتواند با access_log و error_log فایل جدا داشته باشد.
بعد از تغییر کانفیگ چیزی عوض نشد، چرا؟
احتمالاً reload نکردهاید یا فایل را در sites-available ویرایش کردهاید ولی لینک آن در sites-enabled نیست. با sudo nginx -T مطمئن شوید کانفیگ فعال همان است که فکر میکنید؛ گاهی مرورگر هم پاسخ کششده یا ریدایرکت 301 را نگه داشته است.