GNU/Linux >> LINUX-Kenntnisse >  >> Linux

So hosten Sie mehrere WordPress-Sites auf demselben Server mit Docker

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 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.


Linux
  1. So installieren Sie WordPress mit Docker auf Ubuntu

  2. So stellen Sie einen dynamischen DNS-Server mit Docker unter Debian 10 bereit

  3. So richten Sie mit Nginx mehrere SSLs auf einer IP ein

  4. Wie verwende ich denselben SSH-Alias ​​mit mehreren Hostadressen/Ports/etc.?

  5. CentOS / RHEL 6 :So erzwingen Sie eine NTP-Synchronisierung mit dem/den NTP-Server(n)

So führen Sie verschiedene PHP-Versionen auf demselben Server aus

So installieren Sie WordPress mit Docker unter Ubuntu 16.04 LTS

So installieren Sie mehrere Discourse-Container auf demselben Server

So stellen Sie den Jitsi Meet-Konferenzserver mit Ubuntu 22.04 bereit

Gewusst wie:Erste Schritte mit Windows-Containern und Docker

So installieren Sie WordPress auf einem CentOS 8-Server