عیب‌یابی nginx: خطاهای 502، 504، 413، 403 و 404

وقتی nginx خطا می‌دهد، تقریباً همیشه پاسخ در لاگ خطا و چند دستور بررسی است. این راهنما یک روش ثابت برای پیدا کردن مشکل و راه‌حل رایج‌ترین خطاها را ارائه می‌کند.

وب‌سرور و SSLمتوسط10 دقیقه

۱قدم اول: وضعیت سرویس و تست کانفیگ

اول مطمئن شوید nginx در حال اجراست و کانفیگ خطای نحوی ندارد.

bash
sudo systemctl status nginx --no-pager
sudo nginx -t
sudo journalctl -u nginx -n 30 --no-pager

۲قدم دوم: لاگ خطا

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

bash
sudo tail -n 50 /var/log/nginx/error.log
sudo tail -f /var/log/nginx/error.log

۳بررسی اینکه nginx روی کدام پورت‌هاست

اگر nginx بالا نمی‌آید معمولاً پورت ۸۰ یا ۴۴۳ توسط برنامهٔ دیگری (مثل Apache) اشغال است.

bash
sudo ss -tlnp | grep -E ':80|:443'
sudo lsof -i :80

۴خطای 502 Bad Gateway

nginx نتوانسته به برنامهٔ پشت خود وصل شود. برنامه خاموش است، پورت اشتباه است یا سوکت PHP-FPM درست نیست. در SELinux هم ممکن است اتصال شبکه ممنوع باشد.

bash
# برنامه روی چه پورتی است؟
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

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

nginx
    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 است (پیش‌فرض یک مگابایت).

nginx
# در http یا server یا location
client_max_body_size 50m;

۷خطای 403 Forbidden

معمولاً دسترسی فایل‌ها یا فقدان فایل index است. کاربر nginx باید بتواند همهٔ پوشه‌های مسیر را ببیند (x) و فایل را بخواند.

bash
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 تست کنید.

nginx
# با 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 پاسخ می‌دهد:

bash
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 بسازید.

nginx
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 را نگه داشته است.