![在某些位置,使用 content_by_lua_file 发送数据到 statsd 不起作用](https://linux22.com/image/633229/%E5%9C%A8%E6%9F%90%E4%BA%9B%E4%BD%8D%E7%BD%AE%EF%BC%8C%E4%BD%BF%E7%94%A8%20content_by_lua_file%20%E5%8F%91%E9%80%81%E6%95%B0%E6%8D%AE%E5%88%B0%20statsd%20%E4%B8%8D%E8%B5%B7%E4%BD%9C%E7%94%A8.png)
前
直到最近,我还使用 nginx 1.4.xzebrafishlabs/nginx-statsd作为 openresty 的反向代理(是的,我知道,nginx 后面的 nginx 很愚蠢 - 请继续阅读),使用以下位置 nginx 配置:
location /track {
statsd_count "tracker.track_$scheme" 1;
proxy_pass http://localhost:10081/track;
proxy_set_header Host $host;
}
..以及以下位置 openresty (当然,监听 TCP 端口 10081) 配置:
location /track {
content_by_lua_file 'conf/track.lua';
}
..而且成功了。请注意,我有几个这样的位置 - 这很重要,你稍后会看到。
统计数据被推送至 statsd 并且脚本被执行。
现在
最近决定删除前端nginx,单独使用openresty。
现在我正在使用 openresty 1.5.12.1,其中编译了 zebrafishlabs/nginx-statsd 以及以下(明显的)配置:
location /track {
statsd_count "tracker.track_$scheme" 1;
content_by_lua_file 'conf/track.lua';
}
但经过这次改变有时我的统计数据没有被推送到 statsd。
显然,如果我的 lua 脚本以 ngx.redirect lua 命令结束执行,就会发生这种情况。。
我尝试使用此配置作为解决方法:
location /track {
statsd_count "tracker.track_$scheme" 1;
proxy_pass http://127.0.0.1/track-do;
}
location /track-do {
content_by_lua_file 'conf/track.lua';
}
...但我得到了非常奇怪的结果:
当我以这种方式改变我的“轨道”位置时,它开始正常工作 - 所有统计数据推送到 statsd,代码执行。
..但与此同时,我的另一个位置“静态”,没有改变,停止了推送任何事物到 statsd (!)。
我认为这与 nginx 处理阶段有关。zebrafishlabs/nginx-statsd 在最后的日志阶段进行日志记录,而 content_by_lua_file 在内容阶段进行处理,并且我的脚本使用的 ngx.redirect 文档指出它“(...) 终止当前请求的处理并且永不返回。”但 proxy_pass 也在内容阶段,当我在 nginx 中一起使用它们时,statsd 指令就会运行……
1. 你能帮助我解决这个问题吗?
2. 您是否成功将 zebrafishlabs/nginx-statsd 与 openresty 结合使用?您是如何做到的?
PS我已经考虑使用aloneplanet/openresty-statsd这可能是一个可行的解决方法,但我必须将所有 statsd 的使用移到我的脚本中,而我并不想保持它们清洁。
更新:aloneplanet/openresty-statsd 方式也不起作用!?
答案1
最后我找到了一个解决方法——开始将访问日志写入文件,然后通过以下方式进行分析日志存储和它的statsd 输出插件。 有用。