GNU/Linux >> Znalost Linux >  >> Linux

Jak samostatně hostovat více webů WordPress na stejném serveru pomocí Dockeru

Instalace WordPressu není velký problém. Můžete jej nainstalovat pomocí serveru LAMP pro místní vývoj. Můžete jej také nasadit pro skutečný svět na správném veřejném linuxovém serveru.

Cloudové servery jako Linode, DigitalOcean atd. také poskytují možnost nasadit zcela nový linuxový server předem nakonfigurovaný pomocí WordPress. Ještě jednodušší, že?

Ale co když chcete nainstalovat více než jeden WordPress na jeden server?

Snadným způsobem by bylo použití služby, jako je ServerPilot. Nejen, že automaticky aktualizuje váš server, ale také vám umožní snadno nasadit více instancí WordPress na stejný server.

To by vás stálo trochu více peněz a pokud to nechcete, můžete použít Docker k nasazení více instancí WordPress.

Prostřednictvím této příručky se dozvíte, jak snadno nastavit duální nastavení WordPress běžící z jejich jednotlivých kontejnerů a přidat další instance!

Předpoklady

Není to povinné, ale návod pro vás bude mnohem snazší sledovat, pokud máte:

  • Znalost základních příkazů Linuxu
  • Některé znalosti Dockeru
  • Porozumění Docker Compose

Budete nasazovat WordPress za reverzní proxy kontejner s doménou a subdoménami s povoleným SSL.

Kromě výše uvedených aktuálních znalostí budete potřebovat následující požadavky na infrastrukturu:

  • Veřejně přístupný Server Ubuntu Linux . Můžete použít poskytovatele cloudových služeb, jako je Linode. Pro toto nasazení bude stačit Nano server s 1 GB RAM. Pokud ale plánujete vlastní hostování více instancí WordPress, zvažte jeho upgrade.
  • Přístup k vašim doménám/subdoménám a jejich nastavení DNS
  • Docker a Docker Compose nainstalované na vašem serveru Linux.

Pokud potřebujete pomoc, můžete postupovat podle našich průvodců na adrese:

  • Instalace Dockeru na Ubuntu
  • Instalace Docker Compose na Ubuntu
  • Reverzní nastavení proxy dockeru

Ve všech našich dalších výukových programech založených na samohostování webových aplikací s Dockerem jsem diskutoval o samostatném nasazení kontejnerů Nginx a kontejnerů webových aplikací. Tentokrát však použiji Docker Compose k nastavení více kontejnerů WordPress, všechny založené na jediném souboru yml.

Toto je také příklad, který vám ukáže, jak můžete integrovat konfiguraci Nginx s webovou aplikací, kterou zvažujete nasazení, prostřednictvím jediného souboru Docker Compose.

Budu používat domain.com jako příklad pro první blog WordPress a wordpress.domain.com jako druhý blog s vlastním hostitelem. Na závěr také popíšu, jak přidat další instance WordPress na základě konfigurace, kterou zde proberu.

Vytvořte adresář a aktivujte jej. Říkejme tomu multi-wordpress .

mkdir multi-wordpress

A poté se do tohoto nově vytvořeného adresáře přepněte pomocí příkazu cd:

cd multi-wordpress

Nastavit limit pro nahrávání souborů WordPress na 512 MB

V tomto adresáři budeme ukládat naše uploads.ini soubor, který má potřebnou konfiguraci nahrávání pro nahrávání souborů až do velikosti 512 MB. Na terminálu zadejte následující příkaz:

[email protected]:~/multi-wordpress$ printf "file_uploads = On\nmemory_limit = 512M\nupload_max_filesize = 512M\npost_max_size = 512M\nmax_execution_time = 600" > uploads.ini

Nastavit limit nahrávání souborů pro Nginx

Jako další opatření také vytvořte soubor s názvem client_max_upload_size.conf a uložte jej do stejného adresáře pro připojení do kontejneru Nginx. Kvůli tomu jsem to nastavil na 1 GB. To je užitečné pro budoucí konfiguraci dalších aplikací.

