NGINX和php_fpmstream媒体文件需要传输三倍?

我的设置: – nginx 1.0.6(从头编译) – php 5.3.8与php-fpm(也从头开始)。

我使用这个PHP脚本将文件从远程站点传送给我的用户:

$chunksize = 1 * (1024 * 1024); //you may want to change this $bytes_send = 0; if ($file = fopen($file, 'rb',false)) { while(!feof($file) && (!connection_aborted()) && ($bytes_send<$new_length)) { $buffer = fread($file, $chunksize); echo ($buffer); flush(); $bytes_send += strlen($buffer); } fclose($file); } else { die('Error - can not open file.'); } 

在我开始下载连接(20 Mbps)之后,我已经得到了ifstat的结果

  eth0 KB/s in KB/s out 5105.77 1925.70 5106.15 2063.77 5083.80 2337.95 4946.52 2487.28 5127.37 2507.15 5118.94 2474.98 5172.55 2438.86 4646.82 2451.87 5246.18 2465.98 5186.71 2459.66 5032.03 2458.55 

这是正常的吗? 由于缺less带宽,生产服务器上的结果是完全失败:| 在Apache的平衡是平等的。 帮助真的很感激:/

@Edit小基准点。 通过这个下载500 MB文件。 大约250-260 MB的结果就是这样,然后下降到接近0.是否有某种networking使用的平衡nginx呢?

发生这种情况是因为nginx试图尽可能快地从后端读取(在你的情况下是php-fpm),首先在内存中caching响应(由proxy_buffer_sizeproxy_buffers设置限制),然后在磁盘上(最大为proxy_max_temp_file_size ,默认是1 GiB)。 因此,即使客户端下载速度较慢,您的“stream式传输”脚本也会尽可能快地下载文件。

查看nginx的http代理模块文档 – 有很多参数可以调整,大多数可以设置每个位置(所以你可以改变缓冲行为只是为了一些url)。 您甚至可以从后端返回X-Accel-Buffering头来禁用缓冲,或者甚至更好地返回X-Accel-Redirect头,使nginx能够将文件本身进行stream式处理而不占用后端进程。