2つのサーバーがあります。
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