我有两个服务器:
Ex:当浏览器客户端向https://example.com/file?id=123
发出请求时,NGINX应将此请求代理到Golang服务器https://go.example.com/getpath?file_id=123
,它将把响应返回给NGINX:
{
data: {
filePath: "/static/..."
},
status: "ok"
}
然后NGINX应该从filePath获取值并从该位置返回文件。
所以问题是如何在NGINX中读取响应(获取filePath)?
看起来您想对数据进行api调用,以运行决策和逻辑。这不是代理的全部内容。
nginx的核心代理功能不是针对您要执行的操作而设计的。
可能的解决方法:扩展nginx ...
Nginx + PHP
您的php代码将完成此工作。充当客户端连接到Golang服务器,并将其他逻辑应用于响应。
<?php
$response = file_get_contents('https://go.example.com/getpath?file_id='.$_GET["id"]);
preg_match_all("/filePath: \"(.*?)\"/", $response, $filePath);
readfile($filePath[1][0]);
?>
location /getpath {
try_files /getpath.php;
}
这只是使它滚动的伪代码示例。
一些其他观察/评论:
Nginx + Lua
启用站点:
lua_package_path "/etc/nginx/conf.d/lib/?.lua;;";
server {
listen 80 default_server;
listen [::]:80 default_server;
location /getfile {
root /var/www/html;
resolver 8.8.8.8;
set $filepath "/index.html";
access_by_lua_file /etc/nginx/conf.d/getfile.lua;
try_files $filepath =404;
}
}
测试lua是否表现出预期的效果:
getfile.lua(v1)
ngx.var.filepath = "/static/...";
简化Golang响应主体,使其仅返回平淡的路径,然后使用它来设置文件路径:
getfile.lua(v2)
local http = require "resty.http"
local httpc = http.new()
local query_string = ngx.req.get_uri_args()
local res, err = httpc:request_uri('https://go.example.com/getpath?file_id=' .. query_string["id"], {
method = "GET",
keepalive_timeout = 60,
keepalive_pool = 10
})
if res and res.status == ngx.HTTP_OK then
body = string.gsub(res.body, '[\r\n%z]', '')
ngx.var.filepath = body;
ngx.log(ngx.ERR, "[" .. body .. "]");
else
ngx.log(ngx.ERR, "missing response");
ngx.exit(504);
end
mkdir -p /etc/nginx/conf.d/lib/resty
wget "https://raw.githubusercontent.com/ledgetech/lua-resty-http/master/lib/resty/http_headers.lua" -P /etc/nginx/conf.d/lib/resty
wget "https://raw.githubusercontent.com/ledgetech/lua-resty-http/master/lib/resty/http.lua" -P /etc/nginx/conf.d/lib/resty