رفتن به محتوا
بهنام باقریامنیت، پاکسازی و پشتیبانی فنی وردپرس درخواست بررسی فوری

راهنمای فنی وردپرس

عیب‌یابی و رفع ریشه‌ای خطای ۵۰۰ (Internal Server Error) از روی فایل error_log

عیب‌یابی و رفع خطای ۵۰۰

نمایش پیام مبهم و کلی «500 Internal Server Error» یا معادل آن در پیشخوان وردپرس («یک خطای مهم در این وب‌سایت رخ داده است»)، بدترین کابوس مدیران سایتی است که به جای رویکرد لاگ‌محور، متوسل به حدس و گمان می‌شوند. خطای ۵۰۰ یک کد وضعیت HTTP عمومی (Generic Status Code) است؛ به این معنا که وب‌سرور (LiteSpeed، Apache یا Nginx) در حین پردازش درخواست به بن‌بست خورده است، اما به دلایل امنیتی از افشای جزئیات خرابی در مرورگر کاربر خودداری می‌کند تا ساختار مسیرها و نسخه‌های نرم‌افزاری از دید مهاجمان پنهان بماند.

اقداماتی مانند «غیرفعال کردن فله‌ای تمام افزونه‌ها»، «تغییر نام پوشه پلاگین‌ها» یا «نصب مجدد قالب» بدون خواندن دقیق فایل لاگ، مصداق بارز حرکت در تاریکی است. یک مهندس ارشد زیرساخت هرگز حدس نمی‌زند؛ بلکه در اولین ثانیه به سراغ فایل‌های error_log در ریشه سرور می‌رود. بیش از ۹۹ درصد خطاهای ۵۰۰، امضای متنی، مسیر دقیق فایل معیوب و حتی شماره خطِ فراخوانی‌شده (Line Number) را در لاگ ثبت می‌کنند. اگر یاد بگیرید خطوط این فایل را کالبدشکافی کنید، زمان رفع بحران از چند ساعت سردرگمی به کمتر از ۳ دقیقه کاهش می‌یابد.

کالبدشکافی ریشه‌ای و عیب‌یابی و رفع خطای ۵۰۰

خطای ۵۰۰ در وردپرس معمولاً از ۴ بردار اصلی ناشی می‌شود که هر کدام ساختار پیام خطای کاملاً متمایزی در لاگ دارند:

۱. خطاهای مهلک مفسر پی‌اچ‌پی (PHP Fatal Errors)

این سناریو زمانی رخ می‌دهد که تابعی ناموجود فراخوانی شود (call to undefined function)، کلاسی یافت نشود (class not found) یا پس از آپدیت نسخه PHP سرور به PHP 8.x، کدهای یک افزونه قدیمی با توابع منسوخ‌شده برخورد کنند.

نمونه پیام واقعی در error_log:

[26-Oct-2026 14:22:01 UTC] PHP Fatal error:  Uncaught Error: Call to undefined function get_woocommerce_term_meta() in /home/user/public_html/wp-content/themes/custom-theme/inc/helpers.php:148
Stack trace:
#0 /home/user/public_html/wp-includes/class-wp-hook.php(324): custom_theme_render_meta()
#1 /home/user/public_html/wp-includes/plugin.php(205): WP_Hook->apply_filters()
#2 /home/user/public_html/wp-settings.php(617): do_action('init')
#3 /home/user/public_html/wp-config.php(98): require_once('/home/user/publ...')
#4 /home/user/public_html/wp-load.php(50): require_once('/home/user/publ...')
#5 /home/user/public_html/index.php(17): require('/home/user/publ...')
#6 {main}
  thrown in /home/user/public_html/wp-content/themes/custom-theme/inc/helpers.php on line 148

تحلیل لاگ بالا: خطا کاملاً مشخص است؛ قالب اختصاصی در فایل helpers.php روی خط ۱۴۸ تابعی را فراخوانی کرده که در نسخه‌های مدرن ووکامرس حذف شده است.

۲. سرریز حافظه موقت مفسر (Allowed Memory Size Exhausted)

اگر پردازش یک کوئری سنگین، ایمپورت محصولات در ووکامرس یا اجرای بک‌دورهای تزریقی نیازمند حافظه‌ای فراتر از سقف تعیین‌شده در کانفیگ PHP باشد، مفسر بلافاصله اجرای اسکریپت را متوقف کرده و خطای ۵۰۰ تحویل می‌دهد.

نمونه لاگ:

[26-Oct-2026 14:30:15 UTC] PHP Fatal error:  Allowed memory size of 268435456 bytes exhausted (tried to allocate 20485760 bytes) in /home/user/public_html/wp-includes/functions.php on line 5321

