Tại sao file Adminer.php lại trống? Đổi tên file thì lại hoạt động bình thường? Phân tích nguyên nhân và giải pháp 3 bước.

Chiều hôm qua, tôi đã cấu hình công cụ quản lý cơ sở dữ liệu Adminer trên máy chủ. Adminer nhẹ và dễ sử dụng; chỉ cần một tệp PHP duy nhất là đủ, không giống như phpMyAdmin yêu cầu rất nhiều thư viện phụ thuộc. Tôi đã tải phiên bản mới nhất từ ​​trang web chính thức, tải lên máy chủ, thiết lập quyền truy cập và mở trình duyệt, sẵn sàng để kiểm tra.

Rồi mọi thứ tối sầm lại.

Tại sao file Adminer.php lại trống? Đổi tên file thì lại hoạt động bình thường? Phân tích nguyên nhân và giải pháp 3 bước.

Tôi làm mới trang ba lần, ngón tay đau nhức vì nhấn phím F5 quá nhiều lần. Vẫn không có gì. Tôi mở công cụ dành cho nhà phát triển của trình duyệt; nó hiển thị lỗi 200 OK, nhưng phần thân phản hồi trống rỗng. Tôi hoàn toàn sững sờ. Chuyện gì đang xảy ra vậy?

Tôi suy nghĩ một lúc. Có thể là do vấn đề quyền truy cập tệp? Tôi đã kiểm tra và quyền là 755. Có thể là do không tương thích phiên bản PHP? Tôi đã kiểm tra và đó là PHP 8.2, phiên bản này hoàn toàn ổn. Liệu chính tệp tin đó có bị lỗi? Tôi đã tải xuống một bản sao mới, ghi đè lên tệp tin cũ, nhưng nó vẫn trống.

Không hiểu vì lý do gì, tôi lại nghĩ, sao không thử đổi tên nhỉ?

Tôi đã đổi tên tệp adminer.php thành adminer1.php và làm mới trang.

Việc truy cập đã thành công.

Tôi thực sự rất bối rối. Cùng một tập tin, cùng một đoạn mã, cùng một máy chủ, vậy mà chỉ cần đổi tên là có thể truy cập được? Logic huyền bí kiểu gì vậy?

Vấn đề về tệp adminer.php trống

Sau đó tôi nhận ra rằng đây không phải là một loại mê tín dị đoan nào cả; chính việc lưu vào bộ nhớ đệm của PHP mới là nguyên nhân gây ra vấn đề.

OPcache, viết tắt của Opcode Cache, là một tiện ích mở rộng tối ưu hóa hiệu năng cho PHP. Nguyên tắc của nó rất đơn giản: PHP là một ngôn ngữ thông dịch, và mỗi yêu cầu đều cần mã PHP được biên dịch thành mã lệnh trước khi thực thi. OPcache lưu trữ kết quả biên dịch trong bộ nhớ, cho phép các yêu cầu tiếp theo sử dụng trực tiếp phiên bản đã được lưu trong bộ nhớ mà không cần biên dịch lại, dẫn đến cải thiện hiệu năng đáng kể.

Nhưng vấn đề nằm ở chỗ đó.

Trước đây, adminer.php hiển thị thông báo "Không tìm thấy tệp" (tôi đã tải lên nhầm tệp), và OPcache đã lưu trữ kết quả biên dịch của nội dung không chính xác đó. Sau đó, tôi đã thay thế adminer.php bằng mã đúng, nhưng OPcache lại bỏ qua và tiếp tục đọc dữ liệu cũ từ bộ nhớ cache, dẫn đến trang trắng hoặc thông báo lỗi cũ.

Khi bạn đổi tên nó thành adminer1.php, nó sẽ trở thành một đường dẫn tệp hoàn toàn mới đối với OPcache, và nó sẽ được tải lại và giải quyết đúng cách.

Nó giống như việc bạn đã có một cuốn sách mới, nhưng thẻ chỉ mục của thư viện vẫn ghi số hiệu của cuốn sách cũ. Khi bạn tìm nó trên kệ, tất nhiên là kệ trống. Nhưng nếu bạn thay đổi tiêu đề sách, thư viện sẽ tạo một thẻ chỉ mục mới cho bạn, và sau đó bạn có thể tìm thấy nó.

Lý do 1: Bộ nhớ đệm OPcache gây ra khoảng trắng

Làm thế nào để đối phó với nó?

Khởi động lại dịch vụ PHP-FPM và xóa bộ nhớ cache OPcache.

# 查看正在运行的PHP版本
php -v

# 重启对应的PHP-FPM(例如PHP 8.5)
sudo systemctl restart php8.5-fpm

# 或者重启所有PHP-FPM服务
sudo systemctl restart php*-fpm

Sau khi khởi động lại, hãy đổi tên tệp tin trở lại thành adminer.php, làm mới trang web (nên nhấn Ctrl+F5 để buộc trình duyệt làm mới), và sự cố sẽ được giải quyết.

Nhưng câu chuyện vẫn chưa kết thúc.

Sau khi khởi động lại PHP-FPM, tôi đã đổi lại file adminer.php, làm mới trang, nhưng trang vẫn trống. Tôi hoàn toàn bối rối.

Lý do 2: Hạn chế của quy tắc cấu hình Nginx

Điều này dẫn đến lý do khả dĩ thứ hai.

Tệp cấu hình Nginx có thể chứa các quy tắc đặc biệt hạn chế quyền truy cập vào adminer.php.

