Fórum Root.cz

Hlavní témata => Server => Téma založeno: darebacik 19. 04. 2021, 14:36:35

Název: Nginx: rozdělení serverů do samostatných souborů
Přispěvatel: darebacik 19. 04. 2021, 14:36:35
pri sprave konfiguracneho suboru na reverznom proxy nginx pouzivam pre backendy jeden config napr.
Kód: [Vybrat]
/etc/nginx/sites-available/000-default
tam zapisujem config pre viac backendov. Zda sa mi to dost neprehladne, ked je tam uz vela serverovych blokov a za dalsie ked tam certbot prida dalsie directivy tak to este viac zneprehliadni (ano da sa v tom vyznat, ale ...)
Nie je lepsie kazdy backend oddelit do vlastneho configu a potom vsetko nalinkovat do
Kód: [Vybrat]
/etc/nginx/sites-enabled/xxJe to vobec mozne ?
Pre apache virtualhost som to tak pouzival (nie na reverznom proxy, ale na klasickom web servery), ze som mal kazdy vhost vo vlastnom subore
Název: Re:nginx server block
Přispěvatel: Miroslav Šilhavý 19. 04. 2021, 14:39:44
Ano, tak by se to mělo dělat.
Do 000-default bych dal fallback pro virtualhosty, které nebudou vyjmenované (typicky return 403)
Název: Re:Nginx: rozdělení serverů do samostatných souborů
Přispěvatel: Petr Krčmář 19. 04. 2021, 14:51:34
V hlavním konfiguračním souboru /etc/nginx/nginx.conf bývá obvykle řádek:

