1. Tư duy xử lý lỗi: phân lớp và khoanh vùng nhanh
Khi gặp lỗi PHP, hãy xác định ngay lỗi thuộc lớp nào:
Lớp HTTP/Nginx: 404/403/502/504, lỗi upstream, timeout, body too large…
Lớp PHP-FPM: process chết, pool bão hòa (
pm.max_children), slowlog, segfault, permission socket…Lớp ứng dụng: fatal error, memory exhausted, autoload, composer, Drupal bootstrap…
Lớp dữ liệu: MariaDB slow query/lock, Redis down, connection refused, DNS…
Lớp hệ điều hành: OOM kill, file descriptor, disk full, inode, permission SELinux/AppArmor (nếu có).
Nguyên tắc: đọc log đúng chỗ trước, không đoán.
2. “Bộ 3” log bắt buộc phải xem đầu tiên
2.1. Nginx error log
2.2. PHP-FPM log
Tùy cấu hình, thường ở:
2.3. Log ứng dụng
Drupal:
sites/default/files/phphoặc syslog tùy cấu hìnhNếu bạn bật logging qua syslog:
Tip: Khi xử lý sự cố, dùng grep theo request id, URI, hoặc timestamp.
3. Lỗi 502 Bad Gateway (Nginx ↔ PHP-FPM)
3.1. Dấu hiệu thường gặp trong Nginx error log
connect() to unix:/run/php/php8.3-fpm.sock failedupstream prematurely closed connectionrecv() failed (104: Connection reset by peer)
3.2. Checklist chẩn đoán nhanh
PHP-FPM có chạy không?
Socket/tcp upstream đúng chưa?
Kiểm tra file cấu hình site:
Quyền truy cập socket:
Nếu Nginx chạy user www-data, socket phải cho phép www-data truy cập.
PHP-FPM pool bão hòa (
pm.max_childrenquá thấp):
3.3. Fix phổ biến
Tăng
pm.max_children(có kiểm chứng bằng log bão hòa).Tối ưu timeout:
Nginx:
fastcgi_read_timeoutPHP:
max_execution_time,request_terminate_timeout(FPM)
Bật slowlog để xem request nào kéo dài.
4. Lỗi 504 Gateway Timeout (timeout khi xử lý PHP)
4.1. Nguyên nhân phổ biến
PHP xử lý quá lâu (query nặng, API treo, deadlock DB).
Nginx timeout ngắn hơn thời gian xử lý.
PHP-FPM thiếu worker hoặc worker kẹt.
4.2. Kiểm tra nhanh
Nhìn lỗi timeout trong Nginx:
Kiểm tra slow requests trong PHP-FPM (khuyến nghị bật):
Mở pool config:
Bổ sung:
Reload:
Xem slowlog:
5. Lỗi “Allowed memory size exhausted” (PHP memory)
5.1. Dấu hiệu
Trả 500, trong log có:
Allowed memory size of ... exhausted
5.2. Kiểm tra memory limit thực tế
CLI và FPM có thể khác nhau:
5.3. Fix đúng cách
Tăng
memory_limitcho FPM:/etc/php/8.3/fpm/php.ini
Nhưng quan trọng hơn: xác định đoạn nào “phình”:
Query trả quá nhiều dữ liệu
Export/report không phân trang
Cache không hợp lý
Drupal views/batch xử lý sai
Nếu lỗi xuất hiện khi chạy cron/import, nên tách job sang CLI (cron system) với cấu hình memory riêng.
6. Lỗi “Maximum execution time exceeded”
6.1. Phân biệt 2 timeout
PHP:
max_execution_timeFPM:
request_terminate_timeout(nếu set)Nginx:
fastcgi_read_timeout
6.2. Hướng xử lý
Nếu là tác vụ nặng (export/import), ưu tiên:
Chạy job nền (queue/batch)
Tăng timeout có kiểm soát
Tối ưu query / thêm index DB
7. Lỗi “No input file specified” (path/script mapping)
7.1. Nguyên nhân hay gặp
SCRIPT_FILENAMEtrong fastcgi params sairoot/aliastrong Nginx cấu hình lệchSai
try_files
7.2. Kiểm tra trong Nginx site config
Đảm bảo có dạng (ví dụ phổ biến):
Và root trỏ đúng vào webroot thực tế.
8. Lỗi permission (upload, cache, session, files)
8.1. Dấu hiệu
Permission deniedDrupal không ghi được
sites/default/files
8.2. Checklist
User chạy Nginx/PHP-FPM là gì?
Quyền thư mục:
Với Drupal, thường dùng:
owner/group:
www-data:www-dataquyền: thư mục 775 (tùy mô hình bảo mật)
Không nên “chmod 777” để chữa cháy; phải sửa theo user/group đúng.
9. PHP-FPM bão hòa: server reached pm.max_children
9.1. Dấu hiệu
Nginx trả 502/504 lúc peak
PHP-FPM log có dòng “reached pm.max_children”
9.2. Xử lý theo thứ tự ưu tiên
Xác nhận có bão hòa:
Đo memory mỗi process (bạn đã làm đúng):
Tăng
pm.max_childrencó kiểm soát, đồng thời:
Bật slowlog để biết request nào giữ worker lâu
Giảm “độ nặng” của request (cache, DB index, page cache, opcode cache)
10. Bật chế độ debug an toàn (không phá production)
10.1. PHP error log tách riêng cho pool
Trong pool config:
10.2. Không bật display_errors trên production
Nếu cần debug hiển thị, chỉ bật tạm thời theo IP nội bộ hoặc môi trường staging.
11. Kiểm tra sự cố hệ điều hành: OOM, disk, file descriptor
11.1. OOM Kill
11.2. Disk full / inode full
11.3. Too many open files
12. “Playbook” 5 phút khi web lỗi bất ngờ
Xác định mã lỗi (502/504/500/403)
tail -n 200Nginx error logjournalctl -u php8.3-fpm --since "1 hour ago"Tìm dấu vết:
pm.max_children, timeout, memory exhausted, permission deniedNếu nghi DB: xem slow query / trạng thái MariaDB
Nếu nghi OOM/disk: kiểm tra kernel log và dung lượng
Chỉ sau khi có bằng chứng mới chỉnh config
- Đăng nhập để gửi ý kiến