Co je reverzní proxy? Jaké jsou jeho výhody?
Co je reverzní proxy? Reverzní proxy je druh serveru, který je umístěn v přední části mnoha dalších serverů a předává požadavky klientů na příslušné servery. Odpověď ze serveru je poté také přijata a předána proxy serverem klientovi.
![](https://m.unixlinux.online/article/uploadfiles/202205/2022050918481682.png)
Proč byste použili takové nastavení? Existuje pro to několik dobrých důvodů. Toto nastavení lze použít k nastavení nástroje pro vyrovnávání zatížení, ukládání do mezipaměti nebo k ochraně před útoky.
Nebudu zde zacházet do podrobností. Místo toho vám ukážu, jak můžete využít koncept reverzního proxy k nastavení více služeb na stejném serveru.
Vezměte stejný obrázek jako ten, který jste viděli výše. Co můžete udělat, je spustit server Ngnix v kontejneru dockeru v režimu reverzního proxy. Další webové služby lze také provozovat ve vlastních příslušných kontejnerech.
Kontejner Nginx bude nakonfigurován tak, aby věděl, která webová služba běží v kterém kontejneru.
![](https://m.unixlinux.online/article/uploadfiles/202205/2022050918481797.png)
Je to dobrý způsob, jak ušetřit náklady na hostování každé služby na jiném serveru. Díky reverznímu proxy serveru můžete mít na jednom linuxovém serveru spuštěno více služeb.
Nastavení Nginx jako reverzního proxy pro nasazení více služeb na stejný server pomocí Dockeru
Dovolte mi, abych vám ukázal, jak postupovat při konfiguraci výše uvedeného nastavení.
Pomocí těchto kroků můžete nainstalovat více kontejnerů webových aplikací spuštěných pod Nginx, přičemž každý samostatný kontejner odpovídá jeho vlastní příslušné doméně nebo subdoméně.
Nejprve se podívejme, co potřebujete, abyste mohli postupovat podle tohoto návodu.
Předpoklady
Abyste mohli snadno začít s tímto návodem, budete potřebovat následující znalosti. I tak se bez nich obejdete.
- Systém/server Linux. Pomocí cloudové služby Linode můžete snadno nasadit server Linux během několika minut.
- Znalost příkazů a terminálu systému Linux.
- Základní znalost Dockeru.
- Měli byste mít na svém linuxovém serveru nainstalovány Docker a Docker Compose. Přečtěte si prosím našeho průvodce instalací Docker a Docker Compose na CentOS.
- Měli byste také vlastnit doménu (abyste mohli nastavit služby na subdoménách).
Použil jsem domain.com jako příklad názvu domény v tutoriálu. Ujistěte se, že jste jej změnili podle svých vlastních domén nebo subdomén.
Kromě výše uvedeného se prosím také ujistěte o následujících věcech:
Změňte záznamy DNS vaší domény
Na panelu záznamů A/AAAA nebo CNAME vašeho poskytovatele názvu domény se ujistěte, že doména i subdomény (včetně www) směřují na IP adresu vašeho serveru.
Toto je příklad pro vaši referenci:
Název hostitele | IP adresa | TTL |
---|---|---|
domena.com | 172.105.50.178 | Výchozí |
* | 172.105.50.178 | Výchozí |
sub0.domena.com | 172.105.50.178 | Výchozí |
sub1.domena.com | 172.105.50.178 | Výchozí |
Vyměnit místo
Abyste se ujistili, že všechny vaše kontejnerové aplikace jsou v pohodě a po jejich nasazení vám nikdy nedojde paměť, musíte mít v systému potřebný odkládací prostor.
Vždy můžete upravit swap podle dostupné paměti RAM ve vašem systému. Odkládací prostor můžete rozhodnout na základě balíčku kontejnerů aplikací na jediném serveru a odhadu jejich kumulativního využití paměti RAM.
Krok 1:Nastavení reverzního proxy kontejneru Nginx
Začněte s nastavením reverzního proxy serveru nginx. Vytvořte adresář s názvem "reverse-proxy" a přepněte se do něj:
mkdir reverse-proxy && cd reverse-proxy
Vytvořte soubor s názvem docker-compose.yml
, otevřete jej ve svém oblíbeném textovém editoru založeném na terminálu, jako je Vim nebo Nano.
Pro reverzní proxy nginx budu používat obrázek jwilder/nginx-proxy. Zkopírujte a vložte následující do souboru docker-compose.yml:
version: "3.7"
services:
reverse-proxy:
image: "jwilder/nginx-proxy:latest"
container_name: "reverse-proxy"
volumes:
- "html:/usr/share/nginx/html"
- "dhparam:/etc/nginx/dhparam"
- "vhost:/etc/nginx/vhost.d"
- "certs:/etc/nginx/certs"
- "/run/docker.sock:/tmp/docker.sock:ro"
restart: "always"
networks:
- "net"
ports:
- "80:80"
- "443:443"
Nyní si projdeme důležité části souboru pro vytvoření:
- Deklarovali jste čtyři svazky, html, dhparam, vhost a certs. Jsou to trvalá data, která byste si určitě chtěli ponechat i poté, co byl kontejner mimo provoz.
html
&vhost
svazky budou velmi důležité v příštím nasazení kontejneru Let's Encrypt. Jsou navrženy tak, aby spolupracovaly. - Docker Socker je v kontejneru namontován pouze pro čtení. Ten je nezbytný pro reverzní proxy kontejner ke generování konfiguračních souborů nginx a detekci dalších kontejnerů se specifickou proměnnou prostředí.
- Zásady restartování Dockeru jsou nastaveny na
always
. Mezi další možnosti patříon-failure
aunless-stopped
. V tomto případě se to vždy zdálo vhodnější. - Porty 80 a 443 jsou svázány s hostitelem pro http a https.
- Nakonec používá jinou síť, nikoli výchozí síť mostu.
Používání sítě definované uživatelem je velmi důležité. To pomůže izolovat všechny kontejnery, které mají být proxy, spolu s povolením reverzního proxy kontejneru přeposílat klienty do jejich požadovaných/zamýšlených kontejnerů a také umožnit kontejnerům komunikovat mezi sebou (což není možné s výchozí sítí mostu pokudicc
je nastaveno natrue
pro démona).
Mějte na paměti, že YML je velmi náročný na tabulátory a odsazení.
Krok 2:Nastavení kontejneru pro automatické generování certifikátu SSL
K tomu můžete použít obrázek kontejneru jrcs/letsencrypt-nginx-proxy-companion.
Na stejném docker-compose.yml
soubor, který jste použili dříve, přidejte následující řádky:
letsencrypt:
image: "jrcs/letsencrypt-nginx-proxy-companion:latest"
container_name: "letsencrypt-helper"
volumes:
- "html:/usr/share/nginx/html"
- "dhparam:/etc/nginx/dhparam"
- "vhost:/etc/nginx/vhost.d"
- "certs:/etc/nginx/certs"
- "/run/docker.sock:/var/run/docker.sock:ro"
environment:
NGINX_PROXY_CONTAINER: "reverse-proxy"
DEFAULT_EMAIL: "[email protected]"
restart: "always"
depends_on:
- "reverse-proxy"
networks:
- "net"
V této definici služby:
- Používáte přesně stejné objemy, jaké jste použili pro kontejner reverzního proxy.
html
avhost
sdílení svazků je nezbytné, aby byla výzva ACME pro letsencrypt úspěšná. Tento kontejner vygeneruje certifikáty v/etc/nginx/certs
, v kontejneru. To je důvod, proč sdílíte tento svazek se svým reverzním proxy kontejnerem.dhparam
svazek bude obsahovat soubor dhparam. Zásuvka je připojena k detekci dalších kontejnerů se specifickou proměnnou prostředí. - Zde jste definovali dvě proměnné prostředí.
NGINX_PROXY_CONTAINER
proměnná ukazuje na reverzní proxy kontejner. Nastavte jej na název kontejneru.DEFAULT_EMAIL
je e-mail, který bude použit při generování certifikátů pro každou doménu/subdoménu. depends_on
je nastavena tak, že tato služba nejprve čeká na spuštění reverzního proxy a teprve potom se spustí toto.- Tento kontejner konečně také sdílí stejnou síť. To je nezbytné pro komunikaci mezi dvěma kontejnery.
Krok 3:Dokončete soubor pro vytvoření dockeru
Po dokončení definic služeb vyplňte soubor docker-compose s následujícími řádky:
volumes:
certs:
html:
vhost:
dhparam:
networks:
net:
external: true
Síť net
je nastaven na externí, protože kontejnery proxy budou muset také používat tuto síť. A pokud opustíme síť, necháme se vytvořit pomocí docker-comspose
, název sítě bude záviset na aktuálním adresáři. Tím se vytvoří podivně pojmenovaná síť.
Kromě toho budou muset jiné kontejnery nastavit tuto síť tak, aby byla externí, jinak budou muset tyto složené soubory také sídlit ve stejném adresáři, z čehož žádný není ideální.
Síť proto vytvořte pomocí
docker network create net
Následuje celý obsah souboru docker-compose.yml
soubor.
version: "3.7"
services:
reverse-proxy:
image: "jwilder/nginx-proxy:latest"
container_name: "reverse-proxy"
volumes:
- "html:/usr/share/nginx/html"
- "dhparam:/etc/nginx/dhparam"
- "vhost:/etc/nginx/vhost.d"
- "certs:/etc/nginx/certs"
- "/run/docker.sock:/tmp/docker.sock:ro"
restart: "always"
networks:
- "net"
ports:
- "80:80"
- "443:443"
letsencrypt:
image: "jrcs/letsencrypt-nginx-proxy-companion:latest"
container_name: "letsencrypt-helper"
volumes:
- "html:/usr/share/nginx/html"
- "dhparam:/etc/nginx/dhparam"
- "vhost:/etc/nginx/vhost.d"
- "certs:/etc/nginx/certs"
- "/run/docker.sock:/var/run/docker.sock:ro"
environment:
NGINX_PROXY_CONTAINER: "reverse-proxy"
DEFAULT_EMAIL: "[email protected]"
restart: "always"
depends_on:
- "reverse-proxy"
networks:
- "net"
volumes:
certs:
html:
vhost:
dhparam:
networks:
net:
external: true
Nakonec můžete nasadit tyto dva kontejnery (Ngnix a Let's Encrypt) pomocí následujícího příkazu:
docker-compose up -d
Krok 4:Ověřte, že reverzní proxy Ngnix funguje
Kontejner, který bude sloužit frontendu, bude muset definovat dvě proměnné prostředí.
VIRTUAL_HOST
:pro generování reverzní konfigurace proxy
LETSENCRYPT_HOST
:pro generování potřebných certifikátů
Ujistěte se, že máte správné hodnoty pro tyto dvě proměnné. Můžete spustit nginx-dummy image s reverzním proxy takto:
docker run --rm --name nginx-dummy -e VIRTUAL_HOST=sub.domain.com -e LETSENCRYPT_HOST=sub.domain.com -e VIRTUAL_PORT=80 --network net -d nginx:latest
Pokud nyní přejdete na svou subdoménu použitou v předchozím příkazu, měli byste vidět zprávu ze serveru Ngnix.
![](https://m.unixlinux.online/article/uploadfiles/202205/2022050918481790.png)
Jakmile jej úspěšně otestujete, můžete zastavit běžící kontejner dockeru:
docker stop nginx-dummy
Reverzní proxy Ngnix můžete také zastavit, pokud jej nebudete používat:
docker-compose down
Krok 5:Spusťte další kontejnery služeb pomocí reverzního proxy
Proces nastavování dalších kontejnerů tak, aby mohly být proxy, je VELMI jednoduchý.
Za chvíli to ukážu se dvěma instancemi nasazení Nextcloud. Nejprve vám řeknu, co tady děláte.
Nevázat na žádný port
Kontejner může vynechat port, který obsluhuje frontend. Reverzní proxy kontejner to automaticky zjistí.
(VOLITELNÉ) Definovat VIRTUAL_PORT
Pokud kontejner reverzního proxy nezjistí port, můžete definovat jinou proměnnou prostředí s názvem VIRTUAL_PORT
s portem obsluhujícím frontend nebo jakoukoli službu, kterou chcete získat proxy, například "80" nebo "7765".
Nastavit Let's Encrypt e-mail specifický pro kontejner
DEFAULT_EMAIL
můžete přepsat proměnnou a nastavte konkrétní e-mailovou adresu pro doménu/certifikáty subdomény konkrétního kontejneru/webové služby nastavením e-mailového ID na proměnnou prostředí LETSENCRYPT_EMAIL
. Funguje to na základě jednotlivých kontejnerů.
Nyní, když znáte všechny tyto věci, dovolte mi ukázat vám příkaz, který nasazuje instanci Nextcloud, která bude připojena pomocí proxy kontejneru nginx a bude mít povoleno TLS (SSL/HTTPS).
Toto NENÍ IDEÁLNÍ nasazení. Následující příkaz se používá pouze pro demonstrativní účely.
docker run --name nextcloud --network net -e VIRTUAL_HOST="sub0.domain.com" -e LETSENCRYPT_HOST="sub0.domain.com" -d nextcloud:19.0.2
V příkladu jste použili stejnou síť jako reverzní proxy kontejnery, definovali jste dvě proměnné prostředí s příslušnými subdoménami (nastavte odpovídajícím způsobem tu vaši). Po několika minutách byste měli vidět Nextcloud spuštěný na sub0.domain.com. Pro ověření otevřete v prohlížeči.
Můžete nasadit další instanci Nextcloud, jako je tato, na jiné subdoméně, jako je následující:
docker run --name anothernextcloud --network net -e VIRTUAL_HOST="sub1.domain.com" -e LETSENCRYPT_HOST="sub1.domain.com" -d nextcloud:19.0.2
Nyní byste měli vidět jinou instanci Nextcloud běžící na jiné subdoméně na stejném serveru.
Pomocí této metody můžete nasadit různé webové aplikace na stejný server obsluhovaný pod různými subdoménami, což je docela praktické.
Sledovat
Nyní, když máte toto nastavení, můžete pokračovat a použít to ve skutečných nasazeních s následujícími příklady:
- Nainstalujte Matrix Synapse Homeserver pomocí Dockeru
- Nainstalujte více kontejnerů diskurzu na stejný server
Chcete-li více článků, jako je tento, přihlaste se k odběru našeho newsletteru nebo zvažte, zda se stát členem. V případě jakýchkoli dotazů se neváhejte vyjádřit níže.