我在 Ubuntu 11.04 上运行 Apache2 Web 服务器(服务器版本:Apache/2.2.17 (Ubuntu))。我遇到一个问题,长时间运行的下载在一段时间后会失败。我的客户端连接速度很慢,这就是我第一次发现这个问题的原因。如果我通过快速连接下载文件,它会正常工作。在测试中,我下载了一个 3GB 的文件,同时将 wget 限制为 500K,结果一直失败。但是,传输的时间或数据量总是不同的。
我有两个不同的目录指令。其中一个可以正常下载文件,但另一个不行。两者的主要区别在于一个是通过 NFS 并且有一个 XSendFile 指令。使用“下载”一切正常,但“vol1”有问题。
<Directory "download">
PassengerEnabled off
Options Indexes MultiViews
AllowOverride None
Order allow,deny
Allow from all
</Directory>
<Directory "vol1">
PassengerEnabled off
Options -Indexes MultiViews
AllowOverride None
Order allow,deny
Allow from all
XSendFile on
XSendFileAllowAbove on
</Directory>
以下是客户端使用 wget 时出现的失败信息:
HTTP request sent, awaiting response... 200 OK
Length: 3028287488 (2.8G) [video/mpeg]
33% [==============================> ] 1,025,449,932 295K/s in 48m 39s
2013-01-17 18:02:17 (343 KB/s) - Connection closed at byte 1025449932. Retrying.
此后,wget 将再次尝试,有时会得到 416,有时会得到 200。在下面的访问日志示例中,我得到了 200,但正如您所见,它认为文件已下载,因为返回的内容长度为 250。我确实注意到,在初始下载时,有时会返回错误的内容长度,有时约为 200MB,有时以千字节为单位。正如您所见,我测试的文件大约为 3GB。
访问日志中显示的故障情况如下:
[22/Jan/2013:13:59:22 -0500] "GET file.mpeg HTTP/1.1" 200 2533255750 "-" "Wget/1.13.4 (linux-gnu)"
[22/Jan/2013:15:22:02 -0500] "GET file.mpeg HTTP/1.1" 200 250 "-" "Wget/1.13.4 (linux-gnu)"
当它是 416 时:
[22/Jan/2013:12:14:46 -0500] "GET file.mpeg HTTP/1.1" 200 1620176522 "-" "Wget/1.13.4 (linux-gnu)"
[22/Jan/2013:13:07:35 -0500] "GET file.mpeg HTTP/1.1" 416 638 "-" "Wget/1.13.4 (linux-gnu)"
我确实发现一些关于在目录通过 NFS 时关闭 SendFile 的在线讨论,但我已经测试过通过 NFS 安装目录的其他系统并且它们运行良好。
我的 NFS 挂载是使用以下指令进行挂载的:
defaults,vers=3,noauto