
Стриминг ZIP‑архивов на лету с nginx + mod_zip — просто, как 2 байта переслать
dstarikov только что Стриминг ZIP‑архивов на лету с nginx + mod_zip — просто, как 2 байта переслать Средний 8 мин 0 Nginx * PHP * Анализ и проектирование систем * Подготовка технической документации * Кейс Из песочницы...
<5 — 2026'da uzaya kaç SpaceX Starship fırlatması ulaşacak?
В сфере искусственного интеллекта произошло заметное событие. dstarikov только что Стриминг ZIP‑архивов на лету с nginx + mod_zip — просто, как 2 байта переслать Средний 8 мин 0 Nginx * PHP * Анализ и проектирование систем * Подготовка технической документации * Кейс Из песочницы Я работаю в Росэлторг, крупнейшем операторе электронных торгов: множество торговых секций, более миллиона пользователей, а общий объём проведённых торгов перевалил за 52 трлн рублей. Документов соответственно много: документация по закупкам, заявкам, протоколам, аккредитационные сведения, договоры — каждый привязан к сущностям со своими правилами доступа в зависимости от набора ролей пользователя и состояния закупочной процедуры. Пользователям регулярно нужно скачивать наборы документов архивом.
Долгое время у нас для этого использовались только файлы из собственной системы, которые мы сами же и генерировали, либо которые к нам загружали пользователи. Для этого у нас используется mod_zip, модуль для nginx. Когда передо мной встала задача интегрировать два новых внешних источника документов, то я столкнулся со сложностями, о которых расскажу ниже.
Технические детали
Новые файлы хранились не у нас, а в сторонних сервисах. У другой команды уже был прототип решения: скачивание удалённых файлов на сервер, расчет контрольных сумм, сборка манифеста ZIP и выдача клиенту. Работает, но появляется лишняя нагрузка на диск и сеть, пользователь вынужден дольше ждать, когда начнется скачивание.
Я решил это иначе — через mod_zip с proxy_pass для удалённых источников. В конце статьи есть ссылка на демо, где всё это можно потрогать руками. В демо‑репозитории и листингах кода в статье я привожу простейшие конструкции для демонстрации сути подхода, без бизнес‑логики, проверки прав, доступности файла и так далее Как работает mod_zipМодуль перехватывает HTTP‑ответы с заголовком X-Archive-Files: zip, читает тело ответа как манифест файлов, получает каждый файл через механизм внутренних подзапросов nginx и стримит валидный ZIP‑архив напрямую клиенту, ничего не записывая на диск.
Формат манифеста: по одному файлу на строку в следующем формате: <размер_в_байтах> <внутренний_url> <имя_в_архиве> <размер_в_байтах> <внутренний_url> <имя_в_архиве>Пример:037b3c3a 664 /local-files/lorem. txt b91a4c12 8832 /local-files/data. csv - 1478 /proxy-remote/evanmiller/mod_zip/master/LICENSE remote/LICENSEПоле внутренний_url соответствует location в nginx.
На практике надёжно работают два варианта: файловый alias для локальных файлов и proxy_pass для удалённых. Клиент эти пути никогда не видит. Поле CRC32 опционально: если нет возможности посчитать контрольную сумму, то можно проставить - и mod_zip посчитает его на лету.
Этот прогресс даёт важные сигналы о будущем отрасли, и технологический мир внимательно наблюдает.





