cPanel و WHM

رفع خطای 500 در cPanel و وردپرس (Internal Server Error)

خطای 500 در cPanel یعنی وب سرور هنگام اجرای درخواست به مشکلی خورده و دلیلش را به بازدیدکننده نشان نمی دهد. در بیشتر موارد علت یکی از این هاست: فایل htaccess خراب، خطای PHP، دسترسی اشتباه فایل ها یا یک افزونه. راه حل این است که اول لاگ خطا را بخوانید و بعد همان علت را اصلاح کنید.

نوشته تیم فنی پیکوهاستبه روزرسانی: ۹ مهر ۱۴۰۵۸ دقیقه مطالعه

وقتی سایت به جای صفحه اصلی فقط عبارت Internal Server Error و کد 500 نشان می دهد، سریع ترین کار این است که فایل .htaccess را موقتا تغییر نام بدهید و سایت را دوباره باز کنید. اگر خطا رفت، مشکل از همان فایل بوده است. اگر نرفت، باید لاگ خطا را بخوانید تا علت واقعی مشخص شود. خطای 500 در cPanel یک پیام کلی است و خودش علت را نمی گوید، پس بدون لاگ هر راه حلی حدس زدن است.

خطای 500 چه معنی دارد

کد 500 را سرور وب برمی گرداند و فقط می گوید اجرای درخواست با شکست روبه رو شده است. پشت این کد چند چیز مختلف می تواند باشد: دستور اشتباه در .htaccess، خطای مرگبار در کد PHP، تنظیمی که با نسخه PHP سازگار نیست، دسترسی غیرمجاز فایل یا پوشه، و گاهی پر شدن سهم منابع حساب. خطای 500 با خطاهایی مثل 403 یا 404 فرق دارد. در آن ها سرور می داند مشکل چیست و همین را اعلام می کند، ولی در 500 جزئیات فقط در لاگ سرور ثبت می شود.

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

اول لاگ خطا را بخوانید

هر راه حلی که پیش از دیدن لاگ امتحان کنید، ممکن است ربطی به مشکل شما نداشته باشد. این دو جا را به ترتیب نگاه کنید.

  1. در cPanel از بخش Metrics وارد Errors شوید. آخرین خطاهای وب سرور برای دامنه های حساب شما همان جا فهرست می شود.
  2. در File Manager به پوشه سایت بروید (معمولا public_html) و دنبال فایل error_log بگردید. PHP در بیشتر هاست ها خطاهای خودش را همان جا می نویسد. اگر فایل را نمی بینید، در تنظیمات File Manager گزینه Show Hidden Files را فعال کنید.
  3. اگر VPS با cPanel دارید و دسترسی root دارید، لاگ سراسری Apache را از ترمینال بخوانید.
tail -n 50 /usr/local/apache/logs/error_log

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

بعضی پیام های رایج لاگ و معنی شان این هاست:

متن در لاگمعنیبخش مربوط
Invalid command یا .htaccess: ...دستور ناشناخته یا اشتباه در htaccessبخش htaccess
Premature end of script headersاسکریپت PHP یا CGI قبل از خروجی دادن از کار افتادهبخش PHP
PHP Fatal error: Allowed memory size ... exhaustedسقف حافظه PHP پر شدهبخش PHP
Call to undefined functionافزونه یا قالب با نسخه PHP سازگار نیستبخش افزونه ها
SoftException ... writable by groupدسترسی پوشه یا فایل بیش از حد باز استبخش دسترسی ها

علت اول: فایل htaccess خراب

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

پیش از هر تغییری در .htaccess از آن نسخه پشتیبان بگیرید. در File Manager روی فایل راست کلیک کنید و Copy یا Download را بزنید. بدون نسخه پشتیبان، قانون ریدایرکت یا تنظیمات امنیتی که سال ها پیش اضافه شده را دوباره نمی توانید برگردانید.

برای آزمایش، فایل را به .htaccess-old تغییر نام بدهید و سایت را باز کنید. اگر سایت بالا آمد، علت همین فایل بوده است. در وردپرس از پیشخوان وارد تنظیمات پیوندهای یکتا شوید و ذخیره را بزنید تا فایل تازه ساخته شود. اگر ریدایرکت یا قانون دیگری اضافه کرده بودید، آن ها را یکی یکی از فایل قدیمی برگردانید تا ببینید کدام خط خطا می دهد. محتوای استاندارد وردپرس این است:

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

یک مورد رایج دیگر دستورهای php_value و php_flag است. اگر PHP روی هاست شما به صورت PHP-FPM یا CGI اجرا می شود، این دستورها در htaccess پذیرفته نمی شوند و خطای 500 می دهند. تنظیم PHP را به جای آن از MultiPHP INI Editor یا فایل .user.ini تغییر دهید. اگر قانون ریدایرکت HTTPS می نویسید، راهنمای ریدایرکت HTTPS و www با htaccess فرمت درست دستورها را نشان می دهد.

علت دوم: خطای PHP و نسخه PHP

اگر .htaccess سالم بود، سراغ PHP بروید. یک خطای مرگبار در کد، یک تابع که در نسخه جدید حذف شده یا کم بودن حافظه، همگی به 500 ختم می شوند. معمولا بعد از تغییر نسخه PHP یا به روزرسانی افزونه این اتفاق می افتد.

برای بررسی نسخه، در cPanel وارد MultiPHP Manager شوید و نسخه فعلی دامنه را ببینید. اگر خطا درست بعد از ارتقای PHP شروع شده، نسخه را یک پله برگردانید و دوباره امتحان کنید. نسخه ای که قالب و افزونه های شما پشتیبانی می کنند، در مستندات خود آن ها نوشته شده است.

