HTTP reverse proxy s dynamickou URL

HTTP reverse proxy s dynamickou URL
« kdy: 27. 09. 2022, 12:45:34 »
Ahoj,

mam sluzbu, ktera vystavuje historicke hodnoty ve formatu
http://apiserver.org/api/1664269800/value, kde hodnota "1664269800" je UTC UNIX timestamp zaokrouhleny na desitky minut. Takze timestamp pro cas 9:30, 9:40 atd.
Musim tam dat zaokrouhleny timestamp, jinak to sluzba nepozere.

Mam jiny, klientsky system, kam muzu zada pouze staticke URL, neco ve stylu http://apiserver.org/api/<latest>/value a potrebuju mechanismus, ktery tuto statickou URL prelozi na URL s timestampem, kde timestamp bude actual timestamp orezany na desetiminutovky.

Neco ve stylu nginx direktivy:
Kód: [Vybrat]
location /proxyredir/ {
  proxy_pass http://apiserver.org/api/1664269800/kpivalue/;
}
, kde ale potrebuju timestamp vyrabet dynamicky podle aktualniho casu.

Pokousel jsem se o nastavani nginx proxy s perl modulem,  ale dokumentace je mizerna a nevim, jestli je vubec mozno tento pristup pouzit dohromady s proxy_pass.

Nejake napady, nez zacnu prasit jednoucelove python udelatko?
« Poslední změna: 27. 09. 2022, 13:17:56 od Petr Krčmář »


Re:HTTP reverse proxy s dynamickou URL
« Odpověď #1 kdy: 27. 09. 2022, 13:51:34 »
Pokud ten klientský systém umí správně reagovat na redirect, asi bude o fous jednodušší implementovat přesměrování než proxy. Pokoušet se to řešit statickou konfigurací nějaké proxy mi připadá zbytečné – bude to hack, na kterém spálíte spoustu času, a až pak přijde trochu jiný požadavek, bude to k ničemu. Proto bych šel cestou naskriptování přesměrování nebo v horším případě proxy, což napíšete v libovolném jazyce, který umíte – a až pak zjistíte, že tam potřebujete ještě doplnit nějakou hlavičku nebo přepočítávat časovou zónu, bude to maličkost.

Pokud byste opravdu chtěl jít cestou statické konfigurace, většinou je možnost používání nějakých proměnných, většinou s pomocí nich máte přístup k požadavku, kde bývá timestamp požadavku. Většinou ale skončíte na tom převedení do unixtimestamp a zaokrouhlení.

Re:HTTP reverse proxy s dynamickou URL
« Odpověď #2 kdy: 27. 09. 2022, 15:07:44 »
Udelatku jsem se prave chtel vyhnout, asi ale teda modifikuju toto:
https://github.com/MollardMichael/python-reverse-proxy/blob/master/proxy.py

Napada este nekoho neco genialniho?

Re:HTTP reverse proxy s dynamickou URL
« Odpověď #3 kdy: 27. 09. 2022, 15:56:07 »
Zkuste se podívat na proxy, které se používají v cloudovém prostředí. Envoy je možné skriptovat pomocí Lua, tím by to mohlo jít.

A nebo když se to mění jen jednou za 10 minut a nebude vás to urážet, prostě cronem každých 10 minut změňte konfiguraci. Třeba Caddy má konfiguraci třeba v JSONu, konfigurace se mění HTTP requestem, takže tam stačí jednou za deset minut poslat PATCH, který změní tu jednu adresu. Tu změnu půjde naskriptovat i v bashi.

Re:HTTP reverse proxy s dynamickou URL
« Odpověď #4 kdy: 27. 09. 2022, 17:19:12 »
Vaše spása se jmenuje buď openresty (nginx+lua) a nebo nginx javascript module

 :)

https://www.nginx.com/blog/harnessing-power-convenience-of-javascript-for-each-request-with-nginx-javascript-module

https://openresty.org

Mame to v produkci na ne uplne trivialnich casech a plna spokojenost.


