nginx代理请求缓冲未按预期工作

时间:2017-11-05 19:27:42

标签: http nginx file-upload upload tornado

这是我的nginx配置:

.map((jobs: Job[]) =>
  jobs.filter((job: Job) => job.employer === data.uid || job.employee === data.uid )
);

我尝试上传文件,我正在做类似上传的文件,文件超过2G,客户端以块的形式发送文件,nginx和脚本正在运行,但是nginx没有按预期工作

你看,我把proxy_request_buffering打开了,所以我希望nginx缓冲所有200M的文件,然后立即将它传递给后端(这是tornado-python),但是nginx将它传递到1M或2M的后端块,这种行为会导致更高的CPU使用率,更高的系统负载和更低的上传速度,这种行为与将proxy_request_buffering设置为off没有多大区别,所以我觉得我在这里做错了什么

为什么nginx没有正确缓冲?我想如何让nginx缓冲整个请求然后立即传递它?

我尝试使用post_action,但我无法将请求正文传递给后端

更新:Nginx正确缓冲,我的意思是它会在客户端上传整个文件后立即将请求体传递给后端,但是Nginx会将请求体传递给较小块的后端,并且它不会立即传递给它,它有整个身体但它不会立刻通过全身,我怎么能告诉nginx立即将请求体传递给后端?

1 个答案:

答案 0 :(得分:0)

看起来您需要打开proxy_buffering,设置proxy_buffers以设置缓冲区的数量和大小,并可能proxy_buffers_size以确保它不会过度使用内存:

location @proxy_upload {
    proxy_buffering on;
    proxy_buffers 10 200m;
    proxy_buffer_size 1000m;
    proxy_pass_request_body on;
    proxy_pass              http://servers;
}

不确定您的上游服务器获得了多少流量,但我可以想象这个大的缓冲区效率不高......您在上游使用哪种网络服务器需要如此大的缓冲区?也许尝试一次递增缓冲区1m,直到它处于一个不错的最佳位置。

来自:http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_buffers

并且:http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_buffer_size