Назад | Перейти на главную страницу

nginx hackery: менять файл изображения каждый X запрос

Позвольте мне сначала описать, что я пытаюсь сделать.

У меня есть куча картинок в каталоге под названием /images/*.(jpg|gif|png|blah blah |)

Теперь предположим, что эти изображения встроены в HTML-страницу, и мне все равно, какое изображение или где оно встроено.

Для каждого 10-го запроса одного и того же файла изображения (если возможно) или для любого изображения я хочу отображать фиксированное изображение (например, trollface.jpg). Это оно!

Я немного искал, но даже не уверен, что ищу. Перезапись может помочь, но тогда это навсегда. это как-то связано с запросами. Я слышал, что скрипты Perl можно использовать с nginx. Я не могу написать модуль nginx (хотя я смело просмотрел документацию, а затем сдался)

Прежде чем вы спросите: «А почему бы тебе не сделать это в приложении, нуб?». Это сервер только для статических файлов. Дело в том, чтобы вообще не выполнять никаких двоичных файлов.

Я могу придумать одно решение вашего вопроса без необходимости взламывать nginx.

Вкратце, это можно сделать на уровне файловой системы.

Более подробно вы можете настроить incron скрипт, который будет выполняться на IN_ACCESS мероприятие. Это означает, что ваш сценарий будет выполняться при каждом доступе (чтении) к определенному файлу. В этом сценарии вы можете делать все, что захотите, например, подсчитывать доступы для чтения, и они перезаписывают файл другим (не забудьте сохранить резервную копию).

Обратите внимание, что кеширование сервера может повлиять на этот метод. Файл / изображение может быть не прочитано, если оно кэшировано сервером или промежуточным прокси-сервером.

Я предполагаю платформу Linux. Возможно, вам потребуется установить incron pacakge.

Случайно .. Я наткнулся на это.

http://agentzh.org/misc/slides/nginx-conf-scripting/nginx-conf-scripting.html#1

Это кажется намного проще, чем писать целый модуль NGINX. В основном мы используем уже созданные модули nginx, за исключением того, что мне кажется, что мне нужно использовать memcache для сохранения счетчиков. Но, по крайней мере, это выглядит возможным.

Есть обновленные примеры для кэша памяти и подзапросов. Это все равно немного замедлит nginx из-за вызовов if, но не слишком сильно. Я бы предпочел метод Халеда, если бы знал, как это сделать.

Другим решением может быть использование прокси-сервера nginx для себя. Настройте два восходящих хоста, один из которых обслуживает ваши обычные изображения, а другой - только trollface.jpg.

Включите обычный vhost в качестве восходящего сервера с весом 9 и vhost trollface в качестве другого восходящего сервера с весом 1.

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

В качестве альтернативы HttpEchoModule может помочь вам. Комбинация echo_subrequest_async и echo_random может дать вам шанс 1 из 10 доставить trollface.jpg вместо запрошенного файла.

Также есть это разместить в списке рассылки что предполагает, что кто-то работает над счетчиками IP-адресов в конфигурации nginx.

Обратите внимание, что я не рекомендуя любое из этих решений, просто отметив, что они возможны.