[email protected]:~/multi-wordpress$ printf "client_max_body_size 1G;" > client_max_upload_size.conf

Přesměrování WWW přes Nginx (aktualizace CNAME není vyžadována)

Pokud chcete pomocí WordPressu používat přesměrování bez www na www, můžete přesměrovač nastavit pomocí příkazu cat na vašem linuxovém serveru:

[email protected]:~/multi-wordpress$ cat >> domain.com
rewrite ^/(.*)$ https://www.domain.com/$1 permanent;

Stiskněte Enter a poté Ctrl+D pro uložení. Nepoužili jsme printf zde, protože $1 se neuloží do souboru, jak je uvedeno výše. To by mohlo v budoucnu vést k problémům s adresami URL, protože chceme, aby přesměrování fungovalo ve všech případech. Například domain.com/test by měl vždy přesměrovávat na www.domain.com/test .

přesměrování mimo WWW přes Nginx (aktualizace CNAME není vyžadována)

Pokud chcete použít přesměrování www na jiné než www, opakujte podobné kroky, abyste udělali opak:

[email protected]:~/multi-wordpress$ cat >> www.domain.com
rewrite ^/(.*)$ https://domain.com/$1 permanent;

Vytvořit externí síť Docker

Budu používat síť s názvem net pro tento tutoriál. Proto jej vytvořím pomocí následujícího příkazu:

docker network create net

Příprava jednoho souboru Docker Compose připraveného k nasazení

S následující konfigurací v rámci jednoho docker-compose.yml soubor, můžete vše nastavit najednou se všemi šesti kontejnery, které slouží vašemu účelu, počínaje reverzním proxy až po poslední kontejner WordPress. Podívejme se na ně službu po službě, než je nakonec všechny sloučíme do jednoho souboru:

Reverzní proxy kontejner Nginx

Připojte oba soubory client_max_upload_size.conf a www.domain.com v režimu pouze pro čtení a zadejte síť net který byl vytvořen ručně.

  nginx-proxy:
    image: jwilder/nginx-proxy
    container_name: nginx-proxy
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - html:/usr/share/nginx/html
      - dhparam:/etc/nginx/dhparam
      - vhost:/etc/nginx/vhost.d
      - certs:/etc/nginx/certs:ro
      - /var/run/docker.sock:/tmp/docker.sock:ro
      - ./client_max_upload_size.conf:/etc/nginx/conf.d/client_max_upload_size.conf:ro
      - ./www.domain.com:/etc/nginx/vhost.d/www.domain.com:ro
    labels:
      - "com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy"
    restart: always
    networks:
      - net

Pojďme zašifrovat kontejner pro certifikáty SSL

Všimněte si, že používám rw pro certs objem, na rozdíl od ro v předchozí části. To je nezbytné pro vytvoření certifikátů SSL a odpovídající aktualizaci svazku při jejich generování. Také nastavte výchozí e-mail pro upozornění z Let's Encrypt a zadejte stejnou „net ” síť.

  letsencrypt:
    image: jrcs/letsencrypt-nginx-proxy-companion
    container_name: lets-encrypt-proxy-companion
    depends_on:
      - "nginx-proxy"
    volumes:
      - certs:/etc/nginx/certs:rw
      - vhost:/etc/nginx/vhost.d
      - html:/usr/share/nginx/html
      - /var/run/docker.sock:/var/run/docker.sock:ro
    environment:
      DEFAULT_EMAIL: [email protected]
    restart: always
    networks:
      - net

Databázový kontejner pro první web WordPress

Na základě oficiální konfigurace WordPress Docker Compose nastavte potřebné proměnné prostředí, jak je uvedeno níže, a určete interní síť (zobrazenou jako mysqldb0 zde se používá také pro název služby a název svazku).

