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.
Nastavit pracovní adresář pro všechny služby související s WordPress
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.