504 Gateway Timeout: عندما يكون الخادم الخلفي بطيئًا جدًا
504 Gateway Timeout يعني أن بروكسي أو بوابة كفّ عن انتظار الرد من الخادم الخلفي الذي يقف وراءه.
504 Gateway Timeout يعني أن بروكسي أو موزّع أحمال أو CDN انتظر التطبيق الذي خلفه ثم استسلم قبل أن يصل الجواب. وعلى خلاف 502، لم يُرسل الخادم الخلفي ردًا معطوبًا؛ كان بطيئًا فحسب.
التعريف
جاء في RFC 9110، القسم 15.6.5 أن الخادم، «أثناء عمله كبوابة أو بروكسي، لم يتلقَّ ردًا في الوقت المناسب من خادم وارد كان يحتاج إلى الوصول إليه لإكمال الطلب». والمهلة هنا تخص البوابة. فينتظر Nginx 60 ثانية افتراضيًا (proxy_read_timeout وfastcgi_read_timeout)، ولموزّعات الأحمال السحابية مهلات الخمول الخاصة بها. ويبلّغ Cloudflare عن الحالة نفسها بالرمز 524.
الأسباب الشائعة
- استعلامات قواعد بيانات بطيئة: فهارس مفقودة، وعمليات ربط (joins) ضخمة، وجداول مقفلة.
- صفحات تستدعي واجهات API خارجية أثناء العرض وتنتظر عندما تكون بطيئة.
- مهام طويلة تبدأ من طلب ويب: التصدير والاستيراد ومعالجة الصور وتوليد خرائط الموقع لحظيًا.
- عدد عمّال (workers) أقل من حجم الزيارات، فتصطف الطلبات حتى تنتهي مهلتها.
- مشاكل في الشبكة بين البروكسي وخادم التطبيق.
التأثير على السيو
تضع Google الرمز 504 مع أخطاء الخادم الأخرى (وثائق Google): يبطّئ Googlebot زحفه، وتنجو الروابط المفهرسة من المشاكل القصيرة، وتُزال الروابط التي تواصل الفشل. والبطء يضر حتى قبل أن تنتهي مهلة الطلبات. فتوضح إرشادات ميزانية الزحف لدى Google أن سعة الزحف تنخفض عندما يستجيب الموقع ببطء أو يعيد أخطاء. كما أن أزمنة الاستجابة الطويلة تعني زمنًا طويلًا إلى أول بايت للزوار.
كيف تصلح 504
اعثر على الجزء البطيء
# أي الطلبات تنتهي مهلتها؟
grep "upstream timed out" /var/log/nginx/error.log | tail
# MySQL: سجّل الاستعلامات الأبطأ من ثانيتين
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 2;
اجعله أسرع
- أضف فهارس لقاعدة البيانات وخزّن الاستعلامات المكلفة مؤقتًا (object cache وpage cache).
- انقل الأعمال الثقيلة إلى طابور في الخلفية ودع الصفحة تستعلم عن النتيجة دوريًا، وهو نمط 202 Accepted.
- ولّد الملفات الكبيرة مسبقًا، مثل خرائط الموقع XML، بدل بنائها عند كل طلب.
- اضبط مهلات قصيرة للاستدعاءات الصادرة إلى واجهات API وارجع إلى بيانات مخزّنة عندما تفشل.
ارفع المهلات كحل مؤقت فقط
# Nginx
proxy_read_timeout 120s; # لـ proxy_pass
fastcgi_read_timeout 120s; # لـ PHP-FPM
; يجب أن يسمح بذلك أيضًا مجمّع PHP-FPM وملف php.ini
request_terminate_timeout = 120s
max_execution_time = 120
يجب أن تتوافق المهلات عبر الطبقات؛ وإلا فستفوز الأقصر منها في النهاية.
كيف تتحقق
تعرض أداة فحص حالة HTTP حالة كل رابط وزمن استجابته، فتكتشف الصفحات البطيئة قبل أن تبلغ الحد، وتفصّل أداة اختبار سرعة الصفحة زمن استجابة الخادم لصفحة واحدة.
HTTP/1.1 504 Gateway Time-out
Server: nginx
Content-Type: text/html
Content-Length: 160
ما زال Nginx يطبع الصيغة القديمة «Gateway Time-out»؛ وهي الحالة نفسها.
الأسئلة الشائعة
ما الفرق بين 504 و502؟
الرمز 504 يعني أن الخادم الخلفي لم يجب في الوقت المناسب. والرمز 502 يعني أنه أجاب بشيء غير صالح أو قطع الاتصال. وكلاهما يأتي من بروكسي أو بوابة لا من التطبيق نفسه.
هل أستطيع إصلاح 504 برفع المهلات؟
مؤقتًا فقط. المهلات الأطول تخفي البطء عن البوابة، لكن الزوار والزواحف ما زالوا ينتظرون. سرّع الطلب البطيء أو انقل العمل إلى مهمة في الخلفية.
هل يؤثر 504 Gateway Timeout على السيو؟
نعم. تعدّه Google خطأ في الخادم فتزحف أقل، وقد تُزال من الفهرس الروابط التي تتكرر مهلتها. كما أن الاستجابات البطيئة تقلل مقدار ما تزحف إليه Google عمومًا.