写入使用Nginx的Lua的模块

问题描述:

我与Nginx Lua module试验的文件。目前,我的目标仅仅是将某些HTTP响应保存到磁盘上的本地文件。写入使用Nginx的Lua的模块

阅读一些教程后,我的理解是,我可以用body_filter_by_lua指令做到这一点。我的方法是简单地在nginx.conf文件中嵌入一些Lua代码,从ngx.arg中检索响应主体,然后使用标准Lua io工具将其写入磁盘。

我从来没有在Lua编程之前,但我已经在其他脚本语言如Python编程广泛,所以我发现它很容易学习的Lua的基本知识。

不过,我的方法不起作用,而nginx error.log表示问题是我打开的file对象是nil

这里是Lua代码我放在nginx.conf文件中(编辑为清楚起见):

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() 
     '; 
    } 

所以这里的想法是,nginx的只会传递给一个代理请求,然后写响应身体出局到本地文件。

我测试这个使用:

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

但Nginx将返回一个空的答复。

所以我检查错误日志,看看:

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" 

那么,为什么是我的地方file变量nil?当我使用bash打开一个Lua控制台时,我可以打开/创建一个新的本地文件并向其写入文本,没有任何问题。

那么我做错了什么?起初我认为这可能是一些权限问题,nginx无法在当前工作目录中写入文件,但我的理解是nginx以root身份运行。我尝试了一个绝对路径,如/home/myusername/NGINX.txt,但它仍然失败,出现nil文件。我无法得到关于为什么filenil的更具体的错误。

那么我做错了什么?

不上的Lua但在我dabling的专家,我拿起某处包“io.open”调用“断言”功能。 See docs on assert

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

这可能只是确认这是代码失败的地方。看着那行,我不知道该“B”模式是什么“W + B”

您的意思是覆盖在io.open("TEST.txt", "w")或追加在io.open("TEST.txt", "a")

如果您使用这些测试并仍然出现错误,则表示该文件实际上未被访问。