访问上传接口控制台报错 详细原因 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会将请求数据存储在临时文件中。这个过程是否需要时间?还有和服务器带宽是不是也有关系?