رفع خطای 504 Gateway Timeout در سرور

خطای 504 Gateway Timeout یعنی سروری که جلوی برنامه قرار دارد (Nginx، Apache به‌عنوان پراکسی، Cloudflare یا یک Load Balancer) درخواست را به سرور پشتی فرستاده، ولی در مهلت تعیین‌شده جوابی نگرفته است. تفاوتش با 502 این است که در 502 جواب نامعتبر یا قطع اتصال رسیده و در 504 اصلاً جوابی نیامده. رایج‌ترین علت‌ها اسکریپت کند یا گیرکرده PHP، کوئری سنگین دیتابیس، پر شدن Workerهای PHP-FPM و پایین بودن مقدار مهلت (timeout) است.

عیب‌یابی را از لاگ شروع کنید و قبل از بالا بردن مهلت‌ها، علت کندی را پیدا کنید. بالا بردن timeout فقط پیام خطا را دیرتر نشان می‌دهد. اگر با 502 هم روبه‌رو هستید، خطای 502 Bad Gateway را ببینید و برای 500 به خطای 500 Internal Server Error مراجعه کنید.

خطای 504 Gateway Timeout از کجا می‌آید؟

پیش از هر کار، مشخص کنید خطا را کدام لایه می‌دهد:

ظاهر صفحهلایه محتمل
صفحه سفید ساده با متن 504 Gateway Time-out و نام nginxNginx
صفحه Cloudflare با شماره خطا و ابر نارنجیCloudflare (خطای 504 یا 524)
صفحه ارائه‌دهنده یا Load Balancerلایه جلوی سرور
سایت با آدرس IP مستقیم کار می‌کند ولی با دامنه 504 می‌دهدCDN یا پراکسی بین کاربر و سرور

اگر با آدرس مستقیم سرور (یا با تغییر فایل hosts) سایت درست باز می‌شود، مشکل در لایه جلویی است. اگر آنجا هم کند یا خطا می‌دهد، مشکل از خود سرور و برنامه است.

مرحله اول: خواندن لاگ خطای 504 Gateway Timeout

sudo tail -n 50 /var/log/nginx/error.log
sudo tail -n 50 /var/log/php8.3-fpm.log

نام فایل لاگ PHP-FPM به نسخه PHP بستگی دارد. پیام‌های رایج در لاگ Nginx:

  • upstream timed out (110: Connection timed out) while reading response header from upstream: برنامه در مهلت جواب نداده است.
  • connect() to unix:/run/php/php8.3-fpm.sock failed: PHP-FPM اجرا نیست یا مسیر سوکت اشتباه است.

در لاگ PHP-FPM دنبال این پیام باشید: server reached pm.max_children setting. یعنی همه Workerها مشغول‌اند و درخواست‌های تازه در صف می‌مانند تا مهلت تمام شود. روش‌های جست‌وجو در لاگ را در راهنمای grep و find بخوانید.

مرحله دوم: کندی اسکریپت یا دیتابیس

اگر کار سنگین مثل گزارش، درون‌ریزی، پشتیبان‌گیری یا اجرای کرون در حال انجام است، ممکن است از مهلت بگذرد. بررسی کنید در لحظه خطا چه چیزی اجرا می‌شود:

top -c
sudo mysqladmin processlist

اگر پردازش‌های PHP تمام CPU را می‌گیرند یا کوئری‌های طولانی در processlist هستند، باید خود کار را بهینه کنید. در وردپرس، افزونه‌های سنگین، کوئری‌های بدون ایندکس و درخواست‌های admin-ajax.php پرتکرار از دلایل رایج‌اند. چند راه کاهش بار دیتابیس در بهینه سازی دیتابیس سرور آمده است.

مرحله سوم: پر شدن Workerهای PHP-FPM

مقدار pm.max_children باید با حافظه سرور هماهنگ باشد. اگر خیلی کم باشد، درخواست‌ها در صف می‌مانند. اگر خیلی زیاد باشد، حافظه تمام می‌شود و سرور شروع به swap می‌کند. میانگین حافظه هر Worker را اندازه بگیرید:

ps --no-headers -o rss -C php-fpm8.3 | awk '{ sum += $1; n++ } END { printf "%d workers, avg %.0f MB\n", n, sum/n/1024 }'

