خطای 500 Internal Server Error؛ علت و رفع آن

خطای 500 Internal Server Error یعنی سرور هنگام ساختن پاسخ به مشکلی خورده که پیش‌بینی‌اش نکرده بود و نتوانسته صفحه را تحویل دهد. خود پیام علت را نمی‌گوید، ولی سرور علت را تقریباً همیشه در لاگ خطا ثبت می‌کند. رایج‌ترین دلیل‌ها خطای PHP، فایل .htaccess خراب، کمبود حافظه PHP و دسترسی اشتباه فایل‌ها هستند.

اگر بازدیدکننده سایت هستید، مشکل از سیستم شما نیست و پاک کردن کش مرورگر هم معمولاً کمکی نمی‌کند. این راهنما برای مدیر سایت یا سرور است و از سریع‌ترین راه، یعنی پیدا کردن لاگ، شروع می‌کند.

خطای 500 با خطاهای مشابه چه فرقی دارد؟

خطای 500 را خود برنامه یا وب‌سرور تولید می‌کند. خطای 502 و 504 را سرور واسط تولید می‌کند، وقتی سرویس پشت آن جواب درستی نمی‌دهد. این تفاوت مشخص می‌کند کدام لاگ را باید بخوانید: برای 500 لاگ Apache یا PHP، برای 502 لاگ Nginx و سرویس پشت آن. اگر خطای شما 502 است، راهنمای خطای 502 Bad Gateway مسیر کوتاه‌تری دارد.

اول لاگ خطا را پیدا کنید

جای لاگ به نوع هاست بستگی دارد:

محیطجای لاگ
cPanelبخش Errors در Metrics، و فایل error_log در پوشه‌ای که اسکریپت خطا داده، مثلاً public_html
DirectAdminبخش Site Summary / Statistics / Logs و گزینه Error Log دامنه
سرور Ubuntu با Apache/var/log/apache2/error.log
سرور AlmaLinux با Apache/var/log/httpd/error_log
سرور با Nginx و PHP-FPM/var/log/nginx/error.log و لاگ PHP-FPM

روی سرور، خطا را یک بار در مرورگر تکرار کنید و بلافاصله انتهای لاگ را ببینید:

sudo tail -n 40 /var/log/apache2/error.log

چند پیام رایج و معنای آن‌ها:

پیام در لاگعلت محتمل
.htaccess: Invalid command '...'دستور اشتباه در .htaccess یا ماژولی که فعال نیست
Allowed memory size of ... bytes exhaustedحافظه PHP برای این اسکریپت کافی نیست
Call to undefined function ...کد با نسخه PHP یا افزونه‌های PHP سرور سازگار نیست
Maximum execution time of 30 seconds exceededاسکریپت بیش از زمان مجاز طول کشیده
End of script output before headersاسکریپت پیش از فرستادن هدر متوقف شده؛ اغلب دسترسی فایل یا کرش PHP

علت‌های رایج خطای 500 و راه رفع

فایل .htaccess خراب

یک دستور اشتباه یا دستوری که ماژولش روی سرور فعال نیست، Apache و LiteSpeed را وادار می‌کند برای کل پوشه خطای 500 بدهد. این مشکل معمولاً بلافاصله بعد از نصب یا حذف یک افزونه امنیتی یا کش، یا بعد از ویرایش دستی فایل پیدا می‌شود. سریع‌ترین آزمایش این است که نام فایل را موقتاً به .htaccess.bak عوض کنید. اگر سایت بالا آمد، مشکل در همین فایل است.

برای وردپرس، محتوای پیش‌فرض .htaccess این است. بعد از جایگزینی، یک بار در پیشخوان به تنظیمات و بعد پیوندهای یکتا بروید و ذخیره کنید:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

خطای PHP بعد از ارتقای نسخه

خیلی از خطاهای 500 درست بعد از عوض شدن نسخه PHP شروع می‌شوند. یک افزونه یا قالب قدیمی از تابعی استفاده می‌کند که در نسخه جدید حذف شده، یا با نوع‌بندی سخت‌گیرانه‌تر PHP 8 خطای مرگبار می‌دهد. در cPanel از بخش MultiPHP Manager و در هاست‌های CloudLinux از PHP Selector می‌توانید نسخه را موقتاً برگردانید. راه‌حل دائمی به‌روز کردن یا جایگزین کردن همان افزونه یا قالب است، چون ماندن روی نسخه قدیمی PHP یعنی بی‌بهره ماندن از وصله‌های امنیتی.

کمبود حافظه PHP

پیام Allowed memory size exhausted یعنی اسکریپت بیشتر از memory_limit حافظه خواسته است. مقدار را در MultiPHP INI Editor در cPanel یا در فایل php.ini سرور بالا ببرید. در وردپرس می‌توانید این خط را هم به wp-config.php اضافه کنید، ولی فقط وقتی اثر دارد که سرور اجازه تغییر حد را بدهد:

define( 'WP_MEMORY_LIMIT', '256M' );

اگر یک صفحه با ۲۵۶ مگابایت هم خطا می‌دهد، احتمالاً مشکل از یک حلقه یا کوئری خیلی سنگین است و بالا بردن حد فقط آن را عقب می‌اندازد.

دسترسی اشتباه فایل‌ها و پوشه‌ها

روی هاست‌هایی که PHP با کاربر خود حساب اجرا می‌شود، فایلی که برای گروه یا همه قابل نوشتن باشد، مثلاً با دسترسی 777، ممکن است به‌جای اجرا خطای 500 بدهد. مقدار معمول 644 برای فایل‌ها و 755 برای پوشه‌هاست. روی سرور می‌توانید آن‌ها را یک‌جا درست کنید:

