Назад | Перейти на главную страницу

Ошибка длительной загрузки Apache

Я использую веб-сервер 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