Unggahan yang gagal pada batas ukuran tertentu itu soal batas — lihat 413 Permintaan terlalu besar. Unggahan yang gagal di tengah jalan, pada ukuran yang tidak tetap, dengan sambungan yang begitu saja putus, adalah tenggat waktu di suatu titik sepanjang jalurnya.

Tenggat waktu yang harus dinaikkan — semuanya

# nginx
client_body_timeout 300s;
client_max_body_size 512M;
send_timeout 300s;
fastcgi_read_timeout 300s;
proxy_read_timeout 300s;
; php
max_execution_time = 300
max_input_time = 300      ; the one that is forgotten - it covers the UPLOAD itself

max_input_time membatasi berapa lama PHP menerima permintaan itu. Ia terpisah dari max_execution_time, bawaannya rendah, dan itulah yang mematikan unggahan lambat dari sebuah telepon.

Cakram dan ruang sementara

df -h /tmp /var/lib/php/tmp
grep upload_tmp_dir /etc/php/8.3/fpm/php.ini

Unggahan ditulis dulu ke berkas sementara. Kalau sistem berkas itu penuh, penulisannya gagal di tengah pemindahan dan sambungannya putus tanpa pesan di mana pun.

Cari apa yang tercatat

sudo tail -50 /var/log/nginx/error.log
sudo journalctl -u php8.3-fpm -n 50 --no-pager

client intended to send too large body adalah batas ukurannya. timed out dan upstream prematurely closed adalah tenggat waktu di atas. Tidak ada catatan sama sekali biasanya berarti peramban atau perantara menyerah lebih dulu daripada servernya.

Di balik Cloudflare, perantaranya punya batas unggah sendiri pada paket-paket bawah, dan batas itu berlaku apa pun yang Anda setel secara lokal. Unggahlah ke subdomain yang melewati perantara itu, atau unggah sepotong-sepotong.

Perbaikan yang benar untuk berkas besar

Unggahan bertahap atau yang bisa dilanjutkan mengirim berkas besar sebagai banyak permintaan kecil, sehingga tidak ada satu pun permintaan yang berjalan lama dan sambungan yang putus melanjutkan, bukan mengulang dari awal. Untuk apa pun di atas beberapa ratus megabita, itulah satu-satunya jawaban yang bisa diandalkan.