nginx服务器提供简单的REST接口,使用PostgreSQL实例作为后端。 nginx应该将POST数据(已经是JSON格式)插入数据库表中。不幸的是,包含POST数据的$request_body
仅在fastcgi_pass
,proxy_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一起使用。有没有其他方法来获取请求正文数据?
echo_read_request_body
和postgres_pass
指令都在内容阶段工作。在这种情况下,只有一个模块可以工作。
这里的问题是nginx本质上是异步的。 Nginx可以在收到完整请求主体之前启动上游连接。
使用OpenResty,您可以强制nginx通过lua_need_request_body读取整个请求体。小心client_body_buffer_size
和client_max_body_size
。包括空的rewrite_by_lua*
。
另一种可能的解决方案是编写Lua代码,例如在set_by_lua_block
中并读取完整的请求体,请记住它可以缓冲到文件中,使用ngx.req.get_body_file进行检查。