如何更好的避免大文件垃圾上传


最近研究http(nginx)+php 高效上传的方法, 找到了upload module 和auth request 组合基本完成我的要求。

但我有点不爽的是,我本来希望auth request 能在request upload 完之前就能起作用, 那些未经允许的上传可以立即中断掉。 我看了一下nginx 的wiki, 应该每办法实现,因为nginx 必须等request 完之后,才传给upstream. 这个本身也是http 协议决定的,必须request body 发送完了,server 才会发response, 我强制中断TCP 连接的话,客户端其实拿不到合适的错误信息。

这么多其实是个背景, 我觉得这个buffered request 可能在upload 大文件时候有问题。我upload 了一个4G 的文件, 给nginx 配置下列参数:

client_max_body_size 256K;
client_body_timeout 15s;

上传之后需要很长时间肯定超过15s, 连接才被重置, 我看了server 网络使用状况,由于是内网,inbound traffic 是10mb/s 。

之后又做了一个测试upload 到一个不存在的url, 按道理应该立即返回404才对, 也是等了很久,才重置。 我换了一个小一点的文件,发现是传完了之后,server 才返回404.

内存没有大的变化,估计nginx 内部加了什么判断,超过一定大小全部丢弃掉了。但是CPU 使用率很高。

刚才我改变德问的头像,是一个3M文件,需要我全部上传完,德问才告诉我size 超过了。 这个是不是无害的,有害的话,怎么限制才好。现在云服务的带宽都不便宜的,浪费在这种垃圾内容的upload, 就更可惜了。

那个上传到不存在的url, nginx 也是数据照单全收才是最可怕的。

nginx http协议

Keines 12 years ago

Your Answer