【问题标题】:nginx: Storing POST data in PostgreSQLnginx:在 PostgreSQL 中存储 POST 数据
【发布时间】:2020-10-18 23:03:20
【问题描述】:

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】:

    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 进行检查。

    【讨论】:

    • 最终,这是唯一有效的方法。我添加了一个rewrite_by_lua_block 来获取带有ngx.req.read_body()ngx.req.get_body_data() 的请求正文。感谢您澄清为什么不能同时使用这两个模块。
    【解决方案2】:

    我同意亚历山大·阿奇舒勒的观点。 Nginx 不支持在 postgres_escape 指令运行的重写阶段捕获 request_body。

    我在我的 GitHub 分支 capture-request-body 中修改了 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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-06
      相关资源
      最近更新 更多