【发布时间】:2018-04-17 22:49:56
【问题描述】:
这是我的 nginx 配置:
worker_processes auto;
user nginx;
events {
worker_connections 1024;
use epoll;
}
http {
tcp_nodelay on;
add_header Cache-Control no-cache;
upstream servers {
server 127.0.0.1:9999;
server 127.0.0.1:9998;
}
proxy_request_buffering on;
server {
listen 80;
client_max_body_size 200M;
client_body_buffer_size 200M;
server_name localhost;
location / {
try_files $uri @proxy_upload;
}
location @proxy_upload {
proxy_pass_request_body on;
proxy_pass http://servers;
}
}
}
我尝试上传文件,我正在做类似分块上传的事情,文件超过2G,客户端分块发送文件,nginx和脚本都在工作,但nginx没有按预期工作
你看,我打开了 proxy_request_buffering,所以我希望 nginx 缓冲所有 200M 的文件,然后一次将其传递给后端(即 tornado-python),但 nginx 以 1M 或 2M 将其传递给后端块,这种行为导致非常高的cpu使用率,更高的系统负载和更低的上传速度,这种行为与将proxy_request_buffering设置为关闭没有太大区别,所以我认为我在这里做错了
为什么 nginx 没有正确缓冲,我想如何让 nginx 缓冲整个请求然后立即传递它?
我尝试使用 post_action,但无法将请求正文传递到后端
更新:Nginx 正在正确缓冲,我的意思是它会在客户端上传整个文件后立即将请求正文传递给后端,但 Nginx 以较小的块将请求正文传递给后端,它不会立即传递它, 它有整个 body 但它不会一次传递整个 body, 我如何告诉 nginx 一次将请求体传递到后端?
【问题讨论】:
标签: http nginx file-upload upload tornado