nginx:在PostgreSQL中存储POST数据
2019-3-27 14:56:39
收藏:0
阅读:92
评论:2
一个nginx服务器提供一个简单的REST接口,使用PostgreSQL实例作为后端。nginx应该将POST数据(已经是JSON格式)插入到数据库表中。不幸的是,$request_body包含POST数据仅由nginx填充fastcgi_pass,proxy_pass等。。。
ngx_form_input也不起作用,因为它期望POST数据是键值对格式。我尝试了ngx_echo,但这会导致内部服务器错误:
location ~ "^/api/v1/dummy/$" {
auth_basic "Restricted";
auth_basic_user_file /usr/local/etc/nginx / .htpasswd;
如果($request_method!= POST){
返回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不兼容。有其他方法可以获得请求体数据吗?
点赞
用户11815747
我同意Alexander Altshuler的观点。在postgres_escape命令运行的重写阶段中,Nginx不支持捕获请求体。
我已经在我的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;
}
2020-10-18 15:03:20
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

echo_read_request_body和postgres_pass指令都在内容阶段起作用。 在这种情况下,只有一个模块起作用。问题在于nginx是异步的。 Nginx可能在接收完整的请求体之前就会发起上游连接。
使用OpenResty,您可以通过lua_need_request_body来强制nginx读取整个请求体。 注意
client_body_buffer_size和client_max_body_size。 包含空的rewrite_by_lua*。另一个可能的解决方案是编写Lua代码,例如在
set_by_lua_block中读取完整的请求体,记住它可能会被缓冲到文件中,使用ngx.req.get_body_file来检查它。