web-dev-qa-db-fra.com

Corps de lecture NGINX à partir de la réponse proxy_pass

J'ai deux serveurs:

  1. NGINX (il échange l'identifiant du fichier vers le chemin du fichier)
  2. Golang (il accepte l'identifiant du fichier et renvoie son chemin)

Ex: Lorsque le client du navigateur fait une demande à https://example.com/file?id=123, NGINX devrait proxy cette demande au serveur Golang https://go.example.com/getpath?file_id=123, qui renverra la réponse à NGINX:

{
  data: {
    filePath: "/static/..."
  },
  status: "ok"
}

Ensuite, NGINX devrait obtenir la valeur de filePath et renvoyer le fichier de l'emplacement.

La question est donc de savoir comment lire la réponse (obtenir filePath) dans NGINX?

6
Klimbo

Il semble que vous souhaitiez effectuer un appel API pour que les données exécutent la décision et la logique. Ce n'est pas tout à fait ça le mandataire.

La capacité proxy principale de nginx n'est pas conçue pour ce que vous cherchez à faire.

Solution possible: étendre nginx ...


Nginx + PHP

Votre code php ferait le travail de jambe.
Servir de client pour se connecter au serveur Golang et appliquer une logique supplémentaire à la réponse.

<?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;
    }

Ceci est juste l'exemple de pseudo-code pour le faire rouler.

Quelques observations/commentaires divers:

  • La réponse de Golang ne ressemble pas à un json valide, remplacez preg_match_all par json_decode si c'est le cas.
  • readfile n'est pas super efficace. Envisagez d'être créatif avec une réponse 302.

Nginx + Lua

compatible avec les sites:

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;
    }
}

Testez si lua se comporte comme prévu:

getfile.lua (v1)

  ngx.var.filepath = "/static/...";

Simplifiez le corps de réponse de Golang pour simplement retourner un chemin fade, puis utilisez-le pour définir le chemin de fichier:

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