Fix lỗi 413 Request Entity Too Large trên Nginx

Bạn đang sử dụng dịch vụ Web Server Nginx trên hệ thống và khi bạn cần upload một vài file thông qua form upload của PHP chẳng hạn. Thì bạn đụng ngay cái lỗi nhìn chả thiện cảm tí nào mang tên ‘413 Request Entity Too Large‘. Bạn tự hỏi lỗi này là do Nginx hay do ứng dụng tải lên, mà cũng có thể do mạng mẽo đường truyền thì sao ? Xin thưa rằng, đó là do bạn cấu hình Nginx chưa phù hợp với hoạt động upload tài nguyên lên website thông qua trang web.

Nguyên nhân phát sinh lỗi “413 Request Entity Too Large”

Trong nội dung cấu hình Nginx, có một chỉ thị keyword cấu hình mang tên ‘client_max_body_size‘. ‘client_max_body_size‘ quy định kích thước tối đa của một gói tin truy vấn gửi dữ liệu lên web server Nginx từ client. Quay trở lại với trường hợp trên, khi bạn upload 1 file tài nguyên như file ảnh lên hệ thống. Lúc này từ trình duyệt sẽ gửi một gói tin truy vấn HTTP có phương thức POST và kích thước của body gói tin (có thể coi đại loại như kích thước tập tin) được Nginx kiểm tra. Nếu kích thước này lớn hơn giá trị ‘client_max_body_size‘, thì bạn sẽ ăn ngay cái lỗi “413 Request Entity Too Large” ngay trên trình duyệt web.

Cách khắc phục lỗi “413 Request Entity Too Large”

Bạn sẽ chỉnh sửa file cấu hình dịch vụ Nginx trên hệ thống.

# vi /etc/nginx/nginx.conf

hoặc đường dẫn nginx ở path khác, 2 đường dẫn mặc định khi compile source Nginx hoặc cài đặt qua repo.

# vi /usr/local/nginx/conf/nginx.conf

Tiếp đến set giá trị ‘client_max_body_size‘ có thể ở 1 trong 3 block cấu hình Nginx gồm “global http“, “server” hay “location“. Nếu set ở block ‘global http‘, thì giá trị mới sẽ áp hết cho toàn bộ các Virtual Host đang config trên Nginx. Nếu set ở block ‘server‘, thì chỉ áp dụng cho virtual host tên miền cụ thể mà bạn mong muốn. Còn set ở block ‘location‘ , thì bạn có thể chỉ định URL dùng cho hoạt động upload thì sẽ có giá trị ‘client_max_body_size‘ cao hơn. Mình sẽ chọn giá trị ‘12 MB‘ vì nó lớn hơn ‘10 MB‘ ở ví dụ file ảnh phía trên.

+ Block “global http”

http {
    ...
    # Set gia tri 'client_max_body_size' mong muon
    client_max_body_size 12M;
    ...
}

+ Block config ‘server’

server
{
    listen 192.168.1.100:80;
    server_name lab.cuongquach.com;
    root /home/cuongqc/public_html;
    index index.php index.html index.htm;
    ...
    client_max_body_size 12M;
    ...
}

+ Block config ‘location’

server
{
    listen 192.168.1.100:80;
    server_name lab.cuongquach.com;
    root /home/cuongqc/public_html;
    index index.php index.html index.htm;
    ...
    location = /upload/ {
        client_max_body_size 12M;
    }
    ...
}

Giờ thì reload lại cấu hình Nginx mới thôi.

# nginx -s reload

 
Lưu ý :
– Nếu bạn muốn Nginx không thực hiện việc kiểm tra này thì có thể thiết lập “client_max_body_size 0;”, lúc này client có thể gửi gói tin truy vấn POST lên Server với độ lớn dữ liệu không giới hạn. Điều này cực kì nguy hiểm và không khuyến khích thực hiện, nên bạn cần có 1 giá trị giới hạn phù hợp cho “client_max_body_size“.
– Thường Nginx sẽ là reverse proxy cho các dịch vụ backend dưới xử lý nội dung ngôn ngữ code như PHP thì có PHP-FPM hoặc dịch vụ Apache-PHP backend. Vì vậy bạn cũng cần tăng giới hạn PHP cho phép một gói tin có kích thước body phù hợp tài nguyên bạn tải lên web server. Ví dụ với PHP , ta sửa file ‘php.ini‘.

# vi /etc/php.ini
post_max_size = 20M
upload_max_filesize = 20M

– Khởi động lại PHP-FPM.

# service php-fpm restart

– Khởi động lại Apache-PHP.

# service httpd restart

Đọc thêm bài: Tăng kích thước file được upload trên PHP

Như vậy bạn đã biết cách để tự xử lý lỗi “413 Request Entity Too Large” trên Nginx rồi. Chúc bạn thành công.

Quách Chí Cường: Bạn đang theo dõi website "https://cuongquach.com/" nơi lưu trữ những kiến thức tổng hợp và chia sẻ cá nhân về Quản Trị Hệ Thống Dịch Vụ & Mạng, được xây dựng lại dưới nền tảng kinh nghiệm của bản thân mình, Quách Chí Cường. Hy vọng bạn sẽ thích nơi này !