Патч ETags в NixOS

Maxim Dounin mdounin на mdounin.ru
Сб Янв 13 13:21:12 UTC 2024


Hello!

On Sat, Jan 13, 2024 at 10:34:08AM +0300, izorkin на gmail.com wrote:

> Добрый день, Максим.
> 
> Вы писали 13 января 2024 г., 3:28:36:
> 
> > Hello!
> 
> > Hash-сумма файла в качестве ETag - в целом отличное решение, 
> > проблема тут ровно одна: её нужно как-то получить, ибо системный 
> > вызов fstat() никаких hash-сумм почему-то не возвращает.  Считать 
> > на лету - очевидно, плохой вариант для нагруженного сервера, так 
> > как файл придётся на каждый запрос читать дважды.  А получать 
> > hash-сумму откуда-то ещё, скажем из внешнего файла или 
> > extended-атрибутов - выглядит в лучшем случае дополнительной фичей 
> > (смотри https://trac.nginx.org/nginx/ticket/2351 например).
> 
> Теоретически можно было бы сделать предварительное сканирование
> файлов и генерация хэш сумм при старте в фоновом режиме, для тех
> файлов, которыее расположены только в /nix/store или любой другой
> директории, указанной пользователем. А результаты сохранить в кеш.
> 
> Если генерировать хэш-сумму на лету, то зачем надо генерировать её
> каждый раз при повторном запросе? Можно же в кэше результат сохранить.
> Да и это надо делать только для тех файлов, которые имеют нулевую дату.
> А файлы в /nix/store меняются не часто, только при обновлении ОС.

Всё это предполагает какой-то кэш, который надо как-то отдельно 
делать и конфигурировать, и выглядит в лучшем случае 
дополнительной фичей.

> Вариант с файлами хэш-сумм выглядит более оптимальным. При генерации
> файлов в /nix/store можно дополнительно добавить возможность генерации
> хэш-суммы для каждого файла, который требуется для работы сайта. Таким
> же способом в некоторых приложениях организована генерация статических
> файлов в gzip и brotli форматы.

Именно об этом и тикет, да.  Мне тоже вариант с файлами кажется 
более интересным - с extended-атрибутами, возможно, код будет чуть 
проще и, вероятно, быстрее, в силу меньшего количества необходимых 
системных вызовов, но там сразу возникает масса проблем как с 
портабельностью, так и с хранением/синхронизацией (e.g., в том же 
nix store они могут просто не работать).

-- 
Maxim Dounin
http://mdounin.ru/


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