web-dev-qa-db-ja.com

NGINXは、proxy_pass応答から本文を読み取ります

2つのサーバーがあります。

  1. NGINX(ファイルIDをファイルパスに交換します)
  2. Golang(ファイルIDを受け入れ、そのパスを返す)

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を取得する)方法ですか?

6
Klimbo

意思決定とロジックを実行するためのデータの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;
    }

これは、回転させるための疑似コードの例にすぎません。

その他の観察/コメント:

  • Golang応答が有効なjsonのように見えません。preg_match_allをjson_decodeで置き換えてください。
  • readfileは超効率的ではありません。 302レスポンスでクリエイティブになることを検討してください。

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

resty.http

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
1
vhoang