فهرست مقاله
دیروز بعد از ظهر، داشتم ابزار مدیریت پایگاه داده Adminer را روی سرور پیکربندی میکردم. Adminer سبک و استفاده از آن آسان است؛ برخلاف phpMyAdmin که به مجموعهای از وابستگیها نیاز دارد، یک فایل PHP کار را انجام میدهد. من آخرین نسخه را از وبسایت رسمی دانلود کردم، آن را روی سرور آپلود کردم، مجوزها را تنظیم کردم و مرورگرم را باز کردم، آماده بررسی آن بودم.
سپس، همه چیز خالی شد.

سه بار صفحه را رفرش کردم، انگشتانم از فشار دادن مکرر F5 درد میگرفتند. هنوز هیچ اتفاقی نیفتاده بود. ابزارهای توسعهدهنده مرورگر را باز کردم؛ خطای 200 OK را نشان میداد، اما بدنه پاسخ خالی بود. کاملاً مبهوت شده بودم. چه اتفاقی داشت میافتاد؟
یک لحظه به آن فکر کردم. آیا ممکن است مشکل از مجوز فایل باشد؟ بررسی کردم و ۷۵۵ بود. آیا ممکن است ناسازگاری نسخه PHP باشد؟ بررسی کردم و PHP 8.2 است که مشکلی ندارد. آیا ممکن است خود فایل معیوب باشد؟ یک نسخه جدید دانلود کردم، آن را بازنویسی کردم و هنوز خالی است.
به دلایلی غیرقابل توضیح، با خودم فکر کردم، چرا اسمم را عوض نکنم؟
من adminer.php را به adminer1.php تغییر نام دادم و صفحه را رفرش کردم.
دسترسی با موفقیت انجام شد.
واقعاً گیج شده بودم. همان فایل، همان کد، همان سرور، و فقط با تغییر نام قابل دسترسی است؟ این چه منطق عرفانی است؟
مشکل خالی بودن فایل adminer.php
بعداً فهمیدم که این یک نوع خرافات نبود؛ بلکه مشکل از کش کردن PHP بود.
OPcache، مخفف Opcode Cache، یک افزونه بهینهسازی عملکرد برای PHP است. اصل آن ساده است: PHP یک زبان تفسیری است و هر درخواست نیاز دارد که کد PHP قبل از اجرا به opcode کامپایل شود. OPcache نتیجه کامپایل شده را در حافظه ذخیره میکند و به درخواستهای بعدی اجازه میدهد تا از نسخه ذخیره شده مستقیماً بدون کامپایل مجدد استفاده کنند و در نتیجه بهبود قابل توجهی در عملکرد ایجاد میشود.
اما مشکل همین جاست.
قبلاً، adminer.php پیام "فایل یافت نشد" را نمایش میداد (من فایل اشتباهی را آپلود کرده بودم) و OPcache نتیجه کامپایل شده آن محتوای نادرست را ذخیره کرده بود. بعداً، adminer.php را با کد صحیح جایگزین کردم، اما OPcache آن را نادیده گرفت و به خواندن حافظه پنهان قدیمی از حافظه ادامه داد، که منجر به یک صفحه خالی یا پیام خطای قدیمی میشد.
وقتی نام آن را به adminer1.php تغییر میدهید، به یک مسیر فایل کاملاً جدید برای OPcache تبدیل میشود و آن را به درستی بارگذاری و حل میکند.
مثل این است که شما قبلاً یک کتاب جدید تهیه کردهاید، اما کارت فهرست کتابخانه هنوز شماره راهنمای کتاب قدیمی را دارد. وقتی برای پیدا کردن آن به قفسه میروید، طبیعتاً خالی است. اما اگر عنوان کتاب را تغییر دهید، کتابخانه یک کارت فهرست جدید برای شما ایجاد میکند و سپس میتوانید آن را پیدا کنید.
دلیل ۱: حافظه پنهان OPcache باعث ایجاد فضاهای خالی میشود
باید باهاش چکار کنم؟
سرویس PHP-FPM را مجدداً راهاندازی کنید و حافظه پنهان OPcache را پاک کنید.
# 查看正在运行的PHP版本
php -v
# 重启对应的PHP-FPM(例如PHP 8.5)
sudo systemctl restart php8.5-fpm
# 或者重启所有PHP-FPM服务
sudo systemctl restart php*-fpmپس از راهاندازی مجدد، نام فایل را به adminer.php تغییر دهید، صفحه وب را رفرش کنید (توصیه میشود برای رفرش اجباری مرورگر، Ctrl+F5 را فشار دهید)، و مشکل باید حل شود.
اما داستان هنوز تمام نشده است.
بعد از راهاندازی مجدد PHP-FPM، فایل adminer.php را به حالت قبل برگرداندم، صفحه را رفرش کردم، اما هنوز خالی بود. کاملاً گیج شده بودم.
دلیل ۲: محدودیتهای قوانین پیکربندی Nginx
این منجر به دومین دلیل احتمالی میشود.
فایل پیکربندی Nginx ممکن است قوانین خاصی داشته باشد که adminer.php را محدود میکند.
من قبلاً Fail2Ban را در پنل HestiaCP پیکربندی کرده بودم و یک قانون تطابق دقیق برای adminer.php نوشتم تا از حملات brute-force جلوگیری شود. این قانون نام فایل adminer.php را به صورت hardcode شده قرار میداد، بنابراین وقتی آن را به adminer1.php تغییر نام میدادید، این قانون Nginx را دور میزدید و میتوانستید به طور عادی به آن دسترسی داشته باشید.
روش عیبیابی ساده است: در پیکربندی Nginx به دنبال ورودیهای کدگذاریشده بگردید.
sudo grep -rn "adminer.php" /etc/nginx/اگر قوانینی مانند `location = /adminer.php { … }` پیدا کردید، به این معنی است که Nginx به طور خاص با این نام فایل خاص برخورد میکند. فقط آن را حذف یا تغییر دهید.
دلیل ۳: تنظیمات نمایش خطای PHP
دلیل سوم ظریفتر است.
اسکریپت PHP متوقف میشود یا خطایی میدهد، اما صفحه نمایش خطا را غیرفعال میکند (display_errors = خاموش). در یک محیط عملیاتی، PHP به طور پیشفرض خطاها را پنهان میکند و یک صفحه خالی نمایش میدهد. اگر فایل ورودی شما (مثلاً index.php) به هر دلیلی هنگام تلاش برای افزودن "./adminer.php" از کار بیفتد، صفحه به سادگی خالی میشود.
در چنین شرایطی، بررسی گزارش خطا مطمئنترین روش است:
# 查看Nginx错误日志
sudo tail -n 20 /var/log/nginx/error.log
# 或者查看HestiaCP对应域名的error日志
sudo tail -n 20 /var/log/nginx/domains/adminer.domain.com.error.logگزارش، دلیل واقعی صفحه سفید را به شما میگوید.
راستش را بخواهید، بالاخره با بررسی error.log مشکل را پیدا کردم. معلوم شد که adminer.php یک افزونهی PHP ناموجود را فراخوانی میکند و display_errors خاموش است، بنابراین صفحه خالی بود، اما گزارش خطا آن را به وضوح ثبت میکرد.
راهکارها و مراحل رفع مشکل
این حادثه تأثیر عمیقی بر من گذاشته است.
مشکلات فنی اغلب به آن سادگی که در ظاهر به نظر میرسند، نیستند. یک فایل adminer.php خالی ممکن است در نگاه اول مانند یک مشکل فایل به نظر برسد، اما بررسی عمیقتر میتواند مشکل ذخیرهسازی را آشکار کند، در ادامه میتواند یک مشکل پیکربندی باشد و حتی در ادامه میتواند مشکل از خود کد باشد.
اگر برنامهنویس نیستید، ممکن است فکر کنید این موارد به شما ربطی ندارند. اما در مورد آن فکر کنید: هر برنامهای که استفاده میکنید، هر صفحه وبی که بازدید میکنید، سیستم مشابهی در پشت صحنه دارد. ذخیرهسازی موقت، پیکربندی، مدیریت خطا - این مفاهیم در واقع همه جا هستند.
درست مثل ما انسانها. بسیاری از اوقات، «نشانههایی» که ما از خود نشان میدهیم، مانند تعلل، اضطراب و تحریکپذیری، ممکن است در ظاهر تنبلی به نظر برسند، اما با عمیقتر شدن، ممکن است به دلیل اهداف نامشخص، کندوکاو بیشتر، ترس از شکست و حتی عمیقتر، طرز فکری باشند که توسط تجربیات کودکی شکل گرفته است.
تنها با یافتن علت اصلی میتوانیم داروی مناسب را تجویز کنیم.
در نهایت، اگر با مشکل خالی بودن فایل adminer.php نیز مواجه شدید، آن را به ترتیب زیر بررسی کنید:
ابتدا PHP-FPM را مجدداً راه اندازی کنید و حافظه پنهان را پاک کنید، سپس پیکربندی Nginx را بررسی کنید و در نهایت error.log را بررسی کنید.
در بیشتر موارد، دو مرحله اول برای حل مشکل کافی است.
البته، اگر هنوز مشکل حل نشده، error.log را بررسی کنید.
جواب را به شما خواهد گفت.
از آنجایی که تا اینجا را خواندهاید، اگر برایتان مفید بود، لطفاً آن را لایک کنید و به اشتراک بگذارید. اگر میخواهید زودتر از بقیه از بهروزرسانیها مطلع شوید، میتوانید من را دنبال کنید!
ممنون که مقاله من را خواندید. دفعه بعد میبینمتان.
امیدوارم مقاله "دسترسی Adminer.php خالی است؟ تغییر نام به طور عادی کار میکند؟ تحلیل دلایل و ۳ مرحله برای حل کامل مشکل" که در وبلاگ چن ویلیانگ ( https://www.chenweiliang.com/ ) به اشتراک گذاشته شده است، برای شما مفید باشد.
لینک این مقاله را به اشتراک بگذارید: https://www.chenweiliang.com/cwl-34403.html
