上传文件到云存储前端报错413 Request Entity Too Large

访问上传接口控制台报错 详细原因 net::err_connection_reset,于是用postman测试报错 nginx 413 Request Entity Too Large
这个报错就很明显了,nginx对上传文件的大小有了限制,去看看nginx的配置就知道了。
client_max_body_size 100M; 设置的值有点小,修改这个配置就可以了

配置项的优先级顺序是:location > server > http

1、http配置,这将作为全局的默认值
http {
    client_max_body_size 200m;  # 客户端请求服务器最大允许大小
    ...
}

2、server配置,只在server块中生效
server {
    client_max_body_size 500m;
    ...
}

3、location配置,只在指定的url中生效
location /upload {
    client_max_body_size 1G;
    ...
}

修改完后要重启nginx才会生效

1、参考博客,记录下面配置,以后可能用到

Nginx + PHP 8.0支持视频上传_nginx+php8-优快云博客

配置超时时间
上传大文件可能需要更多的时间,因此你需要增加相关的超时时间:

http {
    client_body_timeout 120s;  # 设置上传超时时间为120秒
    send_timeout 120s;         # 设置发送超时时间为120秒
    keepalive_timeout 120s;    # 设置保持连接超时时间为120秒
    ...
}

整缓冲区大小
缓冲区的大小影响文件上传的性能,可以根据服务器的资源和文件大小调整这些缓冲区大小:

http {
    client_body_buffer_size 256k;   # 调整请求体的缓冲区大小
    client_header_buffer_size 1k;   # 调整请求头的缓冲区大小
    large_client_header_buffers 4 32k; # 调整大请求头的缓冲区大小
    ...
}

查的一些资料

1、client_max_body_size:这个参数用来限制请求体的最大大小。如果上传的文件超过了这个设置的大小,Nginx将返回413状态码,拒绝处理请求。对于2G的文件,你需要设置一个足够大的值来允许上传,例如:

	client_max_body_size 2G;
	
2、client_body_buffer_size:这个参数设置了缓冲客户端请求数据的内存大小。对于大文件上传,可能需要增加这个值以减少磁盘I/O操作:(这个可以尝试下)

	client_body_buffer_size 512k;
	
3、proxy_buffers 和 proxy_buffer_size:这些参数为每个请求/连接设置缓冲区的数量和大小,以及设置用于存储响应头的缓冲区大小。调整这些参数可以优化大文件的传输:

	proxy_buffers 4 64k;
	proxy_buffer_size 16k;
	
4、proxy_read_timeout 和 proxy_send_timeout:这些参数设置了从后端服务器读取响应数据和后端向Nginx返回响应的超时时间。对于大文件上传,可能需要增加这些超时时间:

	proxy_read_timeout 120s;
	proxy_send_timeout 120s;
	
5、proxy_buffering:这个参数控制是否启用缓冲机制。对于大文件传输,可能需要关闭缓冲以减少延迟:(这个可以尝试下)

	proxy_buffering off;
	proxy_request_buffering off;

6、sendfile:启用高效传输模式,可以提高文件传输效率:

	sendfile on;
	
7、tcp_nopush 和 tcp_nodelay:这些参数可以优化TCP传输,减少网络延迟:

	tcp_nopush on;
	tcp_nodelay on;

8、keepalive_timeout 和 keepalive_requests:这些参数控制长连接的超时时间和请求数量,对于上传大文件,可能需要增加这些值以保持连接:

	keepalive_timeout 75s;
	keepalive_requests 100;
	

2、后面再测试上传测试一个2G,报错nginx  504 Gateway Time-out 

 使用的proxy_pass进行的请求转发,修改相关参数,改成300,上传成功。

location /upload {
    client_max_body_size 2G;
    proxy_connect_timeout 300; # 之前默认是60
    proxy_send_timeout 300;
    proxy_read_timeout 300;
    ...
}

有个问题,前端访问这个上传接口,上传2g的文件到云存储,后端代码的日志记录差不多等了10分钟才开始有反应。
这个有点不正常,前端到后端这么长时间是在加载还是啥,有待考究。后端日志动起来到上传成功是正常的。
查资料
1、在nginx中,client_body_temp是一个用于存储客户端请求体数据(例如上传文件)的临时文件目录。上传时在 /usr/local/nginx/client_body_temp 这个目录也没看到缓存文件。
当客户端发送包含请求体数据的请求时(例如:通过post请求上传文件),nginx会将请求数据存储在临时文件中。这个过程是否需要时间?还有和服务器带宽是不是也有关系?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值