Fórum Root.cz
Hlavní témata => Server => Téma založeno: Standa Blábol 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:
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 (https://nginx.org/en/docs/http/ngx_http_perl_module.html), 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?
-
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í.
-
Udelatku jsem se prave chtel vyhnout, asi ale teda modifikuju toto:
https://github.com/MollardMichael/python-reverse-proxy/blob/master/proxy.py (https://github.com/MollardMichael/python-reverse-proxy/blob/master/proxy.py)
Napada este nekoho neco genialniho?
-
Zkuste se podívat na proxy, které se používají v cloudovém prostředí. Envoy (https://www.envoyproxy.io) 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 (https://caddyserver.com) 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.
-
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.
-
jj, lua module a potom nieco ako:
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;
}
-
hm, ani si nikto nevsimol ze tam zamenil apostrofy za uvodzovky...
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;
}
-
hm, ani si nikto nevsimol ze tam zamenil apostrofy za uvodzovky...
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.
-
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.
-
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.
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.
-
Nezkousel jsem, ale haproxy by to mohlo zvladnout - https://cbonte.github.io/haproxy-dconv/1.7/configuration.html#7.3.2-date