nginx hackery:每次 X 请求时都会更改图像文件

nginx hackery:每次 X 请求时都会更改图像文件

让我首先描述一下我正在做的事情。

我在名为 /images/* 的目录中有一堆图片。(jpg|gif|png|blah blah|)

现在假设这些图像嵌入在 html 页面中,而我并不真正关心它嵌入哪个图像或在哪里。

对于对同一图片文件的每 10 次请求(如果可能)或任何图片,我都希望显示一个固定的图像(例如 trollface.jpg)。就是这样!

我搜索了一番,但我甚至不确定自己在寻找什么。重写可能会有所帮助,但这是永久性的。这必须与请求有关。我听说 perl 脚本可以与 nginx 一起使用。我无法编写 nginx 模块(尽管我确实勇敢地查找了文档,然后放弃了)

在你问“但是你为什么不在应用程序中这样做呢,菜鸟?”之前。这是一个仅静态文件的服务器。重点是根本不执行任何二进制文件。

答案1

另一个解决方案是让 nginx 代理自己。设置两个上游虚拟主机,一个用于提供普通图像,另一个仅提供 trollface.jpg。

将普通 vhost 作为您的上游服务器,权重为 9,将 trollface vhost 作为另一个上游服务器,权重为 1。

这将在每 10 个请求中提供一次备用图像,但不会在每个单独的文件每 10 个请求中提供一次。

或者,HttpEcho模块也许能帮你解决问题。echo_subrequest_async 和 echo_random 的组合可以给你十分之一的机会提供 trollface.jpg 而不是他们请求的文件。

还有这个在邮件列表中发帖这表明有人正在研究 nginx 配置中每个 IP 地址的计数器。

请注意,我不是推荐任何这些解决方案,只是指出它们是可能的。

答案2

我可以想到一个解决您问题的方法,而无需破解 nginx。

简而言之,它可以在文件系统级别进行处理。

更详细地说,您可以配置一个incron在事件发生时执行的脚本IN_ACCESS。这意味着,只要访问(读取)特定文件,您的脚本就会执行。在此脚本中,您可以做任何您想做的事情,例如计算读取访问次数,然后用另一个文件覆盖该文件(不要忘记保留备份)。

请注意,服务器缓存可能会影响此方法。当文件/图像被服务器或中间代理服务器缓存时,可能无法读取它。

我假设是 Linux 平台。您可能需要安装incron软件包。

答案3

偶然间..我遇到了这个。

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

这似乎比编写整个 NGINX 模块要容易得多。基本上我们使用已经制作好的 nginx 模块,只是似乎必须使用 memcache 来保存计数器。但至少看起来是可行的。

有更新的 memcache 和子请求示例。由于“if”调用,它仍会稍微减慢 nginx 的速度,但不会太慢。如果我知道如何去做,我更喜欢 Khaled 的方法。

相关内容