تحلیل لاگ بالا: مقدار memory_limit معادل ۲۵۶ مگابایت بوده و پردازش در زمان اختصاص ۲۰ مگابایت حافظه بیشتر متوقف شده است. نکته گول‌زننده اینجاست که مسیر فایل ذکرشده (wp-includes/functions.php) معمولاً بی‌تقصیر است و صرفاً نقطه سرریز را نشان می‌دهد.

۳. سینتکس نادرست یا دستورات ناشناخته در وب‌سرور (.htaccess Syntax Error)

اگر یک کاراکتر اشتباه در فایل .htaccess وارد شود یا ماژولی که دستور آن نوشته شده (مثل mod_rewrite یا ماژول‌های فشرده‌سازی لایت‌اسپید) روی سرور غیرفعال باشد، وب‌سرور پیش از آنکه حتی PHP را لود کند، هدر خطای ۵۰۰ برمی‌گرداند. این خطا در فایل لاگ اصلی آپاچی/لایت‌اسپید ثبت می‌شود:

[Mon Oct 26 14:35:10 2026] [core:alert] [pid 18234] [client 192.168.1.1:44321] /home/user/public_html/.htaccess: Invalid command 'Header_Set_Bad', perhaps misspelled or defined by a module not included in the server configuration

۴. تداخل مجوزها (Permissions) و مالکیت فایل‌ها (Ownership Mismatch)

اگر پرمیشن فایلی مانند index.php برابر با 777 باشد (که در سرورهای با امنیت suEXEC یا لایت‌اسپید به عنوان ریسک بحرانی مسدود می‌شود) یا فایل متعلق به کاربر دیگری باشد:

نمونه لاگ:

[Mon Oct 26 14:40:02 2026] [error] [client 192.168.1.1] SoftException in Application.cpp:261: File "/home/user/public_html/index.php" is writeable by group
عیب یابی و رفع خطای 500
عیب یابی و رفع خطای 500

پروتکل اجرایی و گام‌به‌گام رفع بحران (Actionable Playbook)

این پروتکل گام‌به‌گام برای ردیابی خطا در خط فرمان لینوکس (SSH) و کنترل‌پنل سرور طراحی شده است تا عامل بحران ظرف چند دقیقه ایزوله و خنثی شود.

گام ۱: فعال‌سازی لاگ‌گیری ایزوله در هسته وردپرس

اگر فایل error_log در ریشه هاست شما ساخته نمی‌شود یا غیرفعال است، با ویرایش فایل wp-config.php لاگ‌گیری را بدون افشای خطا به کاربران فعال کنید:

// این خطوط را قبل از خط /* That's all, stop editing! Happy publishing. */ اضافه کنید:
define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', false );
@ini_set( 'display_errors', 0 );

با این کار، وردپرس فایلی اختصاصی به آدرس /wp-content/debug.log می‌سازد و تمام خطاهای سیستمی را در آن می‌نویسد.

گام ۲: رهگیری بلادرنگ خطا با دستور tail در SSH

مرورگر را باز کنید، صفحه دارای ارور ۵۰۰ را رفرش کنید و هم‌زمان در ترمینال سرور دستور زیر را اجرا کنید تا جدیدترین خطای ثبت‌شده در همان ثانیه را ببینید:

# پایش زنده آخرین خطاهای اضافه شده به لاگ محلی وردپرس
tail -f -n 50 /path/to/wordpress/wp-content/debug.log

# یا پایش لاگ اختصاصی PHP هاست
tail -f -n 50 /path/to/wordpress/error_log

# در وب‌سرور اختصاصی لایت‌اسپید
tail -f -n 50 /usr/local/lsws/logs/error.log

گام ۳: فیلترسازی و استخراج خطاهای Fatal با ابزار grep

فایل‌های لاگ در سایت‌های شلوغ ممکن است هزاران خط هشدار سطحی (Notice / Deprecated) داشته باشند که هیچ ارتباطی به خطای ۵۰۰ ندارند. با فیلتر زیر فقط خطاهایی که باعث سقوط وردپرس می‌شوند را استخراج کنید:

cd /path/to/wordpress

# استخراج فقط خطاهای بحرانی Fatal، Parse و خطاهای حافظه
grep -E "(Fatal error|Parse error|Allowed memory size)" error_log | tail -n 20

گام ۴: اقدام اصلاحی بر اساس نوع خطا

سناریوی اول: خطا از یک افزونه یا قالب مشخص است

وقتی لاگ نشان داد که فایل /wp-content/plugins/bad-plugin/init.php خراب است، نیازی نیست کل افزونه‌ها را دستکاری کنید. مستقیماً همان افزونه را با ابزار WP-CLI غیرفعال کنید:

