I guess it worth checking this quickly:
1. Nginx client_max_body_size
Laravel Forge uses Nginx, and its default client_max_body_size is only 1MB. Even though you set PHP’s max file size to 50MB, Nginx will silently reject requests that exceed its own limit. When uploading multiple files, the combined POST body exceeds 1MB quickly.
SSH into your server and check:
Check current Nginx config for your site
cat /etc/nginx/sites-enabled/your-site.conf | grep client_max_body_size
In Forge, go to Sites > your site > Nginx Configuration and add/update inside the server block:
client_max_body_size 50M;
Then restart Nginx:
sudo systemctl restart nginx
2. PHP post_max_size
This must be larger than upload_max_filesize. When uploading multiple files, the total POST size is the sum of all files. If you set upload_max_filesize = 50M but post_max_size is still at the default 8M, multi-file uploads will fail.
Check and fix in your php.ini or via Forge’s PHP settings:
upload_max_filesize = 50M
post_max_size = 256M
post_max_size should be significantly larger than upload_max_filesize to accommodate multiple files plus form overhead.
3. PHP max_file_uploads
This defaults to 20, which should be fine for 4-5 files, but verify it hasn’t been set lower:
php -i | grep max_file_uploads
4. Verify all settings are active
PHP-FPM sometimes uses a different php.ini than CLI. Check the actual runtime values:
php-fpm8.4 -i | grep -E “post_max_size|upload_max_filesize|max_file_uploads”
Or create a temporary phpinfo() file to confirm the web-facing values match what you expect.
After making changes, restart PHP-FPM:
sudo systemctl restart php8.4-fpm
Why only 2 files appear
Nginx likely accepts the first chunk of the multipart POST (containing 1-2 files worth of data) before hitting the size limit and terminating the connection. The files that fit within the limit get processed; the rest are dropped. The progress bar behavior is the JavaScript client reporting based on bytes sent to the socket, not bytes actually accepted by the server.