2016-12-15 6 views
1

Ich experimentiere mit der Nginx Lua module. Derzeit ist es mein Ziel einfach, bestimmte HTTP-Antworten in einer lokalen Datei auf der Festplatte zu speichern.Schreiben in eine Datei mit Nginx Lua Modul

Nach dem Lesen ein paar Tutorials, ist mein Verständnis, dass ich dies mit der body_filter_by_lua Direktive tun kann. Mein Ansatz ist einfach, einige Lua-Code in die Datei nginx.conf einzubetten, rufen Sie den Antworttext von ngx.arg, und verwenden Sie dann Standard Lua io Einrichtungen, um es auf die Festplatte zu schreiben.

Ich habe noch nie zuvor in Lua programmiert, aber ich habe ausführlich in anderen Skriptsprachen wie Python programmiert, also fand ich es ziemlich einfach, die Grundlagen von Lua zu lernen.

Noch funktioniert mein Ansatz nicht, und die Nginx error.log zeigt das Problem ist, dass das file Objekt, das ich öffne, nil ist.

Hier ist der Lua Code, den ich in der nginx.conf Datei platzieren (aus Gründen der Übersichtlichkeit bearbeitet):

location /foo { 
     proxy_pass http://my_upstream_proxy; 
     proxy_cache my_cache; 
     proxy_redirect default; 
     proxy_set_header Host  $host; 
     proxy_set_header X-Real-IP $remote_addr; 
     proxy_set_header X-Forwarded-Host $host; 
     proxy_set_header X-Forwarded-Server $host; 
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 

     body_filter_by_lua ' 
      local resp_body = ngx.arg[1] 
      ngx.ctx.buffered = (ngx.ctx.buffered or "") .. resp_body 
      if ngx.arg[2] then 
       ngx.var.resp_body = ngx.ctx.buffered 
      end 

      local file = io.open("TEST.txt", "w+b") 
      file:write(resp_body) 
      file:close() 
     '; 
    } 

Die Idee dabei ist, dass nginx einfach die Anforderung an einen Proxy passieren würde, und schreiben Sie dann die Antwort Body-out zu einer lokalen Datei.

Ich teste diese mit:

curl http://www.google.com --proxy http://localhost:80 

Aber nginx gibt eine leere Antwort.

So prüfe ich das Fehlerprotokoll und sehen:

2016/12/15 11:51:00 [error] 10056#0: *1 failed to run body_filter_by_lua*: body_filter_by_lua:9: attempt to index local 'file' (a nil value) 
stack traceback: 
     body_filter_by_lua:9: in function <body_filter_by_lua:1> while sending to client, client: 127.0.0.1, server: test-server, request: "GET http://www.google.com/ HTTP/1.1", upstream: "http://69.187.22.138:82/", host: "www.google.com" 

Warum meine lokale file Variable nil ist? Wenn ich eine Lua-Konsole mit bash öffne, kann ich eine neue lokale Datei öffnen/erstellen und Text ohne Probleme schreiben.

Also, was mache ich falsch? Zuerst dachte ich, es könnte ein Problem mit Berechtigungen sein, und nginx kann keine Datei im aktuellen Arbeitsverzeichnis schreiben, aber ich verstehe, dass nginx als root ausgeführt wird. Ich habe einen absoluten Pfad wie /home/myusername/NGINX.txt versucht, und es schlägt immer noch mit einer nil Datei fehl. Ich bin nicht in der Lage, einen spezifischeren Fehler darüber zu bekommen, warum filenil ist.

Also, was mache ich falsch?

Antwort

0

kein Experte für Lua, aber in meinem Dabling, nahm ich irgendwo „io.open“ Anrufe in einem „behaupten“ Funktion zu wickeln. See docs on assert

local file = assert(io.open("TEST.txt", "w+b"), "Inaccessible file") 

Dies wird wahrscheinlich bestätigen nur, dass das ist, wo andernfalls wird der Code. Wenn ich auf diese Zeile schaue, bin ich nicht sicher, was der "b" Modus in "w + b" ist.

Meinst Du wie in io.open("TEST.txt", "w") oder hängen Sie wie in io.open("TEST.txt", "a") überschreiben?

Wenn Sie mit diesen Tests testen und trotzdem einen Fehler erhalten, bedeutet dies, dass auf die Datei nicht zugegriffen wird.