我正在尝试使用nginx中的Lua模块在请求正文中基于JSON设置变量(“foo”)。然后我想将该变量的值记录到访问日志中。
像这样:
http {
log_format mylogfmt '$remote_addr - $remote_user [$time_local] \
"$request" $status $body_bytes_sent "$http_referer" \
"$http_user_agent" "$foo"'
}
location / {
proxy_pass http://remote-server.example.com/;
proxy_set_header X-Real-IP $remote_addr;
proxy_connect_timeout 150;
proxy_send_timeout 100;
proxy_read_timeout 100;
proxy_buffers 4 32k;
client_max_body_size 8m;
client_body_buffer_size 128k;
rewrite_by_lua '
cjson = require "cjson"
ngx.req.read_body()
body_table = cjson.decode(ngx.var.request_body)
ngx.var.foo = body_table["foo"]
';
access_log /var/log/nginx/access.log mylogfmt;
}
但是,nginx不会以此配置启动。它如此抱怨:
danslimmon@whatever:~$ sudo /etc/init.d/nginx reload
Reloading nginx configuration: nginx: [emerg] unknown "foo" variable
nginx: configuration file /etc/nginx/nginx.conf test failed
我尝试在该位置添加'set $ foo' - “',但这似乎覆盖了我在Lua中所做的事情。
思想?
答案 0 :(得分:5)
您需要在Lua模块可以使用它之前定义变量$ foo。在使用之前检查the doc for an example defining the variable within the location directive。
答案 1 :(得分:0)
因为上面的链接不再起作用,请执行以下操作:
server {
(...)
map $host $foo {
default '';
}
(rest of your code)
}
这是因为你不能在服务器块中使用set
,这是为所有vhost定义变量的最佳方法。 geoip
也可能是个不错的选择