Re: Проблема с Progress Module

Богун Дмитрий vugluskr на vugluskr.org.ua
Пт Июн 4 13:06:32 MSD 2010


В Чтв, 03/06/2010 в 10:44 -0400, gennady пишет:
> [quote="Богун Дмитрий"]
> Может быть дело в том, что после того как nginx полностью принял файл
> и
> сохранил его в СВОЕЙ временной директории он начинает передавать этот
> файл в PHP(apache, fastcgi) и чем больше этот файл, тем дольше времени
> на это уходит.
> [/quote]
> 
> С этого места хотелось бы по подробнее... Как это передавать файл в
> РНР? Сервер сохраняет файл во временную директориюЮ а затем передает
> управление РНР скрипту, который указан в параметре action в форме
> отправки, где доступен глобальный массив $_FILES с параметрами
> закаченного файла. Сервер что, еще куда-то копирует файл? Я пс
> соответствующимлох представляю этот процесс закачки файла. 
Именно так и происходит.
nginx ничего не знает о php, он знает только о статических файлах и
нескольких видах backend'ов, на которые можно передавать на обработку
приходящие запросы.

В случае загрузки файла на apache+php, управление в "ранней" стадии
приема запроса попадает в php, он созраняет приходящий файл во временныю
папку, формурует массив $_FILES и после завершения приема файла,
запускает выполнение скрипта из action. (на самом деле не совсем так, но
общий поряд выполнения таков).

Когда цепочка обработки превращается в nginx+apache+php, то перед
описанным выше процессом добавляются следующие шаги: клиент соединятеся
с nginx'ом и передает ему тело запроса, nginx'о сохраняет тело во
временную папку(принадлежащей nginx'у), после полного приема тела
запроса(в вашем случаа 400Mb) nginx установливает соединение к backend'у
и передает через это новое соединение тело запроса(400Mb).

Иными словами, при загрузке файлов через nginx, файл фактически
передается 2 раза - первый раз от клиента к nginx'у, второй от nginx'а к
backend'у.

Если и nginx и backend находятся на одной машине, можно избежать
передачи тела запроса от nginx'а к backend'у, для этого стоит обратить
внимание на директивы:

client_body_in_file_only on;
proxy_pass_request_body off;
#fastcgi_pass_request_body off;

ЗЫ Код обрабатывающий прием файлов прийдется переписывать.
ЗЫЫ При использовании fatscgi процесс выглядит аналогично.




Подробная информация о списке рассылки nginx-ru