# غیرفعال‌سازی بدون نیاز به ورود به پیشخوان وردپرس
wp plugin deactivate bad-plugin --allow-root

سناریوی دوم: ارور ناشی از کمبود حافظه PHP است

اگر خطا مربوط به Allowed memory size بود، سقف حافظه مفسر را در wp-config.php بالا ببرید:

define( 'WP_MEMORY_LIMIT', '512M' );
define( 'WP_MAX_MEMORY_LIMIT', '1024M' );

سپس در فایل php.ini مقدار memory_limit = 512M را ست کرده و سرویس وب‌سرور یا php-fpm را ری‌لود کنید.

سناریوی سوم: خطا ناشی از دستکاری کدهای مخرب در فایل .htaccess است

اگر لاگ به .htaccess اشاره داشت، بلافاصله آن را موقتاً با نام دیگری تغییر دهید تا ببینید سایت بالا می‌آید یا خیر:

mv .htaccess .htaccess_broken
# ایجاد فایل تمیز جدید
cat << 'EOF' > .htaccess
# BEGIN WordPress
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]
# END WordPress
EOF
chmod 644 .htaccess

گام ۵: تست و اعتبارسنجی نهایی با cURL

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

curl -I https://example.com/

اگر سطر اول خروجی HTTP/1.1 200 OK یا HTTP/2 200 باشد، مشکل ۵۰۰ با موفقیت و بر مبنای مستندات لاگ حل شده است.

جدول مقایسه‌ای: رمزگشایی سریع امضاهای خطا در error_log

عبارت ثبت‌شده در error_logمنشأ فنی بحرانمسیر مداخله مستقیماقدام اصلاحی مهندسی
Call to undefined functionنبود یا حذف تابع (تضاد نسخه PHP / نبود اکستنشن)فایل افزونه/قالب ذکرشده در انتهای خط لاگدانگرید نسخه PHP یا آپدیت سورس کد
Allowed memory size exhaustedکمبود RAM اختصاص‌یافته به مفسر PHPphp.ini، فایل wp-config.phpافزایش memory_limit به 512M یا بهینه‌سازی کوئری
Parse error: syntax errorغلط املایی در کد PHP (مثلاً جا انداختن ; یا پرانتز)شماره خط و فایلی که دقیقاً در انتهای پیام آمدهباز کردن فایل با نانو و اصلاح کاراکتر غلط
Invalid command ... perhaps misspelledدستور اشتباه یا ماژول ناموجود در وب‌سرورفایل .htaccess یا کانفیگ VirtualHostبازنویسی قوانین .htaccess با استانداردهای رسمی
File is writeable by groupامنیت suEXEC به دلیل سطح دسترسی بالا (777)فایل index.php یا فایل‌های روت هاستاجرای chmod 644 روی فایل‌ها و 755 روی پوشه‌ها
Maximum execution time of XX exceededاسکریپت بیش از سقف مجاز سرور معطل مانده (Timeout)تنظیمات زمان پردازش PHPافزایش max_execution_time به ۳۰۰ ثانیه

هشدار امنیتی و ریسک عملیاتی در لایه سرور
در بسیاری از مواقع، خطای ۵۰۰ ناگهانی نتیجه اجرای کدهای مخرب یا وب‌شل‌های تزریق‌شده است؛ مهاجم پس از اکسپلویت، اسکریپتی را در پس‌زمینه اجرا کرده که به دلیل عدم تطابق با نسخه PHP سرور کرش کرده و سایت را پایین آورده است. پاک کردن کورکورانه فایل‌ها یا دستکاری دیتابیس بدون پشتیبان‌گیری در لایه ترمینال می‌تواند باعث از دست رفتن دائمی اطلاعات فروشگاه و مشتریان شود.
اگر سایت شما زیر بار ترافیک مشتریان قرار دارد و خطای ۵۰۰ ناشی از حملات بدافزاری، تخریب جداول دیتابیس یا تداخلات عمیق زیرساختی است، رفع ریشه‌ای آن را به متخصصی با تجربه ۹ ساله در مدیریت سرورهای هاستینگ بسپارید. می‌توانید برای بازیابی فوری و بدون بازگشت خطا، از خدمات تخصصی در صفحه پشتیبانی وردپرس یا بسته پاکسازی سایت هک شده در وب‌سایت شخصی بهنام باقری استفاده نمایید.

