2013-07-15 14 views
8

Próbuję użyć modułu Lua w nginxie do ustawienia zmiennej ("foo") opartej na JSON w treści żądania. Następnie chcę zapisać wartość tej zmiennej w dzienniku dostępu.Zapisywanie zmiennej ustawionej przez moduł Luigi nginxa

tak:

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

Jednak nginx nie uruchomi się przy tej konfiguracji. Zarzuca wygląda następująco:

[email protected]:~$ sudo /etc/init.d/nginx reload 
Reloading nginx configuration: nginx: [emerg] unknown "foo" variable 
nginx: configuration file /etc/nginx/nginx.conf test failed 

Próbowałem dodanie zestawu $ foo „«-»” do lokalizacji, ale to po prostu wydaje się, aby zastąpić to, co robię w Lua.

Myśli?

My nginx -V output

+0

nginx mówi, że nie zadeklarowano zmiennej 'foo'. Masz rację, że powinieneś ustawić '$ foo' przed wywołaniem' rewrite_by_lua'. Jak myślisz, dlaczego to zastępuje to, co robisz w Lua? – catwell

Odpowiedz

0

Tak jak powyższy link nie działa już, to zrobić:

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

to, ponieważ nie można używać set wewnątrz bloku serwera i jest to najlepszy sposób, aby zdefiniować zmienną wszystkim vhostów. geoip może również być dobrym rozwiązaniem.

Powiązane problemy