让我先描述一下我想要做的事情。
我在一个名为/images/*.(jpg|gif|png|blah blah |)的目录中有一堆照片。
现在说这些图像embedded在一个HTML页面,我真的不在乎哪个图像或其embedded的位置。
对于同一图片文件(如果可能的话)的每个第10个请求,或者任何想要显示固定图片的图片(例如trollface.jpg)。 而已!
我search了一下,但我甚至不知道我在找什么。 重写可能会有所帮助,但这是一个永久的事情。 这需要做一些事情。 我听说perl脚本可以用于nginx。 我不能写一个nginx模块(尽pipe我勇敢地查找了文档,然后放弃了)
在你问“但是你为什么不在申请中做,小白?”之前。 这是一个静态文件唯一的服务器。 关键是不要执行任何二进制文件。
另一种解决scheme可能是让nginx代理自身。 设置两个上游虚拟主机,一个提供正常的图像,另一个提供trollface.jpg。
将正常的vhost作为上游服务器,权重为9,trollface vhost作为权重为1的另一个上游服务器。
这将在每10次请求中提供一次备用图像,但是每个单独的文件不会每10次请求一次。
或者, HttpEchoModule也许可以为你做诡计。 echo_subrequest_async和echo_random的组合可以给你提供trollface.jpg的机会,而不是他们所要求的文件。
邮件列表上也有这个post,这表明有人正在nginxconfiguration中的每个IP地址计数器上工作。
请注意,我不推荐任何这些解决scheme,只是指出它们是可能的。
我可以想出一个解决scheme来解决你的问题,而不需要破解nginx。
不久之后,就可以在文件系统级别进行处理了。
更详细地说,你可以configurationincron脚本在IN_ACCESS事件中执行。 这意味着只要访问特定文件(读取),脚本就会被执行。 在这个脚本中,你可以做任何你想要的东西,比如读取访问,然后用另一个覆盖文件(不要忘了保留一个备份)。
请注意,服务器caching可能会影响此方法。 当服务器或中间代理服务器caching文件/图像时,可能无法读取文件/图像。
我正在假设Linux平台。 您可能需要安装incron pacakge。
随机的,我倒在这。
http://agentzh.org/misc/slides/nginx-conf-scripting/nginx-conf-scripting.html#1
这似乎比编写整个NGINX模块容易得多。 基本上我们使用已经制作的nginx模块,除了看起来我必须使用memcache来保存计数器。 但至less看起来可能。
有更新的memcache和子请求的例子。 由于“if”调用,它将会使nginx变慢一些,但不会太多。 如果我知道如何去做,我更喜欢哈立德的方法。