我使用Nginx作为Web服务器来服务我的网站。 我提供上传function给我的用户(他们被允许提交图片高达5Mb),所以我有指令: client_max_body_size 5M; 在我的服务器configuration。 我注意到的是,如果我尝试上传任何文件,Web服务器不会阻止上传更大的文件。 举个例子,假设我试图上传一个700Mb的真正大的video(电影)。 服务器不会立即拒绝上传,但会缓冲整个数据(花费太长时间并减慢服务器速度),只有在上传结束时才会返回一个413 Request entity too large错误。
所以问题是:有没有办法正确configurationNginx阻止大file upload时,传输的数据开始克服我的client_max_body_size限制?
我认为用我的实际设置进行生产会非常不安全,而且我无法在Google上find任何有用的信息。
编辑:
我使用PHP和Symfony2作为后端…
编辑(再次):
这是我的error.log中显示的内容:
2013/01/28 11:14:11 [error] 11328#0: *37 client intended to send too large body: 725207449 bytes, client: 33.33.33.1, server: www.local.example.com, request: "POST /app_dev.php/api/image/add/byuploader HTTP/1.1", host: "local.example.com", referrer: "http://local.example.com/app_dev.php/"`
奇怪的是,我正在用tail -f error.log监视我的nginx error.log ,并且在上载开始时(在结束之前)立即出现消息。 所以nginx做了一些预防性的检查,但是不会停止/块化上传请求…
我也试图validation,如果PHP通过发出echo 'something'; die();得到上传的控制echo 'something'; die(); echo 'something'; die(); 在处理上传的页面上,但没有打印出任何内容,并没有停止上传请求。 所以它应该是nginx或一些PHP的内部,使整个上传继续,直到它完全传输…
另一个编辑:这是我的top (监控nginx和php)的一个视图,当一个大file upload正在进行(nginx获取超载): 
编辑:这是我的nginxconfiguration
server { listen 80; server_name www.local.example.com local.example.com; access_log /vagrant/logs/example.com/access.log; error_log /vagrant/logs/example.com/error.log; root /vagrant/example.com/web; index app.php; client_max_body_size 6M; location /phpmyadmin { root /usr/share; index index.php; location ~* \.php { fastcgi_intercept_errors on; fastcgi_pass 127.0.0.1:9000; fastcgi_split_path_info ^(.+\.php)(/.*)$; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param HTTPS off; } } location / { try_files $uri @rewriteapp; } location @rewriteapp { rewrite ^(.*)$ /app.php/$1 last; } # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 location ~ ^/(app|app_dev)\.php(/|$) { fastcgi_intercept_errors on; fastcgi_pass 127.0.0.1:9000; fastcgi_split_path_info ^(.+\.php)(/.*)$; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param HTTPS off; } }
有用的信息在这里: https : //stackoverflow.com/questions/4947107/nginx-upload-client-max-body-size-issue
我引用了一些最有意思的答案(对我来说):
在发送整个请求主体之前,大多数客户端不会读取响应。 由于nginxclosures连接,客户端将数据发送到closures的套接字,导致TCP RST。
如果是这样,这只是一个浏览器问题,不会影响(超载)我的Web服务器。 它似乎抱怨我的记忆检查,显示上传一个大(700MB)的文件时,nginx和php-fastcgi没有真正的超载。
我可以用几种方式解决浏览器问题,例如:
<input type="hidden" name="MAX_FILE_SIZE" value="5242880" /> 你用什么php或rails什么的? 因为你应该在上传之前检查大小。
将文件php.ini中的 post_max_size和upload_max_filesize设置为相应的值
编辑:尝试写这样的东西到你的上传
$element = new Zend_Form_Element_File('foo'); $element->setLabel('Upload a file:') ->setDestination('/var/www/upload'); // make sure its only 1 file $element->addValidator('Count', false, 1); // Maximal 100k $element->addValidator('Size', false, 102400); // only JPEG, PNG, and GIFs $element->addValidator('Extension', false, 'jpg,png,gif'); $form->addElement($element, 'foo');