Tato síť bude viditelná pouze pro databázový kontejner a jeho odpovídající kontejner WordPress. Když jej nasadíte, vytvoří se databáze MySQL s přihlašovacími údaji uvedenými pod:

  mysqldb0:
    image: mysql:5.7
    environment:
      MYSQL_DATABASE: db0
      MYSQL_USER: db0user
      MYSQL_PASSWORD: secret
      MYSQL_RANDOM_ROOT_PASSWORD: '1'
    volumes:
      - 'mysqldb0:/var/lib/mysql'
    restart: always
    networks:
      - mysqldb0

První kontejner WordPress

Když nasadíte kontejner WordPress, použije konfiguraci databáze specifikovanou v předchozí části výše. Všimněte si, že kromě stejné vnitřní sítě, kterou vidí databáze (mysqldb0 ), tato služba WordPress musí také vidět síť Nginx s názvem net protože je to frontendová aplikace pro vnější svět.

  wordpress0:
    image: wordpress:5.8.0-php8.0-apache
    environment:
      WORDPRESS_DB_HOST: mysqldb0
      WORDPRESS_DB_USER: db0user
      WORDPRESS_DB_PASSWORD: secret
      WORDPRESS_DB_NAME: db0
      WORDPRESS_CONFIG_EXTRA: |
        define('AUTOMATIC_UPDATER_DISABLED', true);
      VIRTUAL_HOST: domain.com,www.domain.com
      LETSENCRYPT_HOST: domain.com,www.domain.com
    volumes:
      - 'wordpress0:/var/www/html/wp-content'
      - './uploads.ini:/usr/local/etc/php/conf.d/uploads.ini'
    restart: always
    depends_on:
      - mysqldb0
    networks:
      - mysqldb0
      - net

V tomto okamžiku máte konfiguraci pro nastavení jedné instance WordPress. Chcete-li nastavit více, zopakujte kroky 3 a 4 s novými názvy.

Tady to je:

Databázový kontejner pro druhý web WordPress

  mysqldb1:
    image: mysql:5.7
    environment:
      MYSQL_DATABASE: db1
      MYSQL_USER: db1user
      MYSQL_PASSWORD: secret
      MYSQL_RANDOM_ROOT_PASSWORD: '1'
    volumes:
      - 'mysqldb1:/var/lib/mysql'
    restart: always
    networks:
      - mysqldb1

Druhý kontejner WordPress

  wordpress1:
    image: wordpress:5.8.0-php8.0-apache
    environment:
      WORDPRESS_DB_HOST: mysqldb1
      WORDPRESS_DB_USER: db1user
      WORDPRESS_DB_PASSWORD: secret
      WORDPRESS_DB_NAME: db1
      WORDPRESS_CONFIG_EXTRA: |
        define('AUTOMATIC_UPDATER_DISABLED', true);
      VIRTUAL_HOST: wordpress.domain.com
      LETSENCRYPT_HOST: wordpress.domain.com
    volumes:
      - 'wordpress1:/var/www/html/wp-content'
      - './uploads.ini:/usr/local/etc/php/conf.d/uploads.ini'
    restart: always
    depends_on:
      - mysqldb1
    networks:
      - mysqldb1
      - net

Pomocí svého oblíbeného editoru vytvořte docker-compose.yml soubor s veškerým obsahem diskutovaným do tohoto bodu (další parametry jsou uvedeny níže). Podle toho byste museli upravit názvy domén a další údaje o pověření. Zde jsem použil Nano.

