Die Installation von WordPress ist keine große Sache. Sie können es mit dem LAMP-Server für die lokale Entwicklung installieren. Sie können es auch für die reale Welt auf einem geeigneten, öffentlich zugänglichen Linux-Server bereitstellen.
Cloud-Server wie Linode, DigitalOcean usw. bieten auch die Möglichkeit, einen brandneuen Linux-Server bereitzustellen, der mit WordPress vorkonfiguriert ist. Noch einfacher, oder?
Aber was ist, wenn Sie mehr als ein WordPress auf einem einzigen Server installieren möchten?
Eine einfache Möglichkeit wäre die Nutzung eines Dienstes wie ServerPilot. Es aktualisiert nicht nur Ihren Server automatisch, sondern ermöglicht Ihnen auch die einfache Bereitstellung mehrerer WordPress-Instanzen auf demselben Server.
Das würde Sie etwas mehr Geld kosten und wenn Sie das nicht möchten, können Sie Docker verwenden, um mehrere WordPress-Instanzen bereitzustellen.
In dieser Anleitung erfahren Sie, wie Sie ganz einfach ein duales WordPress-Setup einrichten, das von ihren einzelnen Containern ausgeführt wird, und weitere Instanzen hinzufügen!
Voraussetzungen
Es ist nicht obligatorisch, aber das Tutorial wird für Sie viel einfacher zu befolgen sein, wenn Sie Folgendes haben:
- Kenntnis grundlegender Linux-Befehle
- Einige Docker-Kenntnisse
- Verständnis von Docker Compose
Sie werden WordPress hinter einem Reverse-Proxy-Container mit einer SSL-fähigen Domain und Subdomains bereitstellen.
Abgesehen von den oben genannten aktuellen Kenntnissen benötigen Sie die folgenden Infrastrukturanforderungen:
- Ein öffentlich zugänglicher Ubuntu Linux-Server . Sie können einen Cloud-Dienstanbieter wie Linode verwenden. Für diese Bereitstellung ist ein Nano-Server mit 1 GB RAM ausreichend. Wenn Sie jedoch vorhaben, mehr WordPress-Instanzen selbst zu hosten, sollten Sie ein Upgrade in Betracht ziehen.
- Zugriff auf Ihre Domains/Subdomains und deren DNS-Einstellungen
- Docker und Docker Compose auf Ihrem Linux-Server installiert.
Wenn Sie Hilfe benötigen, können Sie unseren Leitfäden folgen unter:
- Installieren von Docker auf Ubuntu
- Installieren von Docker Compose auf Ubuntu
- Umgekehrte Proxy-Docker-Einrichtung
In all unseren anderen Tutorials, die auf selbsthostenden Webanwendungen mit Docker basieren, habe ich die separate Bereitstellung von Nginx-Containern und Web-App-Containern besprochen. Dieses Mal verwende ich jedoch Docker Compose, um mehrere WordPress-Container einzurichten, die alle auf einer einzigen yml-Datei basieren.
Dies ist also auch ein Beispiel, das Ihnen zeigt, wie Sie eine Nginx-Konfiguration mit einer Web-App, die Sie bereitstellen möchten, über eine einzige Docker-Compose-Datei integrieren können.
Ich verwende domain.com
als Beispiel für den ersten WordPress-Blog und wordpress.domain.com
als zweites selbst gehostetes Blog. Am Ende werde ich auch beschreiben, wie man weitere WordPress-Instanzen basierend auf der Konfiguration hinzufügt, die ich hier besprechen werde.
Erstellen Sie ein Arbeitsverzeichnis für alle WordPress-bezogenen Dienste
Erstellen Sie ein Verzeichnis und aktivieren Sie es. Nennen wir es multi-wordpress
.
mkdir multi-wordpress
Wechseln Sie dann mit dem cd-Befehl in dieses neu erstellte Verzeichnis:
cd multi-wordpress
Stellen Sie das Upload-Limit für WordPress-Dateien auf 512 MB ein
In diesem Verzeichnis speichern wir unsere uploads.ini
Datei, die über die erforderliche Upload-Konfiguration zum Hochladen von Dateien mit einer Größe von bis zu 512 MB verfügt. Geben Sie im Terminal folgenden Befehl ein:
[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
Legen Sie ein Datei-Upload-Limit für Nginx fest
Erstellen Sie als zusätzliche Maßnahme auch eine Datei namens client_max_upload_size.conf
und speichern Sie es im selben Verzeichnis, um es im Nginx-Container zu mounten. Aus Gründen der Sicherheit habe ich es auf 1 GB eingestellt. Dies ist hilfreich für die zukünftige Konfiguration anderer Apps.
[email protected]:~/multi-wordpress$ printf "client_max_body_size 1G;" > client_max_upload_size.conf
WWW-Umleitung durch Nginx (Aktualisierung von CNAME nicht erforderlich)
Wenn Sie mit WordPress eine Nicht-www-zu-www-Umleitung verwenden möchten, können Sie den Redirector mit dem cat-Befehl auf Ihrem Linux-Server einrichten:
[email protected]:~/multi-wordpress$ cat >> domain.com
rewrite ^/(.*)$ https://www.domain.com/$1 permanent;
Drücken Sie die Eingabetaste und dann Strg + D, um es zu speichern. Wir haben printf
nicht verwendet hier, weil $1
werden nicht wie oben gezeigt in der Datei gespeichert. Dies könnte zu zukünftigen Problemen mit URLs führen, da wir möchten, dass die Weiterleitung in allen Fällen funktioniert. Beispiel:domain.com/test
sollte immer auf www.domain.com/test
umgeleitet werden .
Nicht-WWW-Umleitung über Nginx (Aktualisierung von CNAME nicht erforderlich)
Wenn Sie die Umleitung von www zu nicht-www verwenden möchten, wiederholen Sie ähnliche Schritte, um das Gegenteil zu tun:
[email protected]:~/multi-wordpress$ cat >> www.domain.com
rewrite ^/(.*)$ https://domain.com/$1 permanent;
Erstellen Sie ein externes Docker-Netzwerk
Ich verwende ein Netzwerk namens net
für dieses Tutorial. Daher erstelle ich es mit folgendem Befehl:
docker network create net
Vorbereiten einer einzelnen Docker Compose-Datei bereit für die Bereitstellung
Mit der folgenden Konfiguration innerhalb einer einzigen docker-compose.yml
file kannst du mit allen sechs Containern alles auf einmal einrichten, was deinem Zweck dient, angefangen vom Reverse-Proxy bis zum letzten WordPress-Container. Betrachten wir sie Dienst für Dienst, bevor wir sie schließlich alle in einer einzigen Datei zusammenführen:
Nginx-Reverse-Proxy-Container
Mounten Sie beide Dateien client_max_upload_size.conf
und www.domain.com
im Nur-Lese-Modus und geben Sie das Netzwerk net
an die manuell erstellt wurde.
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
Let’s Encrypt Container for SSL Certificates
Beachten Sie, dass ich rw
verwende für die certs
Lautstärke, im Gegensatz zu ro
im vorherigen Abschnitt. Dies ist wichtig, um die SSL-Zertifikate zu erstellen und das Volume entsprechend zu aktualisieren, während sie generiert werden. Legen Sie außerdem die Standard-E-Mail für Benachrichtigungen von Let's Encrypt fest und geben Sie dasselbe „net
“ an ” Netzwerk.
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
Datenbankcontainer für die erste WordPress-Site
Legen Sie basierend auf der offiziellen Konfiguration von WordPress Docker Compose die erforderlichen Umgebungsvariablen wie unten gezeigt fest und geben Sie ein internes Netzwerk an (das als mysqldb0
angezeigt wird hier auch für den Service-Namen und den Volume-Namen verwendet).
Dieses Netzwerk ist nur für den Datenbankcontainer und den entsprechenden WordPress-Container sichtbar. Wenn Sie es bereitstellen, wird eine MySQL-Datenbank mit Anmeldeinformationen erstellt, die wie folgt angezeigt werden:
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
Erster WordPress-Container
Wenn Sie den WordPress-Container bereitstellen, verwendet er die im vorherigen Abschnitt oben angegebene Datenbankkonfiguration. Beachten Sie, dass zusätzlich zu demselben internen Netzwerk, das von der Datenbank gesehen wird (mysqldb0
), muss dieser WordPress-Dienst auch das Nginx-Netzwerk namens net
sehen da es die Frontend-Anwendung für die Außenwelt ist.
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
An dieser Stelle haben Sie die Konfiguration zum Einrichten einer einzelnen WordPress-Instanz. Um weitere einzurichten, wiederholen Sie die Schritte 3 und 4 mit neuen Namen.
Bitte schön:
Datenbankcontainer für zweite WordPress-Site
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
Zweiter WordPress-Container
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
Erstellen Sie mit Ihrem bevorzugten Editor eine docker-compose.yml
Datei mit allen bis zu diesem Punkt besprochenen Inhalten (zusätzliche Parameter wurden unten eingefügt). Sie müssten die Domänennamen und andere Anmeldeinformationen entsprechend bearbeiten. Hier habe ich Nano verwendet.
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
Beachten Sie, dass ich nur für jede Datenbank und den entsprechenden WordPress-Container bestimmte interne Netzwerke zugewiesen habe. Die Datenbankcontainer müssen das Nginx net
nicht sehen Netzwerk. net
wird nur für die Frontend-WordPress-Container benötigt.
In unserem vorherigen Artikel über Diskurs habe ich den --volumes-from
verwendet Flag, um den nginx-proxy
zu verwenden Container-Volumes mit letsencrypt
. Auf die gleiche Weise war das Äquivalent für dasselbe Flag volumes_from
, vor einiger Zeit von Docker entfernt. Daher habe ich die gemeinsamen Volumes für die Nginx- und Let’s Encrypt-Container explizit in der docker-compose.yml
angegeben Datei – nämlich certs , html , vhost und /var/run/docker.sock .
Stellen Sie nun das Setup mit dem folgenden docker-compose
bereit Befehl aus derselben multi-wordpress
Verzeichnis, das wir am Anfang erstellt haben:
docker-compose up -d
Sie erhalten die folgenden Bestätigungen:
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
Die ersten beiden sind die internen Netzwerke, gefolgt von den Volumes und schließlich den Containern. Unser externes Netzwerk net
existiert bereits, da ich es am Anfang dieses Tutorials manuell erstellt habe.
Warten Sie einen Moment. Öffnen Sie Ihren Internetbrowser und geben Sie www.domain.com
ein . Es wird zu domain.com
umgeleitet und Sie sehen den WordPress-Einrichtungsassistenten, der auf Sie wartet:
Wählen Sie Ihre bevorzugte Sprache aus, klicken Sie auf „Weiter“ und fahren Sie mit der Beanspruchung Ihrer Website-Administration fort.
Für wordpress.domain.com
, würden Sie das gleiche Ergebnis erhalten. Sie können weitere WordPress-Sites hinzufügen, indem Sie die Schritte 5 (Datenbankdienst) und 6 (WordPress-Dienst) gemäß der ähnlichen Syntax wie für die vorhandenen Container wiederholen. Vergessen Sie bitte auch nicht, die volumes
zu überarbeiten und networks
Abschnitt in der YAML-Datei entsprechend.
Für jede neue Website würden ein neuer WordPress-Container und der entsprechende MySQL-Datenbank-Container erstellt. Wenn Sie die Befehlszeilenäquivalente der obigen docker-compose.yml-Datei wissen möchten, können Sie diese hier untersuchen.
Tipps zur Wartung Ihrer selbst gehosteten WordPress-Instanzen
Hier sind ein paar Tipps, die Ihnen bei der langfristigen Wartung Ihrer WordPress-Instanzen helfen:
WordPress-Protokolle in Echtzeit überwachen
Wenn Sie die Protokolle eines WordPress-Containers (z. B. das erste in diesem Tutorial beschriebene) überprüfen möchten, während es in Echtzeit bereitgestellt wird, können Sie Folgendes ausführen:
docker logs -f multi-wordpress_wordpress0_1
Falls Sie Fehler beheben oder erfahren möchten, was in jedem anderen relevanten Container für diese Bereitstellung vor sich geht, kann die effiziente Verwendung von Docker-Protokollen entscheidend sein:
Wordpress-Volumes ohne Ausfallzeit sichern und wiederherstellen
Mit einem Cloud + Local-Ansatz können Sie Ihre WordPress-Volumes ohne Ausfallzeiten sichern und wiederherstellen.
WordPress-Container ohne Ausfallzeit aktualisieren
Mit der --scale
flag auf Docker Compose können Sie einen neuen Container basierend auf der neuesten Version von WordPress erstellen. Wenn es fertig ist, können Sie das alte entfernen. Dies führt zu null Ausfallzeiten.
Ich hoffe, Sie fanden diesen Artikel nützlich. Wenn Sie Gedanken, Feedback oder Vorschläge zum Teilen haben, teilen Sie uns dies bitte in den Kommentaren unten mit.