Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: apache + nginx и отдача файла на php
LLUG > Программирование > Интерпретаторы
Ex3me
Ситуация: Стоит на сервере apache + nginx. Nginx отдает контент пользователю.

Вопрос: Если apache выполняет скрипт php в котором используется readfile() (считыет файл размером 10 мб), отдаст ли apache сразу контент nginx'у или apache будет выдавать nginx файл кусочками (если медленный канал у пользователя).

Примечание: создается впечатление, что apache по кускам считывает файл nginx, и при этом apache и nginx вдвоем обслуживают одного пользователя.
dip56245
при таком размере будут оба обслуживать, можно попробовать поднять размер кеша на nginx'е, но лучше файл и т.п. отдавать самим nginx'ом, а не php...
Ex3me
Цитата(dip56245 @ 16.1.2010, 22:07) *
при таком размере будут оба обслуживать, можно попробовать поднять размер кеша на nginx'е, но лучше файл и т.п. отдавать самим nginx'ом, а не php...


В кэш не получится, так как файлов много, и все они большого размера.
А если использовать flush() (Функция очищает буфер вывода PHP при этом всё содержимое буфера отправляется в браузер пользователя) или что то подобное, можно будет решить проблему?
VSJCFM
Ex3me, опять... Маны читал? nginx - это прежде всего кэширующий реверсный прокси, одна из задач которого - забрать у апача данные как можно быстрее. И он как раз и расчитан на то, что у юзверя худой канал.
dip56245
Цитата(Ex3me @ 16.1.2010, 21:27) *
В кэш не получится, так как файлов много, и все они большого размера.
А если использовать flush() (Функция очищает буфер вывода PHP при этом всё содержимое буфера отправляется в браузер пользователя) или что то подобное, можно будет решить проблему?

VSJCFM - уже написал,задача nginx забрать весь контент у апача (не более размера кеша), и не спешно отдавать пользователю... т.к. апачу да еще и с ПХП и еще с ведром мусора на странице нужно скажем 100-150метров ОЗУ что бы сгенерить 1Мб данных, а nginx'у всего будет занято 1Мб+тех данные...
где-то так... а в чем проблема отдавать файлы nginx'ом?
Ex3me
Цитата(dip56245 @ 18.1.2010, 12:58) *
а в чем проблема отдавать файлы nginx'ом?


Речь идет о сайте с музыкой. очень часто бывает, что сайты воруют музыку. Для этого пишут скрипт который бы выкачал с сайта всю музыку. Чтобы бот не смог пройти по ссылке, ссылка состовляется яваскриптом. Пример: путь к файлу site.ru/file.mp3, яваскрипт шифрует путь примерно так:
var a='s';
var b='i';
var c='t';
var d='e';
var e='.';
var f='r';
var j='u';
var h='/';
var g='f';
var k='i';
var l='l';
var m='e';
var n='.';
var o='m';
var p='p';
var r='3';

Если у вас полноценный браузер и вы не робот, то яваскрипт выполнит свою работу a+b+c+d+e+f.......... и получится путь к файлу который можно скачать.

Так как путь постоянно меняется, то нельзя ложить файл на сервер в папку. сам файл находится за пределами htdocs.

Есть скрипт который отдает файл. скрипт составляет заголовки, и шлет контент файла. Сейчас уже делает это fopen() fread().

Огромный плюс составлять заголовки скриптом, это брать имена файлов из базы (пример http://kibergrad.com/?do=music&name=90..._-_dlya_nee_mp3 нажать скачать, и будет видно имя файла на русском).


В чем состоит проблема?
Этапы запроса
1. Запрос принят
2. Apache обрабатывает скрипт на пхп
3. Обработавши скрипт, apache передает контент nginx'у
4. Apache закрывается, а Nginx передает контент пользователю.

Пробема медлу 3 и 4 этапом, когда apache не считавши до конца файл, начинает отдавать в это же время контент nginx'y. Поэтому они работают вдвоем одновременно, хавая больше ресурсов..

Задача, заставить apache считать контент из файла, передать его nginxy и сразу же закрыться.
dip56245
/оффтоп/ я тебя расстрою, я писал уже бота как раз для таких случаев, в инете валом библиотек которые умеют адекватно обрабатывать яваскрипт... но я делал еще проще, на делфе activex компонент, как-будто IE работает, бот открывал страницу, по id или по тегам гулял по странице, нажимал кнопки, заполнял поля) если нужна защита - капча. /оффтоп/

для того что бы nginx принял все, а не говорил "мол абожди" увеличь размер кеша, тогда апач отработает и закроется, а nginx будет спокойно отдавать.

/оффтоп/
я когда то делал знакомому подобную систему, но там порнуха была, смысл тоже....
дык я сделал проще, при авторизации, когда чел. нажимает "скачать",
на серваке в каталоге который доступен по nginx'у создавался симлинк на файл, и файл был доступен для скачки через nginx напрямую.
+ ссылка на симлинк и время када ей умереть записывалась в БД, каждые 5 мин отрабатывался пхп скрипт который прибивал симлинки, у которых время вышло (время по формуле считалась размер*мин. скорость)
/оффтоп/
Ex3me
Цитата
ссылка на симлинк и время када ей умереть записывалась в БД, каждые 5 мин отрабатывался пхп скрипт который прибивал симлинки, у которых время вышло (время по формуле считалась размер*мин. скорость)


У меня было так раньше, и тоже хранилось в базе. В чем была проблема, так в том, что симлинк если занят еще вебсервером, то он не удалялся. Тогда я не делал проверку на удаления, и убивал запись в бд.

Если будет симлинк, то уже загаловки свои я не прикручу из базыsad.gif


Буду увеличивать кэш...
dip56245
эм, а как он у ття был занят вебсервером? он должен был создасться и все освободится. я создавал через exec(...)
затем другим скриптом убивалось без проблем....

а какие тебе заголовки из БД нужны? чет я не понял немного.
Ex3me
Цитата
эм, а как он у ття был занят вебсервером? он должен был создасться и все освободится. я создавал через exec(...)


Создался симлинк, пришло время его прибить. В этот же момент пользователь скачивает файл средствами apache (на то время). Удаление прохожит не успешно. Впринципе можно устроить проверку, но за 2 часа скапливается около 1000 симлинков.
Примерно 1 пользователь в среднем создаёт 6 симлинков. За 2 часа посещает около 200 чел * 6 симлинков - мусора много получается. Когда будет за час по 1 тысяче посещать, будет вообще мусорка. Если это нормально, поправьте меня.

Цитата
а какие тебе заголовки из БД нужны? чет я не понял немного.


Когда скачиваешь файл, то его имя отправляется заголовками
Код
header ("Content-Disposition: attachment; filename=\"Русское имя файла с любыми знаками.mp3\"");

Если имя файла настоящее "123.mp3", то из базы мы достаем имя как полагается.

И тебе выскакивает куда сохранить файл, и стоит уже заполненное имя файла на русском языке.


Нажмите для просмотра прикрепленного файла
psvmcc
Я думаю тут лучшее решение это копать в сторону лайти с mod_secdownload, либо к нгинсу такое http://wiki.nginx.org/NginxHttpSecureDownload прикрутить.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Русская версия IP.Board © 2001-2019 IPS, Inc.