Einrichten eines lokalen LAMP-Servers
(unter Linux Mint 22)
Ein LAMP-Server ist ein lokaler Webserver, der unter Linux die Produktion von dynamischen Websites unter Verwendung von PHP und MariaDB auf dem eigenen lokalen Rechner ermöglicht, wodurch während der Entwicklungsphase das Hochladen von PHP-Skripten auf einen entfernten Webspace überflüssig wird. LAMP besteht aus folgenden Komponenten:
• Apache 2.4.58 (Webserver)
• PHP-Modul 8.3 (Skriptinterpreter)
• MariaDB-Server 10.11.8 (Datenbank)
• phpMyAdmin 5.2.1 (Verwaltungsoberfläche für MariaDB)
Diese Anleitung beschreibt lediglich die Installation eines lokalen Webservers für die Produktion von PHP-Anwendungen. Diese Art der Installation ist aus Sicherheitsgründen nicht für einen Dienst im World Wide Web geeignet!
Pakete installieren
Installation aus den offiziellen Paketquellen:
sudo apt-get install apache2 php php-intl mariadb-server phpmyadmin
Installation per apturl
Alle weiteren benötigten Pakete werden über die Paketabhängigkeiten mitinstalliert. Individuelle Erweiterungen, wie im Beispiel php-intl für Punycode-Unterstützung müssen entsprechend selbst gewählt und installiert werden.
Bei der Installation von phpMyAdmin ist es im Normalfall ausreichend, apache2 zu konfigurieren. (Markierung der Option im Terminal durch Leertaste)
Die Frage Konfigurieren der Datenbank für phpmyadmin mit dbconfig-common? kann man bejahen.
Es wird nach einem Passwort für den Benutzer phpmyadmin gefragt. Diesen Punkt kann man überspringen, da dieser Benutzer über keine ausreichenden Privilegien zur Administration von Datenbanken verfügt, was beim Benutzer root allerdings der Fall ist und dessen Passwort wir in einem der nächsten Schritte explizit festlegen werden. Datenbanken und ggf. weitere Benutzer können dann später durch root eingerichtet und verwaltet werden.
Apache nach außen absichern
Damit Außenstehende über das Internet nicht den vollen Zugriff auf die eigenen Dateien unter localhost haben (durch Aufruf der eigenen IP-Adresse), muss der Apache-Server nach der Installation nun nach außen abgesichert werden, es sei denn, man befindet sich z. B. in einem lokalen Netzwerk hinter einem Router. Dazu ändert man mit Rootrechten die Datei ports.conf mit Hilfe eines Texteditors (z. B. Xed):
sudo xed /etc/apache2/ports.conf
Der ursprüngliche Eintrag Listen 80 wird nun zu Listen 127.0.0.1:80 geändert.
PHP konfigurieren
Die Feineinstellung von PHP erfolgt in der Datei php.ini (s. PHP-Dokumentation):
sudo xed /etc/php/8.3/apache2/php.ini
Hier können bei Bedarf einige Änderungen vorgenommen werden. In einer lokalen Entwicklungsumgebung möchte man vermutlich Fehlermeldungen angezeigt bekommen. Dazu ändert man folgende Variable:
display_errors = On
Um sämtliche Fehlermeldungen, Warnungen und Hinweise anzeigen zu lassen, ändert man folgende Variable (s. PHP.net):
error_reporting = E_ALL
Diese Einstellung kann in einem PHP-Skript während der Laufzeit vorübergehend durch die Funktion error_reporting() überschrieben werden (s. PHP.net).
Weitere Variablen, die man hier möglicherweise einstellen möchte, sind upload_max_filesize sowie max_execution_time.
Rootpasswort des Datenbank-Servers festlegen
Die Anmeldung am Datenbank-Server kann im Terminal zunächst ohne Passwort erfolgen. Die PHP-Funktion mysqli_connect() benötigt zur Anmeldung allerdings ein Passwort und auch bei phpMyAdmin ist eine Anmeldung ohne Passwort nicht ohne Weiteres möglich. Daher wird in diesem Schritt ein Passwort für den Rootzugang zum Datenbank-Server festgelegt.
Mit sudo mariadb -u root
meldet man sich ohne Passwort beim Server an. Hier gibt man folgenden Befehl ein (der Platzhalter ROOTPASSWORD ist durch das gewünschte Passwort zu ersetzen):
ALTER USER 'root'@'localhost' IDENTIFIED BY 'ROOTPASSWORD';
Mit exit; verlässt man den Server dann wieder.
Ab sofort ist die passwortlose Anmeldung im Terminal nicht mehr möglich und erfolgt daher mit dem Befehl mariadb -u root -p -h localhost
.
Dateizugriff auf /var/www/html herstellen
Der Ordner /var/www/html ist der, auf den http://localhost/ bzw. http://127.0.0.1/ verweist, und in dem die eigenen Produktionsdateien liegen werden.
Nun haben wir aber das Problem, dass der Benutzer von Apache in der Voreinstellung den Namen www-data trägt, was dazu führt, dass weder www-data noch ich als normaler Benutzer Schreibrechte für /var/www/html besitzen, da dieser Ordner bei der Installation von LAMP mit Rootrechten angelegt wurde und daher zunächst root gehört.
Dies kann man aber ändern, indem man sich selbst zum Besitzer des Wurzelordners macht (der Platzhalter BENUTZER ist durch den eigenen Benutzernamen zu ersetzen):
sudo chown BENUTZER:BENUTZER /var/www/html && sudo chmod 775 /var/www/html
Anschließend ändert man noch den Apache-Benutzer:
sudo xed /etc/apache2/envvars
In dieser Datei ändert man den Wert der Variablen APACHE_RUN_USER und APACHE_RUN_GROUP von www-data auf den eigenen Benutzernamen.
Mit sudo service apache2 restart
wird Apache mit diesen Änderungen neu gestartet. (Dieser Befehl ist auch nach allen späteren Änderungen der Apache-Konfiguration notwendig.)
Nun können unter /var/www/html die eigenen Produktionsdateien erstellt bzw. dorthin kopiert werden.
phpMyAdmin aufrufen
Die eventuell benötigten Datenbanken können nun über das Terminal, per PHP-Skript oder über phpMyAdmin eingerichtet bzw. importiert werden.
Unter http://localhost/phpmyadmin/ kann man die Benutzeroberfläche von phpMyAdmin aufrufen. Dort meldet man sich mit den gleichen Anmeldedaten an, mit denen man sich auch im Terminal oder mit PHP am Datenbank-Server anmelden würde. Also beispielsweise als root mit dem oben festgelegten Rootpasswort.
Falls man den Import von SQL-Dateien nicht über phpMyAdmin, sondern über das Terminal abwickeln möchte, erfolgt das mit einem Befehl nach folgendem Muster:
mariadb -u BENUTZER -pPASSWORT DATENBANKNAME < /pfad/zur/datei/MeinBackup.sql
Die Platzhalter BENUTZER, PASSWORT und DATENBANKNAME sowie der Pfad zur Backupdatei müssen angepasst werden. Kein Leerzeichen nach -p, es sei denn, es ist das erste Zeichen des Passwortes!
Beispielsweise:
mariadb -u web123 -phGtGvFeDfZHjIu usr_web123_1 < /pfad/zur/datei/MeinBackup.sql
Der Export erfolgt über folgenden Befehl:
mariadb-dump -u BENUTZER -pPASSWORT DATENBANKNAME > /pfad/zur/datei/MeinBackup.sql
Weitere Informationen zu phpMyAdmin: UbuntuUsers-Wiki
Anhang
Apache case-insensitive konfigurieren
Sollte der Apache-Server auf Anfrage ein PHP-Skript als Quelltext senden, statt es zu interpretieren, wenn die Dateinamenserweiterung der PHP-Datei nicht ausschließlich aus Kleinbuchstaben besteht (also z. B. .PHP statt .php), so kann man dieses Problem beheben, indem man eine Änderung in der Datei php7.2.conf vornimmt:
sudo xed /etc/apache2/mods-available/php7.2.conf
Hier findet man folgende Zeilen:
<FilesMatch ".+\.ph(ar|p|tml)$">
SetHandler application/x-httpd-php
</FilesMatch>
Der reguläre Ausdruck .+\.ph(ar|p|tml)$ muss hier durch .+\.(?i:ph(ar|p|tml))$ ersetzt werden, wodurch die case-sensitivity auf case-insensitive gesetzt wird und somit sowohl Klein- als auch Großbuchstaben in der Dateinamenserweiterung akzeptiert werden:
<FilesMatch ".+\.(?i:ph(ar|p|tml))$">
SetHandler application/x-httpd-php
</FilesMatch>
Nach dieser Änderung die Datei speichern und schließen. Anschließend den Apache-Server neu starten:
sudo service apache2 restart
Siehe auch: <FilesMatch>
Start- und Stop-Befehl für Apache
Mit folgenden Befehlen kann der Apache-Server über das Terminal gesteuert werden:
sudo service apache2 start
(Starten)
sudo service apache2 restart
(Neustarten)
sudo service apache2 stop
(Anhalten)
mod_rewrite aktivieren
Um das Apache-Modul mod_rewrite zu verwenden, was z. B. bei der URL-Umwandlung lokal installierter Content Management Systeme nützlich sein kann, geht man folgendermaßen vor:
sudo a2enmod rewrite
sudo service apache2 force-reload
Anschließend noch in der Konfigurationsdatei 000-default in der Rubrik <Directory /var/www/> den Wert von AllowOverride von None auf All ändern (s. Ausschnitt unten) und den Browser neu starten.
sudo xed /etc/apache2/sites-enabled/000-default
<Directory /var/www/>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>