如何在HAProxy中路由请求之前从Lua发送https请求?
2021-5-17 12:10:1
收藏:0
阅读:191
评论:1
我使用了haproxy Socket类,如下所述https://www.haproxy.com/blog/5-ways-to-extend-haproxy-with-lua/#actions 从lua代码中进行http请求外部服务(请参阅下面的代码)。
1.如何向服务发出https请求? 2.是否可以指定连接到的服务的域名而不是IP地址?
任何帮助都将不胜感激。
local function http_request(txn, data)
local addr = <external-IP>
local port = 80
-- 设置到服务的请求
local hdrs = {
[1] = string.format('host: %s:%s', addr, port),
[2] = 'accept: */*',
[3] = 'connection: close'
}
local req = {
[1] = string.format('GET %s HTTP/1.1', data.path),
[2] = table.concat(hdrs, '\r\n'),
[3] = '\r\n'
}
req = table.concat(req, '\r\n')
-- 使用core.tcp获取Socket类的实例
local socket = core.tcp()
socket:settimeout(data.timeout)
-- 连接到服务并发送请求
if socket:connect(addr, port) then
if socket:send(req) then
-- 跳过响应头
while true do
local line, _ = socket:receive('*l')
if not line then break end
if line == '' then break end
end
-- 获取响应内容,如果有的话
local content = socket:receive('*a')
return content
else
core.Alert('无法连接到服务器(发送)')
end
socket:close()
else
core.Alert('无法连接到服务器(连接)')
end
end
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- 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 代码?

最近在解决一个问题时,我发现我们不能传递域名。我正在使用 http.lua 库。这个 http.lua 库像你在你的代码中使用的 Socket 类一样。
在搜索了很多之后,我发现我无法找到一个 DNS 解析库。有一个与 nginx lua 相关的库,但需要安装多个不同的 lua 库,所以我跳过了它。
我做的解决方法是,在 HAProxy 中创建了自己的 DNS 解析器服务 http://127.0.0.1:53535,如下所示:
listen lua_dns bind 127.0.0.1:53535 http-request do-resolve(txn.dstip,mydns,ipv4) hdr(ResolveHost),lower http-request return status 200 content-type text/plain lf-string OK hdr ResolvedIp "%[var(txn.dstip)]"对于这个服务,我在请求头中传递了域名
ResolveHost并在响应头中获取了 IPResolvedIp。现在,用于解析 URL 中的域并调用 DNS 解析器服务的 Lua 函数如下:
local function parse_domain(url) local schema, host, _ = url:match("^(.*)://(.-)[?/](.*)$") if not schema then -- maybe path (request uri) is missing schema, host = url:match("^(.*)://(.-)$") if not schema then core.Info("ERROR :: Could not parse URL: "..url) return nil end end return host end local function resolve_domain(domain) local d = parse_domain(domain) local r, msg = http.get{ url = "http://127.0.0.1:53535", headers={ResolveHost=d} } if r == nil then core.Info("ERROR: "..msg..". While resolving doamin: "..d) return msg end return r.headers['resolvedip'] end现在使用 gsub() 将解析后的 IP 替换为 URL 中的域名
url = string:gsub(domain_name, resolved_ip)然后使用 http.lua 调用你的 API
local res, msg = http.get{ url=url, headers=headers }在这里,http.lua 库将处理 HTTP 和 HTTPS 的 URL。