非常感谢你的解答,按你说的方法我试了一下有点眉目。不过还是有点问题 用ngx.var.bytes_send返回的全是空,用ngx.var.body_bytes_send可以
lua_shared_dict log_dict 5M;
server {
listen 8080;
root /tmp/haha;
location / {
log_by_lua "
local log_dict = ngx.shared.log_dict
log_dict:set('body_bytes_sent',ngx.var.body_bytes_sent)
";
}
location = /status {
default_type 'text/plain';
content_by_lua "
local log_dict = ngx.shared.log_dict
local body_send=log_dict:get('body_bytes_sent')
ngx.say(body_send)
";
}
}
上面的这个配置是可以获取到下载的流量,不过我在下载的时候点暂停的时候,再去新开一个下载他就会一直卡在这里,这是一个阻塞的。而且暂停的时候获取的取一直是208, 不知道什么原因。还请老师指点一下 谢谢!
在 2013年4月10日星期三UTC+8上午2时28分14秒,agentzh写道:
Hello!
2013/4/8 Toad Zhou:
> 现在我不知道用lua如何来获取到他们的每个用户的实时下载流量!? 获取用户可以不用GET改用COOKIE也可以,有一个标记就成。求大牛们给点思路谢谢了!
>
当前请求的实时下载流量可以通过读取 $bytes_sent 或者 $body_bytes_sent 这两个标准 Nginx
变量来实现。前者是包括响应头在内的总流量,后者是响应体的流量。细节见这里:
http://wiki.nginx.org/HttpLogModule#log_format
你可以在 log_by_lua 或者 body_filter_by_lua 等上下文中读取此变量并作相应的处理。特别地,在 Lua
中访问这两个变量时,分别使用记法 ngx.var.bytes_sent 或者 ngx.var.body_bytes_sent.
下面是一个例子:
location /t {
echo hello world;
log_by_lua '
print("bytes sent: ", ngx.var.bytes_sent)
print("body bytes sent: ", ngx.var.body_bytes_sent)
';
}
使用 HTTP 1.1 访问此 /t 接口时,在 nginx 的错误日志文件中可以得到下面两行:
[notice] 12627#0: *1 [lua] [string "log_by_lua"]:2: bytes sent: 144
while logging request
[notice] 12627#0: *1 [lua] [string "log_by_lua"]:3: body bytes sent:
12 while logging request
如果你需要做实时流量控制,可以配合共享内存字典等东西来汇总和存储这些数据。
Regards,
-agentzh