GNU/Linux >> Znalost Linux >  >> Linux

Použití Dockeru k nastavení reverzního proxy Nginx s automatickým generováním SSL

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.

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.

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 a unless-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 pokud icc je nastaveno na true 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 a vhost 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.

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.


Linux
  1. Jak nastavit reverzní proxy Nginx

  2. Reverzní proxy s Nginx:Průvodce nastavením krok za krokem

  3. Jak nastavit Nginx jako reverzní proxy na Ubuntu 20.04

  1. Jak nainstalovat Odoo 11 na Ubuntu 16.04 s Nginx jako reverzní proxy

  2. Jak nainstalovat Odoo 10 na Ubuntu 16.04 s Nginx jako reverzní proxy

  3. Reverzní proxy Nginx bez ukončení SSL

  1. Průvodce spuštěním reverzního proxy pro HTTP(S), SSH a MySQL/MariaDB pomocí NGINX

  2. Nastavit Nginx jako reverzní proxy na Ubuntu 20.04 – průvodce krok za krokem?

  3. Jak nastavit více SSL na jedné IP s Nginx