مقدار max_children را از تقسیم حافظه قابل‌استفاده برای PHP بر میانگین مصرف هر Worker به‌دست آورید و کمی محافظه‌کارانه بگذارید. بعد از تغییر در /etc/php/8.3/fpm/pool.d/www.conf:

sudo php-fpm8.3 -t
sudo systemctl reload php8.3-fpm

مسیرها نمونه‌اند و بسته به نسخه فرق می‌کنند.

مرحله چهارم: مهلت‌ها در Nginx

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

location ~ \.php$ {
    fastcgi_pass unix:/run/php/php8.3-fpm.sock;
    include fastcgi_params;
    fastcgi_read_timeout 120s;
}

در حالت پراکسی (Reverse Proxy) به برنامه دیگر:

proxy_connect_timeout 10s;
proxy_read_timeout 120s;

مقدار پیش‌فرض خواندن در Nginx برای هر دو 60 ثانیه است. در PHP هم max_execution_time در php.ini حدی دارد که باید با fastcgi_read_timeout هماهنگ باشد. پس از تغییر، تنظیمات را تست و بارگذاری کنید:

sudo nginx -t
sudo systemctl reload nginx

درباره ساختار پراکسی در Reverse Proxy چیست و کانفیگ Nginx در نصب Nginx روی اوبونتو بیشتر بخوانید.

504 و 524 در Cloudflare

اگر سایت پشت Cloudflare است، دو خطا را باید از هم جدا کنید:

  • 504: Cloudflare به سرور اصلی وصل شده ولی جواب مناسب نگرفته، یا خود سرور اصلی گیتوی دیگری دارد که timeout داده است.
  • 524: اتصال برقرار شده ولی سرور اصلی در مهلت تعیین‌شده (در طرح‌های معمولی حدود 100 ثانیه) پاسخ کامل نداده.

برای هر دو، لاگ سرور اصلی را ببینید. اگر کار طولانی دارید، آن را به یک صف یا کرون ببرید و جواب را سریع به کاربر بدهید. ابزار بررسی DNS دامنه نشان می‌دهد دامنه به کدام IP می‌رسد و واقعاً پشت CDN است یا نه.

مرحله پنجم: منابع سرور و شبکه

  • مصرف حافظه و swap را با free -h و vmstat 1 5 ببینید. swap سنگین یعنی سرور حافظه کم دارد. دستورات مانیتورینگ در دستورات مانیتورینگ سرور لینوکس آمده است.
  • پر بودن دیسک یا inode می‌تواند نوشتن لاگ و نشست را مختل کند: df -h و df -i.
  • اتصال سرور به سرویس بیرونی (API پرداخت، سرویس ایمیل) را بررسی کنید. اگر آن سرویس جواب نمی‌دهد، برنامه شما تا پایان مهلت منتظر می‌ماند.

جدول عیب‌یابی سریع

نشانهعلت محتملراه حل
لاگ: upstream timed outاسکریپت یا کوئری کندپیدا کردن کار کند و بهینه‌سازی
لاگ PHP-FPM: max_childrenWorkerها پر شده‌اندتنظیم pm.max_children متناسب با حافظه
504 فقط روی مسیرهای سنگینمهلت کم برای کار طولانیافزایش مهلت همان مسیر
504 فقط پشت Cloudflareسرور اصلی کند یا مهلت CDNبررسی لاگ سرور و تغییر کار طولانی به صف
همه صفحات کند، swap بالاکمبود حافظهکاهش مصرف یا افزایش حافظه
504 فقط هنگام پشتیبان‌گیریبار IO و CPUجابه‌جایی زمان بکاپ به ساعات کم‌بار

سوالات متداول

فرق 502 و 504 چیست؟

در 502 پاسخ نامعتبر یا قطع اتصال از سرور پشتی رسیده. در 504 تا پایان مهلت هیچ پاسخی نیامده است.

آیا بالا بردن timeout مشکل را حل می‌کند؟

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

504 روی سئو اثر دارد؟

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

چطور بفهمم مشکل از وردپرس است یا سرور؟

افزونه‌ها را موقتاً غیرفعال کنید و قالب پیش‌فرض بگذارید. اگر خطا رفت، مشکل از افزونه یا قالب است. اگر نرفت، منابع سرور و تنظیمات PHP-FPM را بررسی کنید.

منابع

پاسخی بگذارید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *