请教一下大家 nginx 能把一个接口 同时代理到多个地址上吗?

2024-03-07 11:44:38 +08:00
 hayhong123
举个例子,就是想要做到一个 location 中配置多个 proxy_pass 的效果,具体场景是三方短信回调只能配置一个地址,所以就想无脑把这个地址同时转发到多套环境的接口上。
location /api/message/xxx {
proxy_pass https://a.com/api/message/xxx/;
proxy_pass https://b.com/api/message/xxx/;
proxy_pass https://c.com/api/message/xxx/;
proxy_pass https://d.com/api/message/xxx/;
}
2532 次点击
所在节点    NGINX
14 条回复
Jeremial
2024-03-07 11:46:18 +08:00
nginx upstream
https://nginx.org/en/docs/http/ngx_http_upstream_module.html


upstream backend {
server backend1.example.com weight=5;
server backend2.example.com:8080;
server unix:/tmp/backend3;

server backup1.example.com:8080 backup;
server backup2.example.com:8080 backup;
}

server {
location / {
proxy_pass http://backend;
}
}
hayhong123
2024-03-07 11:50:13 +08:00
@Jeremial 我想的是 同时转到多个地址上 不是轮询或者 ip_hash 之类的负载 请问大佬这个需要怎么改一下哈?
Kinnice
2024-03-07 11:54:06 +08:00
看起来得上 lua 脚本了
GBdG6clg2Jy17ua5
2024-03-07 11:57:04 +08:00
我曾经也有这个需求。
单纯 nginx 没搞出,用 node 写了个转发。
关注一下纯 nginx 的方案。
deorth
2024-03-07 11:59:43 +08:00
你打算把哪个响应返回给客户端?
wu00
2024-03-07 11:59:56 +08:00
这不是 proxy ,而是 mirror ,可以搜一下 nginx mirror
你这个需求放到业务层面去处理应该合理一点,比如 a,b 响应成功,c ,d 响应 500 咋整
cdlnls
2024-03-07 12:01:10 +08:00
用 lua 脚本应该能实现,脚本很简单,问下一下 ai 就可以了。
大致流程是,访问的时候,lua 一个 for 循环去请求那几个地址就可以了。还可以根据需要,处理一下接口的响应信息。
nanwangnongfu
2024-03-07 12:32:21 +08:00
感觉可以考虑 MQ 的消息广播
yinmin
2024-03-07 13:12:54 +08:00
逻辑有点问题,同时发送到多个地址,nginx 没法选返回的结果页面用哪个。需要自己写一个程序吧
cxsz
2024-03-07 13:13:46 +08:00
nginx 可以调用 js ,用 js 写一个脚本吧
F7TsdQL45E0jmoiG
2024-03-07 13:35:12 +08:00
local ngx = ngx

function content_by_lua_block(r)
local servers = {
"http://b.com/api/message",
"http://c.com/api/message",
"http://d.com/api/message",
}

local i = 1
for _, server in ipairs(servers) do
ngx.req.set_uri(server)
ngx.req.set_method("GET")

ngx.say("")

i = i + 1
end
end

大概就这样
flavoury
2024-03-07 23:05:42 +08:00
openresty ,上 lua 脚本,或者用 nginx 的流量复制,可以的
lm930129
2024-03-07 23:31:54 +08:00
你这个难道不是应该后端配置地址数组么,后端实现调用的时候判断是否成功吧
lidapang
2024-03-08 09:48:07 +08:00
Nginx 流量镜像,可以的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1021393

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX