背景
前几天上传一个300MB的文件,发现报错,这里说明一下,用户的请求会通过Nginx代理(负载均衡)到应用服务器。
413问题解决
错误信息为“413 Request Entity Too Large”。
查看Nginx日志,错误信息如下:
2020/09/10 11:14:47 [error] 253#0: *13083 client intended to send too large body: 392820633 bytes, client: 192.22.141.3, server: , request: "POST /file/uploadImage HTTP/1.1", host: "test.com"
从日志文件可以看出上传的文件太大了,超出了Nginx配置的最大值,查看Nginx配置,发现client_max_body_size 200m;设置的太小了,于是修改配置client_max_body_size 500m;默认情况下client_max_body_size是1MB。
重启Nginx后,重新上传文件,该问题解决,但是发现另外一个问题。
500问题解决
如下图所示,错误信息为“500 Internal Server Error”
查看Nginx日志,错误信息如下:
2020/09/10 11:34:31 [warn] 249#0: *13247 a client request body is buffered to a temporary file /dev/shm/nginx_temp/client_body/0000000037, client: 192.22.141.3, server: , request: "POST /file/uploadImage HTTP/1.1", host: "test.com"
2020/09/10 11:36:52 [crit] 249#0: *13247 pwrite() "/dev/shm/nginx_temp/client_body/0000000037" failed (28: No space left on device), client: 192.22.141.3, server: , request: "POST /file/uploadImage HTTP/1.1", host: "test.com"
从日志中可以看出:(1)上传的文件会缓存到临时文件“/dev/shm/nginx_temp/client_body/0000000037”中;(2)临时文件的空间不足;
实际上,上传的文件会首先保存到缓冲区中,client_body_buffer_size可以配置缓冲区的大小,只有当文件超过缓冲区的大小才会缓存到临时文件中。
这里的/dev/shm目录其实就是内存,默认是总内存的一半,可以把这个目录当作一个高速磁盘来用,很多应用程序为了提升性能都会把临时文件存放在里面。
要解决这个问题,修改临时文件路径就可以client_body_temp_path /export/data/temp/;
总结
以上就是解决问题的思路,实际上一句话就可以概括,修改下面两个配置就可以解决问题:
# 设置上传文件的最大值
client_max_body_size 500m;
# 设置临时文件存放路径
client_body_temp_path /export/data/temp/;