有没有办法让 Nginx 在来自推荐人的点击超过阈值时通知我?
例如,如果我的网站在 Slashdot 上有特色,并且突然间我在一个小时内有 2K 的点击量,我希望在超过 1K 的点击量时收到通知。
可以在 Nginx 中做到这一点吗?可能没有lua?(因为我的 prod 不是 lua 编译的)
Lad*_*ada 13
我认为使用 logtail 和 grep 会做得更好。即使可以使用 lua 内联,您也不希望每个请求都有这种开销,尤其是当您被 Slashdotted 时,您尤其不希望它。
这是一个 5 秒的版本。把它放在一个脚本中,并在它周围放一些更具可读性的文本,你就是金子。
5 * * * * logtail -f /var/log/nginx/access_log -o /tmp/nginx-logtail.offset | grep -c "http://[^ ]slashdot.org"
Run Code Online (Sandbox Code Playgroud)
当然,这完全忽略了 reddit.com 和 facebook.com 以及所有其他可能为您带来大量流量的数百万个网站。更不用说 100 个不同的站点,每个站点向您发送 20 个访问者。您可能应该有一个普通的旧流量阈值,它会导致向您发送电子邮件,而不管推荐人如何。
最有效的解决方案可能是编写一个守护程序来跟踪该tail -f字段。access.log$http_referer
然而,一个快速而肮脏的解决方案是添加一个额外的access_log文件,仅记录$http_referer具有自定义的变量log_format,并每 X 分钟自动轮换日志。
这可以借助标准 logrotate 脚本来完成,该脚本可能需要优雅地重新启动 nginx 才能重新打开文件(例如,标准过程,请简单查看一下SO上的 /a/15183322 -基于脚本)\xe2\x80\xa6
或者,通过在 中使用变量,可能是通过在或指令的帮助access_log下获取详细规范(取决于您想要将 放置在何处)。$time_iso8601mapifaccess_log
因此,通过上述内容,您可能有 6 个日志文件,每个日志文件涵盖 10 分钟的时间段,http_referer.Txx{0,1,2,3,4,5}x.log例如,通过获取分钟的第一位数字来区分每个文件。
现在,您所要做的就是有一个可以每 10 分钟运行一次的简单 shell 脚本,将cat上述所有文件放在一起,通过管道将其传输到sort、通过管道传输到uniq -c、to sort -rn、to ,然后您就得到了 16 种最常见变体head -16的列表Referer\xe2\x80\x94 可以自由决定数字和字段的任何组合是否超出您的标准,并执行通知。
随后,在一次成功通知后,您可以删除所有这 6 个文件,并且在后续运行中,不发出任何通知,除非所有六个文件都存在(和/或您认为合适的某个其他数量)。
\n