Я использую веб-сервер Apache2 (версия сервера: Apache / 2.2.17 (Ubuntu)) в Ubuntu 11.04. У меня проблема, из-за которой долго выполняющиеся загрузки через некоторое время не работают. У меня есть клиенты с медленным подключением, поэтому я впервые обнаружил проблему. Если я загружу файл через быстрое соединение, он будет работать нормально. Во время тестирования я загружал файл размером 3 ГБ, ограничивая свой wget до 500 КБ и получая постоянные сбои. Однако количество времени или передаваемых данных всегда разное.
У меня есть две разные директивы Directory. Файлы будут загружаться нормально с одного, но не с другого. Основное различие между ними заключается в том, что один относится к 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. Я заметил, что иногда при начальной загрузке возвращалась неправильная длина содержимого, иногда ~ 200 МБ, иногда в килобайтах. Как видите, размер файла, с которым я тестировал, составляет около 3 ГБ.
Вот как выглядит сбой в журнале доступа:
[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)"
Я нашел в Интернете болтовню об отключении SendFile, когда каталог находится через NFS, но я тестировал другие системы, монтирующие каталог через NFS, и они работают нормально.
Моя монтировка NFS монтируется со следующими директивами:
defaults,vers=3,noauto