nginx:在PostgreSQL中存储POST数据
nginx服务器提供了一个简单的REST接口,使用PostgreSQL实例作为后端。nginx应该将POST数据(已经是JSON格式)插入到数据库表中。不幸的是,包含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
$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()的请求正文。感谢您澄清为什么不能同时使用这两个模块。