当前位置:首页 > 开发 > 开源软件 > 正文

lua统计nginx内部变量数据

发表于: 2015-05-21   作者:ronin47   来源:转载   浏览:
摘要: server { listen 80; server_name photo.domain.com; location /{set $str $uri; content_by_lua ' local url = ngx.var.uri local res = ngx.location.capture(
server {
    listen 80;
    server_name photo.domain.com;
    location /{set $str $uri;
        content_by_lua '
            local url = ngx.var.uri
            local res = ngx.location.capture("/proxy", {vars = { str = url }})
            ngx.print(res.body)
            ngx.shared.log_dict:set("url", url)
            local upstream_stat = ngx.var.status
            local upstream_time = tonumber(ngx.var.upstream_response_time)
            local redis = require "resty.redis"
            local red = redis:new()
            local ok, err = red:connect("127.0.0.1", 6379)
            if upstream_stat ~= "200" then
                red:sadd("url",url)
                red:incr(url)
                red:incr(url..":time", upstream_time)
            end
         ';}
    location /dict_status {
        content_by_lua '
            local url = ngx.shared.log_dict:get("url")
            ngx.say(url)
         ';}
    location /redis_status {
        content_by_lua '
            local redis = require "resty.redis"
            local red = redis:new()
            local ok,err = red:connect("127.0.0.1", 6379)
            local urlist,err = red:sort("url","limit","0","1","desc","by","*")
            if not urlist then
                ngx.say(err)
                return
            end
            for i = 1, #urlist do
                local avg = red:get(urlist[i])
                local sum = red:get(urlist[i]..":time")
                ngx.say(urlist[i],"\tavg_time:",avg/sum, "\tsum:",sum)
            end
         ';}
    location /proxy {
        proxy_pass http://backend_fmn_xnimg_cn$str;
        proxy_set_header Host'fmn.rrimg.com'; 
        include conf.d/proxy.conf;}}

ngx_lua里的指令有set/rewrite/header_filter/log/content/access_by_lua等,它们各自处于nginx处理流程中的某一步,所以有些日志变量可能不一定都能读取到。还有header_filter和log两个不能调用subrequest和output的API(也就是只能使用上例代码中的ngx.shared.DICT方式,但只支持简单的key-value),content不能和proxy_pass在一起等等……

不过content里可以调用ngx.location.capture()来subrequest其他location,比如这里利用/proxy来完成原来的proxy_pass的功能。 因为subrequest后$uri有变化,所以pass必须写对真正的url的全路径。这就靠之前的set $str来传递变量了。

最终运行结果:

# curl http://fmn.rrimg.cn/redis_status    
/test avg_time:0.73 sum:12

lua统计nginx内部变量数据

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
关于spdy 摘自 http://zh.wikipedia.org/wiki/SPDY SPDY SPDY是Google开发的基于传输控制协议(TCP
1、下载OpenResty和Redis OpenResty下载地址:wget http://openresty.org/download/ngx_openresty-1
1、下载OpenResty和Redis OpenResty下载地址:wget http://openresty.org/download/ngx_openresty-1
1、 下载OpenResty和Redis OpenResty下载地址:wget http://openresty.org/download/ngx_openresty-1
安装 在编译nginx之前,编译选项里加上: --with-http_stub_status_module 因为nginx默认是不安装改
相遇是件难得的事情,在一起更不简单,但是nginx和lua就是成功的结合起来。文本将以演进式方式与大
最近很多人问我nginx lua的优势是什么?为什么? 一、同步和异步、阻塞和非阻塞 如果要说清楚这个问
agentzh tech-club.org 演讲听录 活动: Tech-Club技术沙龙(2012年2月)活动小结 幻灯: ngx_openres
在之前lua学习:lua作配置文件里,我们学会了用lua作配置文件。 其实lua在游戏开发中可以作为一个强
ZeroBrane By seeking, you will discover... Subscribe Debugging OpenResty and Nginx Lua script
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号