برای حافظه، از MultiPHP INI Editor مقدار memory_limit را ببینید. سقف حافظه روی هاست اشتراکی را هاستینگ تعیین می کند و ممکن است بالاتر از مقدار مجاز نتوانید ببرید. اگر لاگ خطای Allowed memory size نشان می دهد و بالا بردن مقدار جواب نداد، معمولا مشکل از یک افزونه سنگین است. جزئیات تنظیم نسخه و حافظه در آموزش تنظیم نسخه PHP و memory limit در cPanel آمده است.

برای دیدن خود خطای PHP در وردپرس، در فایل 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 ذخیره می شوند و به بازدیدکننده نشان داده نمی شوند. وقتی کارتان تمام شد، WP_DEBUG را به false برگردانید و فایل لاگ را پاک کنید، چون ممکن است مسیرها و اطلاعات حساس داشته باشد. توضیح رسمی را در مستندات وردپرس می توانید ببینید.

علت سوم: افزونه یا قالب مشکل دار

اگر لاگ به پوشه ای زیر wp-content/plugins یا wp-content/themes اشاره می کند، مشکل از همان است. وقتی پیشخوان هم باز نمی شود، افزونه ها را از طریق File Manager غیرفعال کنید.

  1. وارد wp-content شوید و پوشه plugins را به plugins-off تغییر نام بدهید.
  2. سایت را باز کنید. اگر بالا آمد، مشکل از یکی از افزونه هاست.
  3. نام پوشه را به plugins برگردانید و افزونه ها را یکی یکی از پیشخوان فعال کنید تا بفهمید کدام خطا می دهد.
  4. اگر باز هم خطا بود، پوشه قالب فعال را تغییر نام بدهید تا وردپرس به قالب پیش فرض برگردد.

افزونه ای را که علت شده پاک کنید یا آخرین نسخه سازگار را نصب کنید. اگر افزونه ای کش یا بهینه ساز است، ممکن است فایل هایی در wp-content یا در ریشه سایت اضافه کرده باشد. این موارد را هم در مستندات همان افزونه بخوانید.

علت چهارم: دسترسی و مالکیت فایل ها

روی هاست هایی که PHP با دسترسی همان کاربر اجرا می شود (مثل suPHP یا LiteSpeed با کاربر اختصاصی)، پوشه ای با دسترسی 777 خطای 500 تولید می کند. مقدار پیش فرض امن برای پوشه ها 755 و برای فایل ها 644 است. در File Manager روی فایل یا پوشه راست کلیک کنید و Change Permissions را بزنید.

اگر ترمینال دارید، دسترسی ها را با این دستورها یکدست کنید. دستور را فقط در پوشه سایت خودتان اجرا کنید:

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

مالکیت فایل ها هم اهمیت دارد. فایلی که با کاربر اشتباه (مثلا root) ساخته شده باشد را کاربر cPanel نمی تواند بخواند. روی هاست اشتراکی تغییر مالکیت از دست شما خارج است و باید از پشتیبانی بخواهید.

علت پنجم: پر شدن منابع یا فضای حساب

گاهی 500 فقط در ساعت های شلوغ دیده می شود یا بعد از چند بار رفرش درست می شود. این الگو معمولا به محدودیت منابع حساب برمی گردد. اگر پیام خطا به جای 500 کد 508 یا عبارت «Resource Limit Is Reached» باشد، راهنمای خطای 508 را بخوانید. پر بودن فضای دیسک هم باعث می شود وردپرس نتواند فایل یا سشن بنویسد و خطا بدهد. مقدار مصرف را در بخش Disk Usage ببینید و اگر پر است سراغ آموزش رفع پر شدن فضا و inode بروید.

چطور مطمئن شویم مشکل حل شده است

بعد از هر تغییر، این چند کار را انجام دهید:

  • صفحه اصلی و یک صفحه داخلی را با پنجره ناشناس مرورگر باز کنید تا کش مرورگر گمراه تان نکند.
  • وارد پیشخوان وردپرس شوید و یک مطلب را ذخیره کنید.
  • در Metrics و Errors بررسی کنید خط خطای تازه ای اضافه نشده باشد.
  • اگر افزونه کش دارید، کش را خالی کنید تا صفحه قدیمی با کد 500 ذخیره نشده باشد.

اگر همه این مراحل را رفتید و هنوز خطا هست، متن دقیق آخرین خط لاگ را همراه نسخه PHP و نام افزونه های فعال برای پشتیبانی هاستینگ بفرستید. با متن لاگ، تشخیص علت معمولا چند دقیقه طول می کشد، ولی با توضیح کلی «سایتم 500 می دهد» خود پشتیبان هم باید از اول لاگ را بخواند.

اگر روی VPS هستید

مدیر VPS دسترسی root دارد و دو کار اضافه می تواند بکند. پیش از هر بار restart یا reload، پیکربندی Apache را آزمایش کنید و اگر خطا دارد جلوی اعمالش را بگیرید:

apachectl configtest

دوم، لاگ مخصوص هر دامنه و لاگ PHP-FPM را کنار لاگ سراسری بخوانید. مسیر دقیق این لاگ ها به تنظیمات سرور بستگی دارد و باید در خود سرور بررسی شود. اگر چند سایت روی یک VPS دارید و 500 فقط روی یکی است، مشکل تقریبا همیشه در فایل ها و پیکربندی همان سایت است و نه در کل سرور. برای انتخاب بین وب سرورها مقایسه LiteSpeed و Apache برای وردپرس و برای بررسی کلی هاست وردپرس چک لیست انتخاب هاست وردپرس مفید است. مستندات رسمی cPanel را هم می توانید در docs.cpanel.net ببینید.