Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
nginx:在PostgreSQL中存储POST数据_Postgresql_Rest_Nginx_Openresty - Fatal编程技术网

nginx:在PostgreSQL中存储POST数据

nginx:在PostgreSQL中存储POST数据,postgresql,rest,nginx,openresty,Postgresql,Rest,Nginx,Openresty,nginx服务器提供了一个简单的REST接口,使用PostgreSQL实例作为后端。nginx应该将POST数据(已经是JSON格式)插入到数据库表中。不幸的是,包含POST数据的$request\u body仅由nginx在fastcgi\u pass,proxy\u pass 也没有帮助,因为它希望POST数据采用键值格式。我尝试过,但这会导致内部服务器错误: location ~ "^/api/v1/dummy/$" { auth_basic "Restr

nginx服务器提供了一个简单的REST接口,使用PostgreSQL实例作为后端。nginx应该将POST数据(已经是JSON格式)插入到数据库表中。不幸的是,包含POST数据的
$request\u body
仅由nginx在
fastcgi\u pass
proxy\u pass

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

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_博士后一起工作。是否有其他方法获取请求正文数据?

echo\u read\u request\u body和
postgres\u pass
指令都在内容阶段工作。 在这种情况下,只有一个模块可以工作

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

使用OpenResty,您可以强制nginx读取整个请求体。 注意
client\u body\u buffer\u size
client\u max\u body\u size
。 包括空的
由_lua*重写


另一种可能的解决方案是编写Lua代码,例如在由Lua块设置的
中,并读取完整的请求正文,记住它可能被缓冲到一个文件中,用于检查它。

我同意Alexander Altshuler的观点。Nginx不支持在运行
postgres\u escape
指令的重写阶段捕获请求体

我在GitHub分支中修改了ngx_postgres模块。但我的请求不太可能被接受

该分支添加了POST请求捕获功能。 您可以将请求保存到PostgreSQL数据库,例如,在此分支中使用这样的配置

location /dlr/sms
{
    allow all;
    postgres_escape_request_body on;
    postgres_pass     database;
    postgres_query    POST      "SELECT table2sms.treat_sms_dlr('$request_body')";
    postgres_rewrite  POST      changes 200;
    postgres_rewrite  POST      no_changes 400;
    postgres_output   value;
}

最终,这是唯一有效的方法。我添加了一个
rewrite\u by_lua\u块
,以获得带有
ngx.req.read\u body()
ngx.req.get\u body\u data()的请求正文。感谢您澄清为什么不能同时使用这两个模块。