Khắc phục lỗi 'HTTP Error' bí ẩn khi tải tệp lên WordPress Media

intermediate📝 WordPress2026-05-26| Linux (Ubuntu/Debian), PHP 7.4/8.x, Nginx hoặc Apache, WordPress 5.0+

Error Message

HTTP Error
#tai-len-media#http-error#imagick#thu-vien-gd#toi-uu-php#bao-tri-wordpress

Bí ẩn về 'HTTP Error'

Có lẽ bạn đã từng thấy nó: một khung màu đỏ bí ẩn trong Thư viện Media của WordPress chỉ vỏn vẹn dòng chữ HTTP Error. Nó thường xảy ra ngay khi một tệp tải lên lớn đạt mức 100%. Không có mã lỗi đi kèm. Không có lời giải thích nào xuất hiện. Chỉ là một sự dừng lại đột ngột khiến bạn tự hỏi liệu tệp có quá lớn hay máy chủ đã đầu hàng.

Theo kinh nghiệm quản lý LEMP stack của tôi, đây thường không phải là vấn đề của chính hình ảnh đó. Thay vào đó, nó thường là một sự cố trong giai đoạn hậu xử lý sau khi tải lên. Đây là lúc WordPress cố gắng tạo ra nhiều phiên bản nhỏ hơn của hình ảnh (thumbnails, medium, large) và vấp phải rào cản tài nguyên trên máy chủ.

Phân tích ban đầu: Ngừng đoán mò, hãy bắt đầu xem Log

Giao diện người dùng WordPress không cung cấp manh mối nào, vì vậy bạn phải kiểm tra bên trong hệ thống. Bỏ qua các bản ghi lỗi (logs) có nghĩa là bạn chỉ đang đoán mò trong bóng tối. Tôi khuyên bạn nên kiểm tra ba vị trí cụ thể sau đây ngay lập tức:

  • PHP Error Log (ví dụ: /var/log/php8.2-fpm.log): Tìm kiếm các lỗi cạn kiệt memory_limit hoặc quá thời gian xử lý max_execution_time.
  • Nginx/Apache Error Log: Nếu bạn thấy client_max_body_size hoặc "413 Request Entity Too Large," máy chủ web của bạn đang chặn tệp trước khi PHP kịp nhìn thấy nó.
  • Browser Console (F12): Kiểm tra tab Network. Lỗi 500 Internal Server Error thường xác nhận máy chủ đã gặp sự cố trong quá trình xử lý hình ảnh.

Cách khắc phục 1: Chế ngự Imagick "ngốn" tài nguyên

Hầu hết các bản cài đặt WordPress hiện đại đều sử dụng Imagick để xử lý hình ảnh. Mặc dù mạnh mẽ, Imagick nổi tiếng là tiêu tốn nhiều tài nguyên. Trên một VPS đa nhân, nó có thể cố gắng sử dụng mọi luồng CPU có sẵn để xử lý một tệp JPEG 5MB duy nhất. Điều này thường gây ra tình trạng tăng vọt bộ nhớ và làm treo tiến trình PHP.

Giới hạn Imagick sử dụng một luồng duy nhất thường giúp khắc phục các sự cố treo máy này ngay lập tức. Thêm đoạn mã này vào tệp functions.php của giao diện (theme) bạn đang dùng:

add_filter('wp_image_editors', function($editors) {
    $first_editor = array_shift($editors);
    if ($first_editor === 'WP_Image_Editor_Imagick') {
        if (class_exists('Imagick')) {
            Imagick::setResourceLimit(Imagick::RESOURCETYPE_THREAD, 1);
        }
    }
    array_unshift($editors, $first_editor);
    return $editors;
});

Để khắc phục trên toàn hệ thống Ubuntu, hãy chỉnh sửa tệp policy.xml (thường nằm trong /etc/ImageMagick-6/ hoặc /etc/ImageMagick-7/) và thêm dòng này:

<policy domain="resource" name="thread" value="1"/>

Cách khắc phục 2: Chuyển sang thư viện GD nhẹ hơn

Nếu Imagick vẫn gặp khó khăn—điều thường thấy trên các phiên bản VPS giá rẻ 5$/tháng với 1GB RAM—đã đến lúc chuyển sang GD Library. GD có ít tính năng hơn nhưng hiệu quả hơn đáng kể về mặt bộ nhớ. Sử dụng bộ lọc này để đặt GD làm trình xử lý chính cho các tệp tải lên của bạn:

add_filter('wp_image_editors', function($editors) {
    return array('WP_Image_Editor_GD', 'WP_Image_Editor_Imagick');
});

Cách khắc phục 3: Điều chỉnh giới hạn của máy chủ

Đôi khi máy chủ thực sự ngắt kết nối vì quá trình tải lên mất quá nhiều thời gian hoặc tệp quá nặng. Nếu bạn đang tải lên ảnh có độ phân giải cao trên 10MB, tệp php.ini của bạn cần đủ không gian để hoạt động. Tôi khuyên bạn nên sử dụng các giá trị cơ bản này cho môi trường thực tế:

upload_max_filesize = 128M
post_max_size = 128M
memory_limit = 512M
max_execution_time = 300

Đối với người dùng Nginx, hãy đảm bảo rằng client_max_body_size trong khối server của bạn khớp với các giới hạn PHP này. Nếu PHP cho phép 128MB nhưng Nginx được đặt ở mặc định là 1MB, việc tải lên của bạn sẽ luôn thất bại. Cập nhật cấu hình của bạn và tải lại:

server {
    client_max_body_size 128M;
}

# Sau đó chạy:
sudo nginx -t && sudo systemctl reload nginx

Cách khắc phục 4: Thủ thuật .htaccess cho Apache

Trên máy chủ Apache, một số mô-đun tối ưu hóa nhất định có thể xung đột với cách Imagick xử lý hình ảnh trong nền. Bạn thường có thể bỏ qua các xung đột này bằng cách thêm một dòng vào đầu tệp .htaccess của mình:

SetEnv MAGICK_THREAD_LIMIT 1

Kiểm chứng: Thử nghiệm giải pháp

Đừng vội cho rằng lỗi đã được khắc phục cho đến khi bạn kiểm tra áp lực. Mở một cửa sổ ẩn danh và thử tải lên chính xác tệp đã thất bại trước đó. Nếu thành công, hãy điều hướng đến Thư viện Media và nhấp vào hình ảnh. Nếu ảnh thu nhỏ (thumbnail) tải lên chính xác, bộ xử lý hậu kỳ đang hoạt động tốt. Nếu vẫn thất bại, hãy kiểm tra wp-content/debug.log—có thể bạn đang gặp xung đột với một plugin khác hoặc vấn đề về quyền thư mục (755 là tiêu chuẩn cho thư mục uploads).

Related Error Notes