从nginx收集数据并针对唯一访问者配额提醒用户

时间:2011-11-13 09:07:23

标签: php mysql nginx logging

我有一个PoC,我正在尝试使用nginx作为Web服务器。我感兴趣的是通过电子邮件提醒用户,当达到一定百分比时,比如分配的唯一访问者配额的90%,比如1000,已经达到。

这是我能想到的:

  • 在nginx中启用acesslogs,在每小时运行一次的nginx主机上运行cron,并从accesslog中收集唯一的IP,将它们放入数据库表(使用REPLACE查询)。另一个cron也按小时间隔运行,在第一个cron之后,检查该表中的条目数并发送我们的警报。在每个新月,我们都会截断unique_hits_ip_username表中的所有条目。日志每周轮换一次。

我关心的是:

  • 如果用户群增长,每小时运行2个crons可能会影响性能。如果我们增加间隔,我们可能会错过一些标记,例如说如果在上次运行时用户的配额是80%,那么在下次运行时它会达到110%。因此,我们将发送配额达到90%的电子邮件,而实际上甚至超过现在指定的配额。
  • 包含唯一IP日志的数据库可能会增长到很大的比例。

最初我计划将两个crons放在php中,我会使用file()函数读取nginx的accesslog。

你有更好的替代品吗?或者对这种方法的任何调整?请建议。

1 个答案:

答案 0 :(得分:0)

尝试配置access_log指令以登录到Unix FIFO套接字。使用mknod /path/to/access.log创建FIFO,并尝试为此FIFO对象配置access_log指令。

现在,您可以编写一个脚本,打开FIFO并实时读取中的内容,进行数据操作,并根据需要将所需数据插入数据库。< / p>

这将删除每小时磁盘IO突发,并为您提供响应更快的警报。

一个缺点是nginx 可能阻止写入这些访问日志。 (我对此表示怀疑,但这是一种可能性。)您可能希望以比网络服务器稍低nice的级别运行脚本,以确保始终可以比FIFO更快地从FIFO中提取访问日志条目正在穿上。 (较低的nice值是较高的优先级。有关详细信息,请参阅nice(1)。)