Trước đây tôi đã cấu hình Fail2Ban trong bảng điều khiển HestiaCP và viết một quy tắc khớp chính xác cho adminer.php để ngăn chặn các cuộc tấn công vét cạn mật khẩu. Quy tắc này mã hóa cứng tên tệp là adminer.php, vì vậy khi bạn đổi tên nó thành adminer1.php, bạn đã bỏ qua quy tắc Nginx này và có thể truy cập bình thường.

Phương pháp khắc phục sự cố rất đơn giản: tìm kiếm các mục được mã hóa cứng trong cấu hình Nginx.

sudo grep -rn "adminer.php" /etc/nginx/

Nếu bạn thấy các quy tắc như `location = /adminer.php { … }`, điều đó có nghĩa là Nginx đang xử lý tên tệp cụ thể này một cách đặc biệt. Chỉ cần xóa hoặc sửa đổi nó.

Lý do 3: Cài đặt hiển thị lỗi PHP

Lý do thứ ba thì tinh tế hơn.

Tập lệnh PHP bị chặn hoặc báo lỗi, nhưng trang web lại tắt hiển thị lỗi (display_errors = Off). Trong môi trường sản xuất, PHP mặc định ẩn lỗi, hiển thị một trang trắng. Nếu tập tin đầu vào của bạn (ví dụ: index.php) bị lỗi vì lý do nào đó khi cố gắng bao gồm "./adminer.php", trang sẽ chỉ đơn giản là chuyển sang trang trắng.

Trong những trường hợp như vậy, kiểm tra nhật ký lỗi là phương pháp đáng tin cậy nhất:

# 查看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

Nhật ký hệ thống sẽ cho bạn biết lý do thực sự gây ra màn hình trắng.

Thành thật mà nói, cuối cùng tôi đã tìm ra vấn đề bằng cách kiểm tra tệp error.log. Hóa ra là adminer.php đang gọi một phần mở rộng PHP không tồn tại, và display_errors đã bị tắt, vì vậy trang web trống trơn, nhưng nhật ký lỗi lại ghi lại điều đó rõ ràng.

Các giải pháp và bước khắc phục sự cố

Sự việc này đã để lại ấn tượng sâu sắc trong tôi.

Các vấn đề kỹ thuật thường không đơn giản như vẻ bề ngoài. Một tệp adminer.php trống rỗng thoạt nhìn có vẻ như là vấn đề về tệp, nhưng khi tìm hiểu sâu hơn, có thể phát hiện ra vấn đề về bộ nhớ đệm, xa hơn nữa có thể là vấn đề về cấu hình, và xa hơn nữa nữa có thể là vấn đề với chính mã nguồn.

Nếu bạn không phải là lập trình viên, bạn có thể nghĩ những điều này không liên quan đến mình. Nhưng hãy suy nghĩ kỹ: mọi ứng dụng bạn sử dụng, mọi trang web bạn truy cập, đều có một hệ thống tương tự hoạt động ngầm. Bộ nhớ đệm, cấu hình, xử lý lỗi—những khái niệm này thực sự có mặt ở khắp mọi nơi.

Cũng giống như con người chúng ta. Nhiều khi, những "triệu chứng" mà chúng ta thể hiện, chẳng hạn như trì hoãn, lo lắng và cáu kỉnh, thoạt nhìn có vẻ như là do lười biếng, nhưng nếu tìm hiểu sâu hơn, chúng có thể xuất phát từ mục tiêu không rõ ràng, nỗi sợ thất bại, và thậm chí sâu xa hơn, là do tư duy bị ảnh hưởng bởi những trải nghiệm thời thơ ấu.

Chỉ khi tìm ra nguyên nhân gốc rễ thực sự, chúng ta mới có thể kê đơn thuốc đúng.

Cuối cùng, nếu bạn cũng gặp phải vấn đề file adminer.php trống, hãy kiểm tra theo thứ tự sau:

Đầu tiên, hãy khởi động lại PHP-FPM và xóa bộ nhớ cache, sau đó kiểm tra cấu hình Nginx, và cuối cùng kiểm tra tệp error.log.

Trong hầu hết các trường hợp, hai bước đầu tiên là đủ để giải quyết vấn đề.

Tất nhiên, nếu vẫn không được, hãy kiểm tra tệp error.log.

Nó sẽ cho bạn câu trả lời.

Vì bạn đã đọc đến đây, nếu thấy hữu ích, hãy nhấn thích và chia sẻ nhé. Nếu muốn nhận thông tin cập nhật sớm nhất, bạn cũng có thể theo dõi tôi!

Cảm ơn bạn đã đọc bài viết của tôi. Hẹn gặp lại lần sau.

Hi vọng bài viết "Truy cập Adminer.php trống? Đổi tên vẫn hoạt động bình thường? Phân tích nguyên nhân và 3 bước để giải quyết triệt để vấn đề" được chia sẻ trên blog của Chen Weiliang ( https://www.chenweiliang.com/ ) sẽ hữu ích cho bạn.

Bạn có thể thoải mái chia sẻ liên kết bài viết này: https://www.chenweiliang.com/cwl-34403.html

Để khám phá thêm nhiều mẹo ẩn🔑, vui lòng tham gia kênh Telegram của chúng tôi!

Chia sẻ và thích nếu bạn thích nó! Những chia sẻ và lượt thích của bạn là động lực tiếp tục của chúng tôi!

 

发表 评论

您的邮箱地址不会被公开。必填项已用*标注

Di chuyển về đầu trang