nano docker-compose.yml
version: '3.7'
services:
  nginx-proxy:
    image: jwilder/nginx-proxy
    container_name: nginx-proxy
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - html:/usr/share/nginx/html
      - dhparam:/etc/nginx/dhparam
      - vhost:/etc/nginx/vhost.d
      - certs:/etc/nginx/certs:ro
      - /var/run/docker.sock:/tmp/docker.sock:ro
      - ./client_max_upload_size.conf:/etc/nginx/conf.d/client_max_upload_size.conf
      - ./www.domain.com:/etc/nginx/vhost.d/www.domain.com
    labels:
      - "com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy"
    restart: always
    networks:
      - net

  letsencrypt:
    image: jrcs/letsencrypt-nginx-proxy-companion
    container_name: lets-encrypt-proxy-companion
    depends_on:
      - "nginx-proxy"
    volumes:
      - certs:/etc/nginx/certs:rw
      - vhost:/etc/nginx/vhost.d
      - html:/usr/share/nginx/html
      - /var/run/docker.sock:/var/run/docker.sock:ro
    environment:
      DEFAULT_EMAIL: [email protected]
    restart: always
    networks:
      - net

  mysqldb0:
    image: mysql:5.7
    environment:
      MYSQL_DATABASE: db0
      MYSQL_USER: db0user
      MYSQL_PASSWORD: secret
      MYSQL_RANDOM_ROOT_PASSWORD: '1'
    volumes:
      - 'mysqldb0:/var/lib/mysql'
    restart: always
    networks:
      - mysqldb0


  wordpress0:
    image: wordpress:5.8.0-php8.0-apache
    environment:
      WORDPRESS_DB_HOST: mysqldb0
      WORDPRESS_DB_USER: db0user
      WORDPRESS_DB_PASSWORD: secret
      WORDPRESS_DB_NAME: db0
      WORDPRESS_CONFIG_EXTRA: |
        define('AUTOMATIC_UPDATER_DISABLED', true);
      VIRTUAL_HOST: domain.com,www.domain.com
      LETSENCRYPT_HOST: domain.com,www.domain.com
    volumes:
      - 'wordpress0:/var/www/html/wp-content'
      - './uploads.ini:/usr/local/etc/php/conf.d/uploads.ini'
    restart: always
    depends_on:
      - mysqldb0
    networks:
      - mysqldb0
      - net

  mysqldb1:
    image: mysql:5.7
    environment:
      MYSQL_DATABASE: db1
      MYSQL_USER: db1user
      MYSQL_PASSWORD: secret
      MYSQL_RANDOM_ROOT_PASSWORD: '1'
    volumes:
      - 'mysqldb1:/var/lib/mysql'
    restart: always
    networks:
      - mysqldb1


  wordpress1:
    image: wordpress:5.8.0-php8.0-apache
    environment:
      WORDPRESS_DB_HOST: mariadb1
      WORDPRESS_DB_USER: db1user   
      WORDPRESS_DB_PASSWORD: secret
      WORDPRESS_DB_NAME: db1
      WORDPRESS_CONFIG_EXTRA: |
        define('AUTOMATIC_UPDATER_DISABLED', true);
      VIRTUAL_HOST: wordpress.linuxhindi.com
      LETSENCRYPT_HOST: wordpress.linuxhindi.com
    volumes:
      - 'wordpress1:/var/www/html/wp-content'
      - './uploads.ini:/usr/local/etc/php/conf.d/uploads.ini'
    restart: always
    depends_on:
      - mysqldb1
    networks:
      - mysqldb1
      - net

volumes:
  certs:
  html:
  vhost:
  dhparam:
  mysqldb0:
  wordpress0:
  mysqldb1:
  wordpress1:

networks:
  mysqldb0:
    internal: true
  mysqldb1:
    internal: true
  net:
    external: true

Všimněte si, že jsem přiřadil konkrétní interní sítě pouze pro každou databázi a její odpovídající kontejner WordPress. Databázové kontejnery nemusí vidět Nginx net síť. net je vyžadován pouze pro frontend kontejnery WordPress.

V našem předchozím článku o diskurzu jsem použil --volumes-from příznak pro použití nginx-proxy svazky kontejneru pomocí letsencrypt . Stejným způsobem byl ekvivalent pro stejný příznak volumes_from , odstraněný Dockerem již před nějakou dobou. Proto jsem výslovně určil společné svazky pro kontejnery Nginx a Let's Encrypt uvnitř docker-compose.yml soubor – jmenovitě certifikáty , html , vhost a /var/run/docker.sock .

Nyní nasaďte nastavení pomocí následujícího docker-compose příkaz ze stejného multi-wordpress adresář, který jsme vytvořili na začátku:

docker-compose up -d

Obdržíte následující potvrzení:

Creating network "multi-wordpress_mysqldb0" with the default driver
Creating network "multi-wordpress_mysqldb1" with the default driver
Creating volume "multi-wordpress_certs" with default driver
Creating volume "multi-wordpress_html" with default driver
Creating volume "multi-wordpress_vhost" with default driver
Creating volume "multi-wordpress_dhparam" with default driver
Creating volume "multi-wordpress_mysqldb0" with default driver
Creating volume "multi-wordpress_wordpress0" with default driver
Creating volume "multi-wordpress_mysqldb1" with default driver
Creating volume "multi-wordpress_wordpress1" with default driver
Creating multi-wordpress_mysqldb0_1   ... done
Creating nginx-proxy                  ... done
Creating multi-wordpress_mysqldb1_1 ... done
Creating multi-wordpress_wordpress1_1 ... done
Creating multi-wordpress_wordpress0_1 ... done
Creating lets-encrypt-proxy-companion ... done

První dvě jsou vnitřní sítě, následují objemy a nakonec kontejnery. Naše externí síť net již existuje, protože jsem jej vytvořil ručně na začátku tohoto tutoriálu.

Počkejte několik okamžiků. Otevřete internetový prohlížeč a zadejte www.domain.com . Dojde k přesměrování na domain.com a uvidíte, že na vás čeká průvodce nastavením WordPress:

Vyberte preferovaný jazyk, klikněte na Pokračovat a pokračujte s nárokováním administrace webu.

Pro wordpress.domain.com , dostanete stejný výsledek. Další weby WordPress můžete přidat opakováním kroků 5 (databázová služba) a 6 (služba WordPress) podle podobné syntaxe, jaká je zobrazena pro stávající kontejnery. Také prosím nezapomeňte revidovat volumes a networks odpovídajícím způsobem v sekci YAML.

Pro každý nový web by se vytvořil nový kontejner WordPress a jeho odpovídající databázový kontejner MySQL. Pokud chcete znát ekvivalenty příkazového řádku výše uvedeného souboru docker-compose.yml, můžete to prozkoumat zde.

Tipy pro údržbu instancí WordPress s vlastním hostitelem

Zde je několik tipů, které vám pomohou dlouhodobě udržovat vaše instance WordPress:

Sledování protokolů WordPress v reálném čase

Pokud chcete zkontrolovat protokoly kontejneru WordPress (řekněme první z nich popsaný v tomto tutoriálu), zatímco je nasazen v reálném čase, můžete spustit:

docker logs -f multi-wordpress_wordpress0_1

V případě, že chcete řešit problémy nebo se dozvědět, co se děje uvnitř každého dalšího relevantního kontejneru pro toto nasazení, může být efektivní používání protokolů Docker Logs zásadní:

Zálohování a obnovení svazků WordPress bez výpadků

Pomocí cloudu + místního přístupu můžete zálohovat a obnovovat své svazky WordPress bez prostojů.

Aktualizace kontejnerů WordPress bez výpadků

Pomocí --scale flag na Docker Compose, můžete vytvořit nový kontejner založený na nejnovější verzi WordPressu. Až bude hotovo, můžete starou odstranit. Výsledkem jsou nulové prostoje.

Doufám, že vám tento článek byl užitečný. Pokud máte nějaké nápady, zpětnou vazbu nebo návrh, o který se chcete podělit, dejte nám prosím vědět v komentářích níže.


Linux
  1. Jak nakonfigurovat více webových stránek s webovým serverem Apache

  2. Jak nasadit dynamický DNS server s Dockerem na Debianu 10

  3. Jak používat stejný alias Ssh s více hostitelskými adresami/porty/atd.?

  1. Jak nainstalovat WordPress s Dockerem na Ubuntu

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

  3. CentOS / RHEL 6:Jak vynutit synchronizaci NTP se servery NTP

  1. Jak spravovat kontejnery Docker pomocí Rancher na Ubuntu

  2. Jak přesměruji subdomény na jiný port na stejném serveru?

  3. více fyzických rozhraní s adresami IP ve stejné podsíti