通过 Nginx 将 POST 数据传递给 Unix 域套接字
2020-6-20 9:12:55
收藏:0
阅读:100
评论:1
我有一个 Unix 域套接字文件,并且使用 nc 命令可以正常工作。现在我想通过 Nginx 访问它,但它不起作用。我是否遗漏了什么?
使用 nc 进行测试 => 工作正常
$ echo '{"method":"getinfo","params":[],"id":"1"}' | nc -U /home/zono/.lightning/lightning-rpc
{"jsonrpc":"2.0","id":"1","result":
{
"id":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}
通过 Nginx 进行测试 => 无法工作
// /etc/nginx/sites-enabled/default
upstream nginx-internal-sock {
server unix:/home/zono/.lightning/lightning-rpc;
}
server {
listen 80;
location / {
proxy_pass http://nginx-internal-sock;
}
}
$ curl -H "content-type: application/json" -X POST --data '{ "method" : "getinfo", "params" : [], "id" : "1" }' http://127.0.0.1
2019-03-20T04:25:52.551Z lightningd(30143):jcon fd 32: Invalid token in json input: 'POST / HTTP/1.0??Host: nginx-internal-sock??Connection: close??C'
更新 1
出现了新情况。但我无法获得全部数据。
// 安装 nginx-extras
apt-get install nginx-extras
// /etc/nginx/sites-enabled/default
server {
listen 80;
location / {
content_by_lua '
ngx.req.read_body()
local body_data = ngx.req.get_body_data()
local sock = ngx.socket.tcp()
local ok, err = sock:connect("unix:/home/zono/.lightning/lightning-rpc")
local bytes = sock:send(body_data)
local line, err = sock:receive("*a")
ngx.say(line)
ok, err = sock:close()
';
}
}
// 响应为空
$ curl -X POST --data '{ "method" : "getinfo", "params" : [], "id" : "1" }' http://127.0.0.1
nil
// /var/log/nginx/error.log
2019/03/20 07:43:39 [error] 4926#4926: *35 lua tcp socket read timed out, client: 127.0.0.1, server: , request: "POST / HTTP/1.1", host: "127.0.0.1"
// 当我设置 "sock:receive("*l")" 时,响应是数据的一部分。
$ curl -X POST --data '{ "method" : "getinfo", "params" : [], "id" : "1" }' http://127.0.0.1
{ "jsonrpc": "2.0", "id" : "1", "result" :
我正在检查参考文献。http://w3.impa.br/~diego/software/luasocket/tcp.html
'*a':从套接字读取,直到连接关闭。不执行换行符转换;
'*l':从套接字读取一行文本。该行由一个 LF 字符(ASCII 10)终止,可选择由一个 CR 字符(ASCII 13)前导。 CR 和 LF 字符不包含在返回的行中。实际上,所有 CR 字符都由该模式忽略。这是默认模式;
number:使方法从套接字读取指定数量的字节。
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- 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 代码?

我找到了答案。
// 安装 nginx-extras apt-get install nginx-extras // /etc/nginx/sites-enabled/default server { listen 80; location / { content_by_lua ' ngx.req.read_body() local body_data = ngx.req.get_body_data() local sock = ngx.socket.tcp() local ok, err = sock:connect("unix:/home/zono/.lightning/lightning-rpc") local bytes = sock:send(body_data) local readline = sock:receiveuntil("\\n\\n") local line, err, part = readline() if line then ngx.say(line) end ok, err = sock:close() '; } } // curl $ curl -X POST --data '{ "method" : "getinfo", "params" : [], "id" : "1" }' http://127.0.0.1