خطاهای رایج و بن‌بست‌های متداول

  • روشن گذاشتن WP_DEBUG_DISPLAY روی سایت زنده: نمایش خطاهای فنی PHP روی نمایشگر کاربران نه‌تنها چهره برند را تخریب می‌کند، بلکه مسیر کامل دایرکتوری‌های هاست را در اختیار هکرها می‌گذارد. خطاها فقط باید در فایل ذخیره شوند (WP_DEBUG_LOG)، نه در خروجی HTML (WP_DEBUG_DISPLAY: false).
  • نادیده گرفتن پر شدن فضای دیسک (Disk Space Full): اگر هارد سرور یا سهمیه هاست (Quota) ۱۰۰٪ پر شده باشد، سیستم‌عامل نمی‌تواند فایل سشن یا کش بنویسد و وب‌سرور ارور ۵۰۰ می‌دهد؛ حتی فایل error_log هم به دلیل کمبود فضا آپدیت نمی‌شود! همیشه ابتدا خروجی دستور df -h را چک کنید.
  • تغییر نام پوشه plugins بدون بازگرداندن ترتیبی: برخی با دیدن ارور ۵۰۰ کل پوشه افزونه‌ها را به plugins_old تغییر می‌دهند. این کار تمام تنظیمات ویجت‌ها و داده‌های وابسته را در دیتابیس دچار به هم ریختگی موقت می‌کند. راهکار استاندارد، استفاده از فرمان هدفمند wp plugin deactivate است.
  • حذف نکردن فایل debug.log پس از حل مشکل: این فایل به مرور زمان حجم‌های چند گیگابایتی پیدا می‌کند و خود باعث اتمام فضای هاست یا نشت اطلاعات امنیتی سایت به بیرون می‌شود.

پرسش‌های پرتکرار تکنیکال

۱. فایل error_log در هاست لینوکس دقیقاً در چه مسیری ذخیره می‌شود؟

محل ذخیره فایل لاگ بسته به وب‌سرور و پنل متفاوت است. در کنترل‌پنل cPanel و DirectAdmin، فایل error_log معمولاً درون همان دایرکتوری ایجاد می‌شود که اسکریپت در آن به خطا خورده است (مثلاً در روت public_html/ یا درون wp-admin/). اگر وب‌سرور شما لایت‌اسپید است، لاگ سراسری در /usr/local/lsws/logs/stderr.log یا /usr/local/lsws/logs/error.log ثبت می‌گردد و در سرورهای اوبونتو/دبیان آپاچی مسیر پیش‌فرض /var/log/apache2/error.log است.

۲. چرا با اینکه سایت خطای ۵۰۰ می‌دهد، هیچ لاگ جدیدی در error_log ثبت نمی‌شود؟

این اتفاق معمولاً به ۳ دلیل رخ می‌دهد: اول اینکه پارامتر log_errors در فایل php.ini غیرفعال (Off) است. دوم اینکه دسترسی نوشتن (Write Permission) از دایرکتوری سلب شده و وب‌سرور اجازه ساخت فایل لاگ را ندارد. سوم اینکه خطا اصلاً به لایه PHP نرسیده و در لایه وب‌سرور (مثل سینتکس اشتباه در .htaccess یا پرمیشن اشتباه فایل index.php) مسدود شده است؛ در این صورت باید لاگ سراسری خود وب‌سرور بررسی شود نه لاگ PHP.

۳. تفاوت خطای 500 Internal Server Error با خطای 503 Service Unavailable چیست؟

خطای 500 نشان‌دهنده یک «خرابی در اجرای کد یا پیکربندی» (Code Crash / Misconfiguration) است؛ یعنی مفسر تا نقطه‌ای پیش رفته اما ناگهان متوقف شده است. اما خطای 503 به معنای «عدم در دسترس بودن منابع» (Resource Exhaustion) است؛ مثلاً سقف پردازنده‌های اختصاص‌یافته در CloudLinux پر شده، استخر پردازش‌های PHP-FPM قفل کرده یا سایت موقتاً به دلیل پروسه آپدیت در حالت Maintenance Mode قرار دارد.

۴. آیا ممکن است فعال‌سازی WP_DEBUG خودش باعث کندی یا اختلال در سایت شود؟

اگر سایتی دارای افزونه‌های غیراستاندارد باشد که مداوماً کدهای منسوخ تولید می‌کنند، نوشتن مکرر هزاران خط اخطار روی هارد سرور در هر ثانیه ترافیک بالا می‌تواند باعث افزایش Disk I/O و افت سرعت شود. به همین دلیل، پس از کشف و حل علت اصلی خطای ۵۰۰، باید متغیر WP_DEBUG مجدداً روی false تنظیم شود تا دیسک زیر فشار نوشتن لاگ‌های غیرضروری قرار نگیرد.

دیدگاه‌های این مقاله

اولین دیدگاه را درباره این مقاله ثبت کنید.

ثبت دیدگاه

نشانی ایمیل شما منتشر نمی‌شود. از ارسال رمز و اطلاعات محرمانه خودداری کنید.

برای دریافت کد روی فرم کلیک کنید

مقاله‌های مرتبط