cd /home/USER/public_html
find . -type d -exec chmod 755 {} \;
find . -type f -exec chmod 644 {} \;

مالک فایل‌ها هم مهم است. در cPanel مالک باید خود کاربر حساب باشد و روی سرور Ubuntu با Apache معمولاً www-data. اصول دسترسی در لینوکس در راهنمای مدیریت دسترسی در لینوکس آمده است.

اسکریپت طولانی و محدودیت زمان

درون‌ریزی محصول، ساخت بکاپ یا ارسال گروهی ایمیل اگر از max_execution_time طولانی‌تر شود، با خطای مرگبار متوقف می‌شود. برای کارهای سنگین بهتر است به‌جای بالا بردن زمان برای کل سایت، آن کار را از طریق خط فرمان یا Cron اجرا کنید.

عیب‌یابی خطای 500 در وردپرس

وردپرس از نسخه 5.2 به بعد خطاهای مرگبار را می‌گیرد و به‌جای صفحه سفید پیام وجود خطای جدی در سایت را نشان می‌دهد. همزمان ایمیلی با لینک حالت بازیابی برای مدیر سایت می‌فرستد که با آن می‌توانید وارد پیشخوان شوید و افزونه مقصر را غیرفعال کنید. اگر این ایمیل نرسید، این مراحل را به ترتیب بروید.

برای دیدن خطای دقیق، این سه خط را در wp-config.php و پیش از خط That’s all, stop editing بگذارید:

define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', false );

خطاها در فایل wp-content/debug.log ثبت می‌شوند و روی صفحه نمایش داده نمی‌شوند. بعد از پیدا کردن مشکل، این تنظیمات را برگردانید و فایل debug.log را پاک کنید، چون این فایل از طریق مرورگر قابل دانلود است و ممکن است مسیر فایل‌ها و اطلاعات سرور را لو بدهد.

اگر لاگ به افزونه یا قالب مشخصی اشاره نمی‌کند، همه افزونه‌ها را غیرفعال کنید. بدون دسترسی به پیشخوان، نام پوشه wp-content/plugins را عوض کنید. با دسترسی SSH، WP-CLI کار را ساده‌تر می‌کند:

wp plugin deactivate --all
wp plugin activate woocommerce
wp theme activate twentytwentyfour

دستور آخر فقط وقتی کار می‌کند که آن قالب نصب باشد. اگر خطای 500 همراه با فایل‌های ناشناس، ریدایرکت به سایت‌های دیگر یا تغییر ناگهانی فایل‌های هسته وردپرس ظاهر شده، احتمال آلودگی را جدی بگیرید و پیش از هر کاری از سایت بکاپ بگیرید.

خطای 500 روی سرور با Nginx و PHP-FPM

وقتی Nginx جلوی PHP-FPM است، خطای مرگبار PHP معمولاً به‌صورت 500 به مرورگر می‌رسد و متن خطا در لاگ PHP-FPM یا لاگ خطای Nginx ثبت می‌شود. اگر لاگ خالی است، بررسی کنید log_errors در php.ini روشن باشد و در فایل pool گزینه catch_workers_output = yes فعال باشد تا خروجی خطای پروسه‌ها گم نشود.

روی سرور تولیدی display_errors را خاموش نگه دارید. نمایش خطا روی صفحه به مهاجم مسیر فایل‌ها، نسخه‌ها و گاهی نام دیتابیس را نشان می‌دهد. خواندن لاگ همان اطلاعات را بدون این خطر می‌دهد.

وقتی علت پیدا نمی‌شود

اگر لاگ‌ها چیزی نشان نمی‌دهند، چند نکته را بررسی کنید. فضای دیسک پر نشده باشد (df -h)، چون PHP و دیتابیس بدون فضا نمی‌توانند فایل موقت بسازند. سهمیه inode هاست تمام نشده باشد، که روی هاست‌های اشتراکی با کش‌های پرتعداد زیاد پیش می‌آید. دیتابیس در دسترس باشد؛ وردپرس برای خطای اتصال به دیتابیس هم صفحه خطا با کد 500 برمی‌گرداند.

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

آیا خطای 500 با پاک کردن کش رفع می‌شود؟

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

چرا خطای 500 فقط در پیشخوان وردپرس دیده می‌شود؟

افزونه‌هایی که فقط در پیشخوان بارگذاری می‌شوند، مثل صفحه تنظیمات یک افزونه یا ویرایشگر صفحه‌ساز، معمولاً مقصرند. همان روش غیرفعال کردن افزونه‌ها و خواندن debug.log را امتحان کنید. کمبود حافظه هم بیشتر در پیشخوان خودش را نشان می‌دهد، چون وردپرس برای بخش مدیریت حد حافظه بالاتری می‌خواهد.

خطای 500 بعد از جابه‌جایی سایت به هاست جدید رخ داده؛ از کجا شروع کنم؟

نسخه PHP هاست جدید، اطلاعات دیتابیس در wp-config.php و فایل .htaccess سه جای اول هستند. فهرست کامل کارهای پیش و پس از انتقال را در انتقال سایت وردپرس به هاست جدید نوشته‌ایم.

خطای 500 روی سئو اثر می‌گذارد؟

اگر کوتاه باشد، نه. گوگل وقتی مدتی پشت سر هم با خطاهای 5xx روبه‌رو شود، خزیدن در سایت را کند می‌کند و اگر خطا ادامه پیدا کند، صفحه‌ها ممکن است از نتایج جست‌وجو بیرون بروند.

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

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