Enregistrer une variable définie par le module Lua de nginx

J’essaie d’utiliser le module Lua dans nginx pour définir une variable (“foo”) basée sur JSON dans le corps d’une requête. Ensuite, je veux enregistrer la valeur de cette variable dans le journal des access.

Ainsi:

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; } 

Cependant, nginx ne démarrera pas avec cette configuration. Il se plaint donc:

 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 

J’ai essayé d’append un «set $ foo” – “‘à l’emplacement, mais cela semble juste remplacer ce que je fais dans Lua.

Pensées?

Ma sortie nginx -V

Vous devez définir la variable $ foo avant que le module Lua puisse l’utiliser. Vérifiez le document pour un exemple définissant la variable dans la directive de localisation avant de l’utiliser.

Alors comme le lien ci-dessus ne fonctionne plus, faites ceci:

  server { (...) map $host $foo { default ''; } (rest of your code) } 

Ceci parce que vous ne pouvez pas utiliser set dans le bloc serveur et c’est la meilleure façon de définir la variable à tous les vhosts. geoip pourrait aussi être une bonne option