Обслуживание динамических zip-файлов через Apache - PullRequest
8 голосов
/ 17 января 2011

Одна из обязанностей моего приложения на Rails - создавать и обслуживать подписанные xmls. Любой подписанный xml, после его создания, никогда не изменяется. Поэтому я храню каждый xml в папке public и перенаправляю клиента соответствующим образом, чтобы избежать ненужной обработки с контроллера.

Теперь я хочу новую функцию: каждый xml связан с датой, и я хотел бы реализовать возможность обслуживать сжатый файл, содержащий каждый xml, дата которого лежит в периоде, указанном клиентом. Тем не менее, период не может быть ограничен менее чем одним месяцем, чтобы эта функция была полезной, и это означает, что некоторые обслуживаемые zip-файлы будут иметь размер до 50 млн.

Мое приложение развернуто как Пассажирский модуль Apache. Таким образом, совершенно недопустимо обслуживать файл с send_data, поскольку клиенту придется ждать, пока будет создан весь сжатый файл, прежде чем начнется фактическая загрузка. Хотя у меня есть идея о том, как реализовать эту функцию в Rails, чтобы сжатый файл создавался при обслуживании , я чувствую, что у моего сервера не хватит ресурсов, когда некоторые длинные процессы Ruby / Passenger будут выделены для обслуживания больших ZIP-файлы.

Я читал о лучшем решении для обслуживания статических файлов через Apache, но не динамических.

Итак, каково решение проблемы? Мне нужно что-то вроде собственного обработчика Apache? Как мне сообщить Apache из моего приложения, как обрабатывать запрос, сжимать файлы и передавать результат одновременно?

Ответы [ 4 ]

3 голосов
/ 30 мая 2011

Проверьте мой модуль mod_zip для Nginx:

http://wiki.nginx.org/NgxZip

У вас может быть внутренний скрипт, сообщающий Nginx, какие URL-адреса следует включить в архив, и Nginx будет динамически передавать ZIP-файл клиенту, содержащему эти файлы. Модуль использует однопоточный прокси-код Nginx и очень легкий.

Модуль был впервые выпущен в 2008 году и на данный момент является достаточно зрелым. Из вашего описания я думаю, что он будет соответствовать вашим потребностям.

0 голосов
/ 05 октября 2012

это сложно сделать, но я сделал драгоценный камень под названием zipline (http://github.com/fringd/zipline), который заставляет меня работать.Я хочу обновить его, чтобы он мог поддерживать простые файловые дескрипторы или пути, сейчас он предполагает, что вы используете carrierwave ...

также, вы, вероятно, не можете передать ответ пассажиру ... Iпришлось использовать единорога, чтобы заставить потоковую работу работать должным образом ... и некоторые промежуточные программы в стойке могут даже облажаться (вызывая response.to_s ломает его)

, если кому-то все еще нужно это беспокоить меня на странице github

0 голосов
/ 21 февраля 2011

См. Ответ на Rails: потоковая передача на лету в формате zip?

Используйте поток zip.

0 голосов
/ 09 февраля 2011

Вам просто нужно использовать любой имеющийся у вас API, чтобы создать zip-файл и записать его в ответ, периодически сбрасывая вывод. Если он обслуживает большие zip-файлы или будет часто запрашиваться, рассмотрите возможность его запуска в отдельном процессе с высоким значением nice / ionice / низким приоритетом.

В худшем случае вы можете запустить zip-файл командной строки в процессе с низким приоритетом и периодически передавать вывод.

...