我正在尝试在nginx中使用Lua模块来设置一个基于请求正文中的JSON的variables(“foo”)。 然后我想logging该variables的值到访问日志。
像这样:
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不会从这个configuration开始。 它抱怨如此:
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中所做的。
思考?
我的nginx -V输出
你需要在Lua模块使用它之前定义变量$ foo。 在使用它之前,请检查文档以获取定位指令中定义变量的示例 。
所以,如上面的链接不再工作,这样做:
server { (...) map $host $foo { default ''; } (rest of your code) }
这是因为你不能在服务器模块中使用set
,这是为所有虚拟主机定义变量的最好方法。 geoip
也可能是一个不错的选择