nginx:在PostgreSQL中存储POST数据

问题描述 投票:0回答:1

nginx服务器提供简单的REST接口,使用PostgreSQL实例作为后端。 nginx应该将POST数据(已经是JSON格式)插入数据库表中。不幸的是,包含POST数据的$request_body仅在fastcgi_passproxy_pass上由nginx填充,...

ngx_form_input也没有帮助,因为它期望键值格式的POST数据。我试过ngx_echo,但这会导致内部服务器错误:

location ~ "^/api/v1/dummy/$" {
    auth_basic              "Restricted";
    auth_basic_user_file    /usr/local/etc/nginx/.htpasswd;

    if ($request_method != POST) {
        return 405;
    }

    client_max_body_size    100k;
    client_body_buffer_size 100k;

    echo_read_request_body;

    postgres_pass       postgresql;
    postgres_escape     $json =$request_body;

    postgres_query      POST "INSERT INTO mytable (data) VALUES ('$json')";
    postgres_rewrite    POST changes    201;
    postgres_rewrite    POST no_changes 204;
}

似乎ngx_echo不能与ngx_postgres一起使用。有没有其他方法来获取请求正文数据?

postgresql rest nginx openresty
1个回答
1
投票

echo_read_request_bodypostgres_pass指令都在内容阶段工作。在这种情况下,只有一个模块可以工作。

这里的问题是nginx本质上是异步的。 Nginx可以在收到完整请求主体之前启动上游连接。

使用OpenResty,您可以强制nginx通过lua_need_request_body读取整个请求体。小心client_body_buffer_sizeclient_max_body_size。包括空的rewrite_by_lua*

另一种可能的解决方案是编写Lua代码,例如在set_by_lua_block中并读取完整的请求体,请记住它可以缓冲到文件中,使用ngx.req.get_body_file进行检查。

© www.soinside.com 2019 - 2024. All rights reserved.