Re:HTTP reverse proxy s dynamickou URL
« Odpověď #5 kdy: 27. 09. 2022, 17:41:15 »
jj, lua module a potom nieco ako:
Kód: [Vybrat]
location /proxyredir/ {
  set $target '';
  access_by_lua '
    ngx.var.target = 'apiserver.org/api/'..600*math.floor(os.time(os.date("!*t"))/600)..'/kpivalue'
  ';
  proxy_pass https://$target;
 }

Re:HTTP reverse proxy s dynamickou URL
« Odpověď #6 kdy: 28. 09. 2022, 17:04:14 »
hm, ani si nikto nevsimol ze tam zamenil apostrofy za uvodzovky...
Kód: [Vybrat]
location /proxyredir/ {
  set $target '';
  access_by_lua '
    ngx.var.target = "apiserver.org/api/"..600*math.floor(os.time(os.date("!*t"))/600).."/kpivalue"
  ';
  proxy_pass https://$target;
 }

Re:HTTP reverse proxy s dynamickou URL
« Odpověď #7 kdy: 29. 09. 2022, 13:13:35 »
hm, ani si nikto nevsimol ze tam zamenil apostrofy za uvodzovky...
Kód: [Vybrat]
location /proxyredir/ {
  set $target '';
  access_by_lua '
    ngx.var.target = "apiserver.org/api/"..600*math.floor(os.time(os.date("!*t"))/600).."/kpivalue"
  ';
  proxy_pass https://$target;
 }

Super, diky moc.
Slo by neceho podobneho dosahnout i perl modulem?
Jde i o to, ze nginx perl modul je v RH8 normalne v @Appstream jako balik, mam v dotycnem korporatu dost problem dostat libovolny balik mimo zakladniho standardu.

Re:HTTP reverse proxy s dynamickou URL
« Odpověď #8 kdy: 29. 09. 2022, 13:42:33 »
Slo by neceho podobneho dosahnout i perl modulem?
Jde i o to, ze nginx perl modul je v RH8 normalne v @Appstream jako balik, mam v dotycnem korporatu dost problem dostat libovolny balik mimo zakladniho standardu.

Myslim ze po technickej stranke by to problem byt nemal. https://nginx.org/en/docs/http/ngx_http_perl_module.html direktiva perl_set. Proste by som na mieste povodneho access_by_lua pouzil perl_set.

Akurat ze ten modul je stale experimental.


Re:HTTP reverse proxy s dynamickou URL
« Odpověď #9 kdy: 30. 09. 2022, 11:39:25 »
Slo by neceho podobneho dosahnout i perl modulem?
Jde i o to, ze nginx perl modul je v RH8 normalne v @Appstream jako balik, mam v dotycnem korporatu dost problem dostat libovolny balik mimo zakladniho standardu.

Myslim ze po technickej stranke by to problem byt nemal. https://nginx.org/en/docs/http/ngx_http_perl_module.html direktiva perl_set. Proste by som na mieste povodneho access_by_lua pouzil perl_set.

Akurat ze ten modul je stale experimental.

Diky, funguje to.

Spek byl v tom, ze perl_set se musi definovat na toplevel "http" urovni ale takto vznikla promenna se reevaluuje na urovni location pro kazdy request.

Kód: [Vybrat]
perl_set $tstamptrunc '
                sub {
                        my $r = shift;
                        # UNIX TIMESTAMP trucated to 10minutes
                        $epoch_10m_trunc = int(time()/600)*600;
                        return "$epoch_10m_trunc";
                }
        ';

potom v location uz jenom proxypass http://server/blabla/$tstamptrunc/value

Jo a este v location se musi nastavit resolver pro resolv toho proxovaneho stroje, jinak to nejede a defaultni resolver se nepouzije.

dzavy

Re:HTTP reverse proxy s dynamickou URL
« Odpověď #10 kdy: 30. 09. 2022, 15:39:20 »
Nezkousel jsem, ale haproxy by to mohlo zvladnout - https://cbonte.github.io/haproxy-dconv/1.7/configuration.html#7.3.2-date