Kód: [Vybrat]
include /etc/nginx/sites-enabled/*;
Ten zajistí načtení všech souborů v tom adresáři jednoduše za sebe. Při startu se to pak chová tak, jako by byly všechny řádky v jednom společném souboru. Je to přehlednější a doporučovaná varianta.

Pokud chcete vidět celou sloučenou konfiguraci, jak ji vidí a prochází Nginx, tak stačí zavolat:

Kód: [Vybrat]
# nginx -T
Název: Re:nginx server block
Přispěvatel: darebacik 19. 04. 2021, 15:49:37
Ano, tak by se to mělo dělat.
Do 000-default bych dal fallback pro virtualhosty, které nebudou vyjmenované (typicky return 403)
Ak klient zada platne domenove meno, ktore smeruje na IP adresu servera, tak sa mu zobrazi konkretny web.
000-default by som chcel len kvoli tomu, ked klient zada IP adresu, tak aby mu nenabehol prvy web z config suboru (aspon sa domnievam, ze nginx cita config od zaciatku :-D prip. ak je kazdy config vo vlastnom subore, tak subory berie podla abecedy (cize 000-default cita najprv)).
V 000-default by som nechal kludne ten defaultny index.html nginxu, alebo by som nechal prazdny html subor.
Myslel si to tak ?

V hlavním konfiguračním souboru /etc/nginx/nginx.conf bývá obvykle řádek:

Kód: [Vybrat]
include /etc/nginx/sites-enabled/*;
Ten zajistí načtení všech souborů v tom adresáři jednoduše za sebe. Při startu se to pak chová tak, jako by byly všechny řádky v jednom společném souboru. Je to přehlednější a doporučovaná varianta.

Pokud chcete vidět celou sloučenou konfiguraci, jak ji vidí a prochází Nginx, tak stačí zavolat:

Kód: [Vybrat]
# nginx -T
dik za vysvetlenie

Název: Re:nginx server block
Přispěvatel: Miroslav Šilhavý 19. 04. 2021, 15:54:28
Ano, tak by se to mělo dělat.
Do 000-default bych dal fallback pro virtualhosty, které nebudou vyjmenované (typicky return 403)
Ak klient zada platne domenove meno, ktore smeruje na IP adresu servera, tak sa mu zobrazi konkretny web.
000-default by som chcel len kvoli tomu, ked klient zada IP adresu, tak aby mu nenabehol prvy web z config suboru (aspon sa domnievam, ze nginx cita config od zaciatku :-D prip. ak je kazdy config vo vlastnom subore, tak subory berie podla abecedy (cize 000-default cita najprv)).
V 000-default by som nechal kludne ten defaultny index.html nginxu, alebo by som nechal prazdny html subor.
Myslel si to tak ?

Ano, myslel. Jen s tím, že bych tam nedával index.html, ale return 403.
Nebere to v pořadí, ale ten virutalhost, u kterého je v listen direktivě uvedeno default_server.
Přesto bych se držel konvence, když už ji distribuce určila, a držel bych to v 000-default.

Když to dobře navrhnete, tak pořadí souborů nehraje roli. Musíte si dát pozor na direktivy, které nejsou jen pro daného virtualhosta, ale jsou společné (např. nějaké mapy, cache diry apod.) - ty bych dával buďto do 000-default, nebo třeba do 010-basic-definitions nebo tak něco.
Název: Re:Nginx: rozdělení serverů do samostatných souborů
Přispěvatel: darebacik 26. 04. 2021, 11:33:54
este mam tazocku, ci by islo nejak vyriesit.
Za reverznym proxy mam web (Wordpress).  V administracii WP pri povolovani, alebo zakazovani komentarov je vzdy uvedena IP adresa reverzneho proxy a nie skutocneho autora (resp. odkial bola sprava odoslana).
Je mozne to nejak nastavit aby  proxy tieto spravy nemenil ?
Název: Re:Nginx: rozdělení serverů do samostatných souborů
Přispěvatel: Miroslav Šilhavý 26. 04. 2021, 11:45:19
Buďto to musí podporovat Wordpress (ale co já vím tak ani v roce 2021 na to není WP připravený - jako kdyby WP autoři nikdy nepotkali proxy). Obejít se to dá pomocí modulů (nevím, na čem Vám běž WP, jestli na nginxu nebo Apachi):

http://nginx.org/en/docs/http/ngx_http_realip_module.html
https://httpd.apache.org/docs/2.4/mod/mod_remoteip.html

Tím se dá zajistit, že webserver převezme (a dál předává) IP adresu, kterou proxy předává v hlavičkách.
Ale opatrně s tím, abyste s jistotou přebíral IP adresu z důvěryhodné hlavičky. Kdyby se někomu podařilo touto cestou podstrčit IP adresu, mohl by to být bezpečnostní risk.
Název: Re:Nginx: rozdělení serverů do samostatných souborů
Přispěvatel: Filip Jirsák 26. 04. 2021, 12:19:37
este mam tazocku, ci by islo nejak vyriesit.
Za reverznym proxy mam web (Wordpress).  V administracii WP pri povolovani, alebo zakazovani komentarov je vzdy uvedena IP adresa reverzneho proxy a nie skutocneho autora (resp. odkial bola sprava odoslana).
Je mozne to nejak nastavit aby  proxy tieto spravy nemenil ?
Proxy server to nemůže neměnit. Jedná se o IP adresu TCP/IP spojení, ta nemůže být nastavená jak vás napadne – musí být nastavená tak, aby proxy server mohl s WordPressem komunikovat.

Co jde ale udělat je to, že proxy server přidá původní IP adresu do HTTP hlaviček, WordPress si ji pak odsud umí vyzvednout.

Do konfigurace reverzní proxy přidáte následující řádky:
Kód: [Vybrat]
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;

Buďto to musí podporovat Wordpress (ale co já vím tak ani v roce 2021 na to není WP připravený - jako kdyby WP autoři nikdy nepotkali proxy).
Ne buďto a nebo. Proxy server musí původní IP adresu přidat do HTTP hlaviček, WordPress si ji odsud musí vyzvednout. A vyzvedává si ji.
Název: Re:Nginx: rozdělení serverů do samostatných souborů
Přispěvatel: darebacik 26. 04. 2021, 12:24:35
Tak medzi tym som nasiel funkcne riesenie (https://wordpress.org/support/topic/wordpress-behind-reverse-proxy/#post-847109), ale mohol by som to skusit aj s nastavenim tych hlavyciek.
zatial dik
Název: Re:Nginx: rozdělení serverů do samostatných souborů
Přispěvatel: Miroslav Šilhavý 26. 04. 2021, 12:26:30
Proxy server to nemůže neměnit. Jedná se o IP adresu TCP/IP spojení, ta nemůže být nastavená jak vás napadne – musí být nastavená tak, aby proxy server mohl s WordPressem komunikovat.

To je pravda, ale jen z půlky. RealIP modul ji umí zase vrátit zpátky, takže aplikace pod proxy serverem si toho nemusí ani všimnout. Je to operace navíc, ale s WordPressem se stejně na výkon nehraje.

Buďto to musí podporovat Wordpress (ale co já vím tak ani v roce 2021 na to není WP připravený - jako kdyby WP autoři nikdy nepotkali proxy).
Ne buďto a nebo. Proxy server musí původní IP adresu přidat do HTTP hlaviček, WordPress si ji odsud musí vyzvednout. A vyzvedává si ji.

Jo, už jsem si s tím párkrát užil, jak spolehlivě to vyzvedává. Jednodušší mi přijde, na takový krám, použít ten RealIP modul, ušetří to ve výsledku starosti.

Tak medzi tym som nasiel funkcne riesenie (https://wordpress.org/support/topic/wordpress-behind-reverse-proxy/#post-847109), ale mohol by som to skusit aj s nastavenim tych hlavyciek.
zatial dik

Tohle bych považoval za nejméně vhodné řešení, protože nevíte, jestli to bude fungovat napříč celým WordPressem a jeho moduly. Navíc, budete to muset nosit v hlavě, a pohlídat při každém větším updatu (když se mění wp-config), abyste to přenesl.
Název: Re:Nginx: rozdělení serverů do samostatných souborů
Přispěvatel: Filip Jirsák 26. 04. 2021, 13:40:55
Tak medzi tym som nasiel funkcne riesenie (https://wordpress.org/support/topic/wordpress-behind-reverse-proxy/#post-847109), ale mohol by som to skusit aj s nastavenim tych hlavyciek.
zatial dik
I odkázané řešení je ovšem závislé na tom, že jsou ty hlavičky správně nastavené.

To je pravda, ale jen z půlky. RealIP modul ji umí zase vrátit zpátky, takže aplikace pod proxy serverem si toho nemusí ani všimnout.
Jo, nastaví jako odchozí IP adresu takovou adresu, která vůbec nepatří danému počítači a je odněkud z tramtárie. Pak odešle paket navazující TCP/IP spojení a bude se strašně divit, že nikdy nedostane odpověď (protože ta přijde tomu zařízení, které tu IP adresu doopravdy má).

Jo, už jsem si s tím párkrát užil, jak spolehlivě to vyzvedává.
Pokud to nějaký plugin vyzvedává špatně, je to chyba toho pluginu.

Jednodušší mi přijde, na takový krám, použít ten RealIP modul, ušetří to ve výsledku starosti.
Pokud věříte na zázraky, že se vám paket vrátí, i když mu nastavíte úpně jinou adresu…
Název: Re:Nginx: rozdělení serverů do samostatných souborů
Přispěvatel: darebacik 29. 04. 2021, 17:09:06
este mam tazocku, ci by islo nejak vyriesit.
Za reverznym proxy mam web (Wordpress).  V administracii WP pri povolovani, alebo zakazovani komentarov je vzdy uvedena IP adresa reverzneho proxy a nie skutocneho autora (resp. odkial bola sprava odoslana).
Je mozne to nejak nastavit aby  proxy tieto spravy nemenil ?
Proxy server to nemůže neměnit. Jedná se o IP adresu TCP/IP spojení, ta nemůže být nastavená jak vás napadne – musí být nastavená tak, aby proxy server mohl s WordPressem komunikovat.

Co jde ale udělat je to, že proxy server přidá původní IP adresu do HTTP hlaviček, WordPress si ji pak odsud umí vyzvednout.

Do konfigurace reverzní proxy přidáte následující řádky:
Kód: [Vybrat]
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;

Buďto to musí podporovat Wordpress (ale co já vím tak ani v roce 2021 na to není WP připravený - jako kdyby WP autoři nikdy nepotkali proxy).
Ne buďto a nebo. Proxy server musí původní IP adresu přidat do HTTP hlaviček, WordPress si ji odsud musí vyzvednout. A vyzvedává si ji.
Co sa tyka nastavenie hlaviciek, tak tam mam teraz toto
Kód: [Vybrat]
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
Teraz som tam pridal, resp. vymenil toto
Kód: [Vybrat]
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;za toto
Kód: [Vybrat]
proxy_set_header X-Forwarded-For $remote_addr;ale stale to vrati IP adresu reverzneho proxy.
nginx dokumentacia sa mi dost zle cita, velmi tomu nerozumiem.
Zatial idem s tymto kodom v configu a toto funguje dobre
Kód: [Vybrat]
if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
        $list = explode(',',$_SERVER['HTTP_X_FORWARDED_FOR']);
        $_SERVER['REMOTE_ADDR'] = $list[0];
  }
Název: Re:Nginx: rozdělení serverů do samostatných souborů
Přispěvatel: Miroslav Šilhavý 29. 04. 2021, 17:26:50
Nechte si poradit.
Neměňte nic ve wordpressu.
Hlavičky máte nastavené správně, já bych jich přidal ještě víc, ale to už je jen detail.

A IP adresu řešte přes RealIP modul. S Wordpressem to funguje a používá se to na různých ISP panelech, právě proto, aby uživatel hostingu nemusel vědět a řešit, že je skrytý za reverzní proxy.

Wordpress není na proxy připravený a i když to vyřešíte tou metodou, co jste psal (a obdobnou radil i Filip), tak narazíte na problémy v doplňcích. Když použijete RealIP, na bude to fungovat hned.

Jediné, co je potřeba u RealIP pohlídat je to, aby to zpracovávalo hlavičky jen z důvěryhodné proxy, protože jinak by tam šlo podvrhnout IP adresu.
Název: Re:Nginx: rozdělení serverů do samostatných souborů
Přispěvatel: Filip Jirsák 29. 04. 2021, 19:55:03
Jediné, co je potřeba u RealIP pohlídat je to, aby to zpracovávalo hlavičky jen z důvěryhodné proxy, protože jinak by tam šlo podvrhnout IP adresu.
Nabíme se o nastavení nginxu, který funguje jako proxy server. Ten před sebou žádný jiný proxy server nemá, tudíž bere vždy IP adresu klienta. IP adresy v HTTP hlavičkách naopak musí mazat, protože pokud je taková hlavička přítomná v požadavku od klienta, je to pokus o podvrh.

Když použijete RealIP, na bude to fungovat hned.
RealIP se používá v případě, kdy nginx je cílový server, který má před sebou nějaký proxy server. Tady je situace opačná – nginx je proxy server, který předává požadavky dál do WordPressu.

Proxy server funguje tak, že klient (třeba prohlížeč) neváže TCP/IP spojení s proxy serverem. Proxy server přečte požadavek, naváže nové spojení s cílovým serverem ze své IP adresy (z jiné samozřejmě nemůže), pošle cílovému serveru požadavek klienta (případně nějak upravený) a do požadavku do speciálních hlaviček předá IP adresu původního klienta.

Když cílový server (v tomto případě WordPress na nějakém PHP) zjišťuje adresu klienta, musí se nejprve podívat, zda je tam nastavená příslušná hlavička, a teprve pokud není, použije adresu klienta z TCP/IP spojení. To, že se má používat IP adresa z HTTP hlaviček, je obvykle potřeb zapnout – jinak by klient mohl podvrhnout svou IP adresu tak, že by nastavil tu HTTP hlavičku. Proto se přebírání IP adresy z HTTP hlaviček zapíná jenom tam, kde jsem za proxy serverem a vím, že HTTP hlavičku mi bude nastavovat ten.
Název: Re:Nginx: rozdělení serverů do samostatných souborů
Přispěvatel: darebacik 10. 05. 2021, 20:38:48
Reverzny proxy je nginx a backend je apache 2.4.x
Cital som, ze v starsich apache 2.2.x sa pouzival mod_rpaf, ale v novsich je lepsie pouzit mod_remoteip.
Takze modul som povolil. vytvoril som /etc/apache2/mods-available/remoteip.conf, ktoreho obsahom je (a.b.c.d je IP reverzneho proxy)
Kód: [Vybrat]
RemoteIPHeader X-Real-IP
RemoteIPInternalProxy a.b.c.d
restart apache
Nefungovalo to. Ked som vsak tie 2 directivy pouzil v konfiguraku virtualhostu, tak teraz to funguje. Cize ked mam viac vhostov,  tak to musim dat do kazdeho. Asi mam nieco zle, kedze to nefunguje globalne.
Název: Re:Nginx: rozdělení serverů do samostatných souborů
Přispěvatel: czechsys 11. 05. 2021, 13:29:45
Reverzny proxy je nginx a backend je apache 2.4.x
Cital som, ze v starsich apache 2.2.x sa pouzival mod_rpaf, ale v novsich je lepsie pouzit mod_remoteip.
Takze modul som povolil. vytvoril som /etc/apache2/mods-available/remoteip.conf, ktoreho obsahom je (a.b.c.d je IP reverzneho proxy)
Kód: [Vybrat]
RemoteIPHeader X-Real-IP
RemoteIPInternalProxy a.b.c.d
restart apache
Nefungovalo to. Ked som vsak tie 2 directivy pouzil v konfiguraku virtualhostu, tak teraz to funguje. Cize ked mam viac vhostov,  tak to musim dat do kazdeho. Asi mam nieco zle, kedze to nefunguje globalne.

A mate ten remoteip i v mods-enabled?
Název: Re:Nginx: rozdělení serverů do samostatných souborů
Přispěvatel: darebacik 11. 05. 2021, 17:09:57
Ano je tam.
Ale ma tam byt symlink aj na conf, lebo ten tam nie je. A ked som tam symlink spravil, tak to tiez nefunguje

Kód: [Vybrat]
ln -s /etc/apache2/mods-available/remoteip.conf /etc/apache2/mods-enabled/remoteip.conf
Název: Re:Nginx: rozdělení serverů do samostatných souborů
Přispěvatel: asdf12345 12. 05. 2021, 20:19:38
Jediné, co je potřeba u RealIP pohlídat je to, aby to zpracovávalo hlavičky jen z důvěryhodné proxy, protože jinak by tam šlo podvrhnout IP adresu.
Nabíme se o nastavení nginxu, který funguje jako proxy server. Ten před sebou žádný jiný proxy server nemá, tudíž bere vždy IP adresu klienta. IP adresy v HTTP hlavičkách naopak musí mazat, protože pokud je taková hlavička přítomná v požadavku od klienta, je to pokus o podvrh.

Když použijete RealIP, na bude to fungovat hned.
RealIP se používá v případě, kdy nginx je cílový server, který má před sebou nějaký proxy server. Tady je situace opačná – nginx je proxy server, který předává požadavky dál do WordPressu.

Proxy server funguje tak, že klient (třeba prohlížeč) neváže TCP/IP spojení s proxy serverem. Proxy server přečte požadavek, naváže nové spojení s cílovým serverem ze své IP adresy (z jiné samozřejmě nemůže), pošle cílovému serveru požadavek klienta (případně nějak upravený) a do požadavku do speciálních hlaviček předá IP adresu původního klienta.

Když cílový server (v tomto případě WordPress na nějakém PHP) zjišťuje adresu klienta, musí se nejprve podívat, zda je tam nastavená příslušná hlavička, a teprve pokud není, použije adresu klienta z TCP/IP spojení. To, že se má používat IP adresa z HTTP hlaviček, je obvykle potřeb zapnout – jinak by klient mohl podvrhnout svou IP adresu tak, že by nastavil tu HTTP hlavičku. Proto se přebírání IP adresy z HTTP hlaviček zapíná jenom tam, kde jsem za proxy serverem a vím, že HTTP hlavičku mi bude nastavovat ten.
Asi to nebude OPov prípad, ale predpokladať že pred mojím proxy serverom nieje žiaden iný je chýba, stačí ak máš CDN a už to je reverse proxy pred tvojím, stačí že tam máš load balancer a už máš ďalší proxy server pred tvojím, to máš 3 proxy server v reťazi. Bez realIP a parsovanim z http forwarded for hlaviciek si neporadíš.