在线用户¶
模块 mod_useronline
描述¶
一个模块,通过唯一IP(无Cookie)跟踪在线/活跃用户,包括计数点击量,并链接到(mod_status 服务器统计)。
背景¶
之前,我用PHP编写了一个模块,它也实现了类似跟踪在线用户的功能。
在某个时候,我意识到它有点浪费资源,于是决定将该模块集成到Lighttpd中。
我开始基于mod_rewrite的代码,使用PCRE来匹配模式,以决定是否跟踪某个页面。
我将代码通过电子邮件发送给Jan进行审查,并希望它能被包含到某个分支中,以便所有人都能使用它。
Jan很快回复并提出了一些建议/问题,这些建议/问题极大地改进了该模块(因为我对Lighttpd的内部工作原理还不太熟悉)。
我的名字是Wojciech(昵称:Wojtek),在线上我使用别名Wojjie。我运营/拥有http://www.game-monitor.com,该网站目前正在运行此模块,也是我上面提到的网站。
如果您想通过电子邮件直接联系我,可以通过以下地址:wojtekATwojjie.com(请注意:我确实收到很多垃圾邮件,因此请在主题中注明[mod_useronline]或[lighttpd],以便您的电子邮件能被注意到,并希望我的垃圾邮件过滤器不会将其拦截)。另一种联系我的方法是加入IRC,在Lighttpd的IRC频道(irc://irc.freenode.net/lighttpd)中挂机,我最有可能在那里。
限制¶
(代码审查:@gstrauss)
- 按当前代码,仅支持IPv4
- Bug:当达到
useronline.maxips
限制后,会发生越界读取 - 当未启用路径未被访问时,不会发生修剪(因此,如果使用mod_status 服务器统计,将不准确)
- RFE:模块可以用Lua编写,并由mod_magnet运行
- RFE:模块可以将数据存储在更高效可搜索的表/树中(如内部
array *
),并在lighttpd的handle_request_done
钩子中更新;不过,届时也应保留飞行中活跃请求的引用计数,并在引用计数从0改变时递增/递减活跃计数。
安装¶
- 下载 mod_useronline.c (https://redmine.lighttpd.ac.cn/attachments/download/197/mod_useronline.c)
- 将 mod_useronline.c 复制到 lighttpd 的 src 目录中。
- 编辑您的 src/Makefile.am 并在最后一个模块后添加以下内容
lib_LTLIBRARIES += mod_useronline.la
mod_useronline_la_SOURCES = mod_useronline.c
mod_useronline_la_LDFLAGS = -module -export-dynamic -avoid-version -no-undefined
mod_useronline_la_LIBADD = $(common_libadd)
- 返回 lighttpd 根目录,首先执行:
aclocal && automake && autoconf
,然后执行:make clean; ./configure --enable-maintainer-mode; make; make install
- 确保
/usr/local/lib
位于您的ld.so.conf
文件中,并重建 ld 数据库(使用:ldconfig)。
选项¶
- useronline.enable
启用或禁用指定区域的跟踪
默认值:0 [禁用]
示例:useronline.enable = 1
- useronline.online-age
用户/IP不再被视为在线的秒数
默认值:300
示例:useronline.online-age = 600
- useronline.active-age
用户/IP不再被视为活跃的秒数(注意:将此值设置高于online_age将使活跃计数与在线计数相同)
默认值:useronline.online-age / 3 = 100
示例:useronline.active-age = 60
- useronline.max-ips
要跟踪的最大IP数量(注意:如果达到此限制,服务器将不再跟踪新用户/IP)
内存使用:16 * max-ips (在64位系统上)
默认值:1024
示例:useronline.max-ips = 4096
- useronline.status-name
与服务器统计中显示的变量关联的名称(如果未设置,则不报告)
!!注意:下面的链接代码没有实现此功能;也许早期版本有!!
默认值:未设置
示例:useronline.status-name = "myWonderfulSite"
输出/结果¶
配置正确后,您会注意到一些新的环境变量可供使用。在PHP中,您可以像这样输出在线用户数量
<?php echo $_ENV['USERS_ONLINE'] ?>
以下是此模块生成的环境变量的当前列表
- users_online
在线用户数量(上次点击时间距今不超过 online_age 秒的IP)
- users_active
活跃用户数量(上次点击时间距今不超过 min(online_age, active_age) 秒的IP)
- user_hits
当前IP在线/活跃期间的点击量
- users_online_age
用户仍被视为在线的秒数(仅报告当前设置)
- users_active_age
用户仍被视为活跃的秒数(仅报告当前设置)
- users_online_max_ips
跟踪的最大IP数量(仅报告当前设置)
- users_online_id
站点/条件ID,跟踪数据所在位置(将来可能用于链接)
服务器统计¶
如果设置了useronline.status_name
,该模块将向状态计数器报告,这些计数器将显示在mod_status 服务器统计中
!!注意:下面的链接代码没有实现此功能;也许早期版本有!!
示例:(使用:useronline.status_name = "myWonderfulSite"
)
useronline.myWonderfulSite.active-age: 100
useronline.myWonderfulSite.id: 9
useronline.myWonderfulSite.max-ips: 4096
useronline.myWonderfulSite.online-age: 300
useronline.myWonderfulSite.users-active: 110
useronline.myWonderfulSite.users-online: 296
前4行报告设置,后2行报告当前计数器。
您会看到一个ID号,这是该站点/条件数据存储的ID。将来它可能用于将多个站点/条件链接在一起,以使用相同的计数器,从而更轻松地统计跨多个域的在线用户。
下载¶
适用于 1.4.x:2006年09月08日 (月/日/年)¶
查看:https://redmine.lighttpd.ac.cn/attachments/197/mod_useronline.c
下载:https://redmine.lighttpd.ac.cn/attachments/download/197/mod_useronline.c
下载:(更新链接)参见 #840 的附件