Auf Reisen habe ich gern mein Laptop dabei, um bereits unterwegs Artikel zu schreiben und Fotos zu bearbeiten.
In der Vergangenheit habe ich dazu eine lokale XAMPP Umgebung benutzt, die es als fertiges Paket von Apache Friends gibt. Darin konnte ich dann meine Backups von den Online Webseiten einspielen und so, auch ohne Internetverbindung an den Seiten arbeiten. Leider hatte ich mit Windows 11 und XAMPP mit mehreren Virtual Hosts zunehmend Probleme, teilweise mit Totalverlust der Änderungen. Das die Datenbank manchmal nicht startet, konnte ich noch reparieren. Aber gestört hat mich diese Situation schon länger.
Deshalb machte ich mich auf die Suche nach Alternativen. Gelandet bin ich bei einer Lösung mit einer Virtuellen Maschine, auf der ich einen Ubuntu Server installiere, der wiederum einen Apache Webserver und eine Mariadb Datenbank bereitstellt. Mein lokaler Heimwebserver ist genauso aufgesetzt, so dass ich nichts Neues lernen musste. Zuerst habe ich mit VirtualBox gespielt. Hier war jedoch die Performance am Ende ziemlich lahm. Ich hab meinen besten Freund, ChatGPT gefragt und dieser riet mir zu einer Lösung mit VMware Player. Er half mir sogar, die VirtualBox Harddisk in eine VMware Harddisk zu konvertieren, so dass ich den Server nicht neu aussetzen musste. Um diesen Bericht zu dokumentieren, habe ich dann doch eine neue virtuelle Maschine installiert. Und das geht so:
Zuerst braucht man den VMware Player, den man kostenlos herunterladen kann, genauso wie die Ubuntu Server Live Version. Nach der Installation erstelle ich eine neu Virtuelle Maschine und weise dieser die Ubuntu-.iso -Datei als Installationsmedium zu. Zur Installation braucht man eine Internetverbindung. Ich belasse alles bei den Standardeinstellungen und die Installationsroutine von Ubuntu startet automatisch. Die Installation des Ubuntu Servers habe ich an anderer Stelle schon beschrieben und überspringe sie hier. Sobald der Server fertiggestellt und rebootet ist, installiere ich nur noch SSH von der Konsole. Die restliche Installation lässt sich dann per Putty bewerkstelligen.
Nun brauchen wir ein paar Pakete : den Apache Webserver, die MariaDB Datenbank, PHP, die net-tools und die VMWare-Tools. Diese sind seit VMWare Player Version 17 nicht mehr Bestandteil des Installationspaketes. Ich installiere auch noch dat Datenbanktool PHPMyAdmin.
- apt install apache2 mariadb-server php libapache2-mod-php php-cli php-mysql php-json php-imagick php-opcache php-mbstring php-intl php-xml php-gd php-zip php-curl php-xmlrpc wget curl unzip phpmyadmin net-tools open-vm-tools -y
Nun müssen ein paar Parameter in der php.ini Datei geändert werden. Ich setzte die Parameter in den Verzeichnissen /etc/php/8.3/cli und /etc/php/8.3/apache2
- nano /etc/php/8.3/cli/php.ini
memory_limit = 256M
upload_max_filesize = 128M
post_max_size = 128M
max_execution_time = 300
output_buffering = Off
date.timezone = CET
Dann wird der Apache Server und die Datenbank aktiviert und gestartet, sowie die Datenbank abgesichert.
- systemctl enable apache2 mariadb
- systemctl start apache2 mariadb
- mysql_secure_installation
Beim Apache liegt das Stammverzeichnis in /var/www/html. In diesem Verzeichnis erzeuge ich nun die Basisverzeichnisse für meine Webseiten. Diese heißen bei mir wie die Domainnamen, also berendesbande und bommelreisen. Sie könnten aber auch web1, web2 etc. lauten. Da ich die Verzeichnisse als root erzeuge, muss ich anschließend dem Benutzer www-data und der gleichnamigen Gruppe übereignen. Dann werden noch die Rechte zugewiesen. Für jede Domain brauchen wir dann noch die passende Datenbank mit dem entsprechenden Benutzer und den nötigen Rechten.
- mkdir /var/www/html/web1
- mkdir /var/www/html/web2
- chown -R www-data:www-data /var/www/html
- chmod -R 750 /var/www/html
- mysql -u root -p
- create database web1_db;
- create database web2_db;
- create user web1@localhost identified by '1234';
- create user web2@localhost identified by '1234';
- grant all on web1_db.* to web1@localhost;
- grant all on web2_db.* to web2@localhost;
- flush privillegs;
- exit
Nun werden die Virtual Host Dateien für die Webseiten im Verzeichnis /etc/apache2/sites-available erzeugt. Dazu kopiere ich die default-Konfigurationsdatei für jede Domain einmal unter den Namen der Domain. Dann ändere ich dies entsprechend ab.
- cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/web1.conf
- cd /etc/apache2/sites-available
- cp ./web1.conf ./web2.conf
- nano web1.conf
Hier als Beispiel meine komplette web1.conf Datei. Die Konfigurationsdatei für die zweite Domain ändere ich analog.
- <VirtualHost *:80>
ServerAdminDiese E-Mail-Adresse ist vor Spambots geschützt! Zur Anzeige muss JavaScript eingeschaltet sein.
ServerName web.berendes-bande.de
ServerAlias www.berendes-bande.de
DocumentRoot /var/www/html/web1/
ErrorLog ${APACHE_LOG_DIR}/joomla-error.log
CustomLog ${APACHE_LOG_DIR}/joomla-access.log combined
<Directory /var/www/html/web1/>
Options FollowSymlinks
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
Nun werden die Konfigurationsdateien aktiviert und der Webserver neu gestartet.
- a2ensite web1.conf
- a2ensite web2.conf
- systemctl restart apache2
Ich benutze Akeeba Backup, um meine Joomla Webseiten zu sichern. Vor Reiseantritt habe ich von meinen Webpräsenzen Backups gezogen und auf meinem PC gespeichert. Diese müssen jetzt in das Web-Verzeichnis der jeweiligen Präsenz auf dem virtuellen Server kopiert werden und mit der Kickstart.php von Akeeba ausgepackt werden. Dazu richte ich zwischen dem VM Server und dem lokalen Host-PC ein gemeinsames Laufwerk ein. Diese Aktion hat mich etwas Zeit und Recherchearbeit gekostet, da die VM-Player Version 17 die VMware Tools nicht mehr mitbringt. Auf dem Ubuntu-Server haben ich diese bereits installiert (open-vm-tools). Das automatische Mapping des Host Laufwerks funktioniert leider nicht ohne manuelle Eingriffe.
Zuerst richtet man im VMware Player in den Einstellungen des virtuellen Servers das gemeinsame Laufwerk ein, also ein Verzeichnis des Host Rechners, auf den die VM zugreifen können soll. Bei mir ist das der Downloads-Ordner.
Dann geht es weiter auf dem Ubuntu Server. Linux braucht zum Einhängen von Laufwerken einen Mountpoint, also ein Verzeichnis auf der eigenen Umgebung, in die das "fremde" Verzeichnis eingebunden wird. Diese Mountpoints liegen im Verzeichnis /mnt. Für das virtuelle Hostverzeichnis hat sich hgfs als Name etabliert. Es funktioniert aber auch mit jedem anderen beliebigen Namen. Diese Verzeichnis erstelle ich mit root Rechten. Anschließend muss man das Host-Verzeichnis dann an den Mointpoint binden:
- mkdir /mnt/hgfs
- vmhgfs-fuse .host:/Downloads /mnt/hgfs -o allow_other -o uid=1000
Soweit - so gut, wenn man nun den Inhalt von /mnt/hgfs auflistet, findet sich der Inhalt des Downloads-Verzeichnisses der Windows Maschine. Nur soll das bitte auch automatisch nach dem Systemstart funktionieren. Das lässt sich mit einem Eintrag in der fstab erledigen:
- nano /etc/fstab
- vmhgfs-fuse /mnt/hgfs fuse defaults,allow_other 0 0
Nach dem Neustart des Servers steht das Downloads Verzeichnis des Host automatisch zur Verfügung. Jetzt kann ich also die Backups der Webseiten in die entsprechenden html-Verzeichnisse kopieren:
- cp /mnt/hgfs/Downloads/backup1 /var/www/html/web1
- cp /mnt/hgfs/Downloads/backup2 /var/www/html/web2
- cp /mnt/hgfs/kickstart.php /var/www/html/web1
- cp /mnt/hgfs/kickstart.php /var/www/html/web2
Jetzt ist alles bereit, um die Webpräsenz über den Webbrowser des Host zu entpacken. Die benötigte lokale IP Adresse liefert das Kommando ifconfig auf dem Server oder die Anmeldung über Putty. Bei mir hat der Server die lokale IP Adresse 192.168.111.129, welche ein Subnet meines Heimnetzwerkes darstellt. Diese Adresse funktioniert auch, wenn keine Internetverbindung existiert. Der Aufruf für das Entpacken des ersten Backups lautet also:
Für das zweite Backup lautet der Aufruf entsprechend web2. Nach der Wiederherstellung kommt man über
in die Admin-Oberfläche des Joomla Webpräsenz. Ich habe diese Umgebung während unseres England Urlaubs täglich benutzt. Ich bin begeistert von der Performance und Abstürze oder das nicht starten der Datenbank hat es nicht gegeben. Vielleicht hilft dieser Artikel ja ein paar Gleichgesinnten.