使用 nginx httpluamodule 的 REST 接口

REST interface using nginx httpluamodule

我刚刚开始使用 nginx 和 HttpLuaModule。我已经创建了一个测试配置文件来熟悉它是如何工作的。

现在我正在尝试编写一些逻辑来接受对特定类型资源的 GET、POST 和 DELETE 请求。

我想创建一个 "location" 匹配以下 URI 的条目/接受以下 curl 调用:

curl -i -X GET http://localhost/widgets/widget?name=testname&loc=20000 -H "Accept:application/json"

这是我现在的 nginx.conf 的样子:

server {
    listen       80;
    server_name  nsps2;
root    /var/www/;
index   index.html index.htm;
#charset koi8-r;

#access_log  logs/host.access.log  main;
#curl http://localhost/hello?name=johndoe
location /hello {
        default_type "text/plain";
        content_by_lua '
        local rquri = ngx.var.request_uri;
        ngx.say("the uri is ", rquri ,".")

        local name = ngx.var.arg_name or "Anonymous"
                ngx.say("Hello, ", name, "!")
                ';
}

location / {
    root   /var/www/;
    index  index.html index.htm;
}

#curl -i -X GET http://localhost/widgets/widget?name=testname&loc=20000 -H "Accept:application/json"
location /widgets/widget {
        root /var/www/widgets;          
        default_type "text/pain";
        content_by_lua '
        local arga,argb = ngx.arg[1], ngx.arg[2] ;
        ngx.say("the arga is ", arga ,".")
        ngx.say("the argb is ", argb, ".")
        ';
}

使用最后一个 "location" 条目,我正在尝试 1.证明系统正在获取GET请求 2. 证明我了解如何访问通过 GET 请求传入的参数。

我现在收到如下所示的错误:

2015/02/24 20:18:19 [error] 2354#0: *1 lua entry thread aborted: runtime error: content_by_lua:2: API disabled in the context of content_by_lua*
stack traceback:
coroutine 0:
    [C]: in function '__index'
    content_by_lua:2: in function <content_by_lua:1>, client: 127.0.0.1, server: nsps2, request: "GET /widgets/widget?name=testname?loc=20000 HTTP/1.1", host: "localhost"

我不太确定此错误的含义/试图告诉我的含义。 任何提示将不胜感激。

谢谢。

编辑 1

我认为问题是语法错误。我正在阅读手册并找到了一个示例来尝试。我已将代码更改为如下所示:

    location /widgets/widget {
            default_type "text/pain";
            content_by_lua '
        local args = ngx.req.get_uri_args()
        for key, val in pairs(args) do
            if type(val) == "table" then
                ngx.say(key, ": ", table.concat(val, ", "))                    
            else
                ngx.say(key, ": ", val)
            end
        end
            ';
    }

现在当我这样调用应用程序时:

 mytestdevbox2:/var/www/nsps2# curl -i -X GET http://localhost/widgets/widget?name=testname&loc=20000 -H "Accept:application/json"
-ash: -H: not found
mytestdevbox2:/var/www/nsps2# HTTP/1.1 200 OK
Server: nginx/1.6.2
Date: Tue, 24 Feb 2015 21:32:44 GMT
Content-Type: text/pain
Transfer-Encoding: chunked
Connection: keep-alive

name: testname

[1]+  Done                       curl -i -X GET http://localhost/widgets/widget?name=testname

系统显示 "name: testname" 后,它就一直呆在那里,直到我点击 "enter"。在我这样做之后,它会继续显示 1+ 内容。 我不太确定它在做什么。

编辑 2:

向 curl 调用添加引号确实解决了问题:

mytestdevbox2:/var/www/nsps2# curl -i -X GET 'http://localhost/widgets/widget?name=testname&loc=20000'
HTTP/1.1 200 OK
Server: nginx/1.6.2
Date: Wed, 25 Feb 2015 12:59:29 GMT
Content-Type: text/pain
Transfer-Encoding: chunked
Connection: keep-alive

loc: 20000
name: testname
mytestdevbox2:/var/www/nsps2# 

EDIT 1中描述的问题与您关于nginx的问题没有任何关系,是由于您在执行命令时没有引用curl的参数造成的:

curl -i -X GET http://localhost/widgets/widget?name=testname&loc=20000

这是作为用'&'分隔的两个命令执行的:curl -i -X GET http://localhost/widgets/widget?name=testnameloc=20000;这就是为什么您在收到提示后看到输出的原因,因为第一个命令现在在后台执行。 “1+ Done”消息是对后台进程终止的确认;它只是在您按 Enter 后显示。

将 URL 和查询字符串括在引号中,您应该会看到预期的行为。