🌐 Webserver
Webserver (Apache, PHP 8 und MariaDb) installieren
Benutze ich nur, um CMS-Seiten LOKAL zu testen. Mein Online-Server rennt natürlich nur im FastCGI-Mode ohne Desktop Umgebung und die CMS ist entsprechend „gehärtet“ und immer aktuell.
📦 Pakete für Webserver installieren
sudo pacman -S mariadb php php-apache phpmyadmin php-gd php-imagick
⚠️ WICHTIG
Wenn sich die Datenbank (
/var/lib/mysql) in einem btrfs-Dateisystem befindet, muss das Copy-on-Write für dieses Verzeichnis deaktiviert werden, bevor eine Datenbank erstellt wird (Quelle).Andernfalls kann es zu erheblichen Performance-Problemen kommen.
🔍 Prüfe ob Ordner leer ist
sudo ls -all /var/lib/mysql/
➕ Dann:
sudo chattr +C /var/lib/mysql
✅ Danach prüfen mit:
sudo lsattr -d /var/lib/mysql
📋 Ergebnis sollte sein:
---------------C------ /var/lib/mysql
Dann ist alles korrekt vorbereitet, und du kannst z.B. MySQL oder MariaDB initialisieren oder starten.
🛠️ Wenn nicht leer, hilft dieser Trick um das nachträglich zu tun (als su):
sudo systemctl stop mysqld
mv /var/lib/mysql /var/lib/mysql_old
mkdir /var/lib/mysql
chattr +C /var/lib/mysql
cp -a /var/lib/mysql_old/* /var/lib/mysql
chown -R mysql:mysql /var/lib/mysql
sudo systemctl restart mysqld
🧹 Wenn das funktioniert hat:
rm -rf /var/lib/mysql_old
🗄️ MariaDB (MySQL) initialisieren
sudo mariadb-install-db --user=mysql --basedir=/usr --datadir=/var/lib/mysql
▶️ MariaDB starten und beim Booten starten
sudo systemctl start mysqld
sudo systemctl enable mysqld
🔍 MariaDB Status prüfen
systemctl status mysqld
(Abbruch mit Strg & C)
Eigentlich sollte es mit dem Script mysql_secure_installation ohne MySQL-Passwort weiter gehen, jedoch hat das bei mir seit MariaDB noch nie funktioniert. Also erst das MySQL Passwort setzen (MariaDB 10.1.20 und neuer):
sudo mariadb
MariaDB [(none)]> ALTER USER 'root'@'localhost' IDENTIFIED BY 'MeinPASSWORT';
MariaDB [(none)]> FLUSH PRIVILEGES;
MariaDB [(none)]> exit
Und die MySQL Installation mit diesem Script abschließen (wichtig!):
mysql_secure_installation
(Abbruch mit Strg & C)
💡 Hinweis
Sollte das Script euer MySQL Passwort nicht annehmen, hilft ein Reset (sonst überspringen: Quelle):
sudo mysqld_safe --skip-grant-tables &
sudo mysql -u root
Dann:
MariaDB [(none)]> use mysql;
MariaDB [(none)]> FLUSH PRIVILEGES;
MariaDB [(none)]> ALTER USER 'root'@'localhost' IDENTIFIED BY 'MeinPASSWORT';
MariaDB [(none)]> exit
🔧 Prüfen, reparieren und optimieren der Tabellen
sudo killall -9 mysqld
sudo mysqlcheck -A --auto-repair -u root -p
sudo mysqlcheck -A --auto-repair -f -o -u root -p
🔐 Installation mit diesem Script abschließen (wichtig!)
mysql_secure_installation
Als erstes werdet ihr nach dem MySQL root Passwort gefragt.
Dann bei der Frage „Switch to unix_socket authentication“ per n weiter und bei „You already have your root account protected“ auch mit n weiter. Als nächstes sollte auf jeden Fall der Anonymous User entfernt werden, wenn der Server produktiv eingesetzt wird. Im nächsten Schritt sollte dem root User das Recht genommen werden, sich über das Netzwerk anzumelden (ich arbeite nur lokal). Zusätzlich zum Anonymous User gibt es eine Testdatenbank, die entfernt werden sollte. Am Ende werden die Berechtigungen neu geladen.
🔄 Wenn nachträglich Anpassungen vorgenommen werden müssen, MariaDB aktualisieren
sudo su
systemctl restart mariadb.service && mariadb-upgrade -u root -p
exit
(Wichtig, obigen Befehl als root ausführen, sonst gibt es diesen Fehler: Could not create the upgrade info file '/var/lib/mysql/mysql_upgrade_info' in the MariaDB Servers)
⚙️ Die Apache Datei httpd.conf konfigurieren
kate /etc/httpd/conf/httpd.conf
🌐 Wenn Server nur lokal erreichbar sein soll:
Listen 127.0.0.1:80
❌ Diese Zeilen mit einer Raute (#) auskommentieren:
#LoadModule unique_id_module modules/mod_unique_id.so
#LoadModule authn_file_module modules/mod_authn_file.so
#LoadModule mpm_event_module modules/mod_mpm_event.so
✅ Diese Zeile aktivieren (Raute entfernen):
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
➕ Diese Zeilen am Ende hinzufügen:
LoadModule php_module modules/libphp.so
AddHandler php-script .php
Include conf/extra/php_module.conf
Include conf/extra/phpmyadmin.conf
🔍 Und prüfen ob diese Module aktiviert sind:
LoadModule userdir_module modules/mod_userdir.so
LoadModule rewrite_module modules/mod_rewrite.so
🧰 Dann phpmyadmin.conf anlegen
kate /etc/httpd/conf/extra/phpmyadmin.conf
Alias /phpmyadmin "/usr/share/webapps/phpMyAdmin"
<Directory "/usr/share/webapps/phpMyAdmin">
DirectoryIndex index.php
AllowOverride All
Options FollowSymlinks
Require local
</Directory>
Info „Require all granted“ nur wenn nicht Lokal!
🐘 php.ini konfigurieren
kate /etc/php/php.ini
Diese Zeilen prüfen / anpassen / aktivieren:
date.timezone = Europe/Berlin
extension=gd
extension=exif
extension=iconv
extension=pdo_mysql
extension=mysqli
open_basedir = /srv/http/:/var/www/:/home/:/tmp/:/var/tmp/:/var/cache/:/usr/share/pear/:/usr/share/webapps/:/etc/webapps/
session.gc_probability = 1
session.gc_divisor = 1000
session.gc_maxlifetime = 1440
upload_max_filesize = 20M
max_file_uploads = 40
🔐 config.inc.php konfigurieren
kate /etc/webapps/phpmyadmin/config.inc.php
Hier ein 32 stelliges Passwort zur Cookie-Authentifizierung setzen, z.B.:
$cfg['blowfish_secret'] = 'seit_phpMyAdmin504istdasPflicht'; /* This is needed for cookie based authentication to encrypt password in cookie. Needs to be 32 chars long. */
🛡️ Ab Apache 2.4.58–2.4.65 (2024–2025) haben viele Distributionen den Dienst gehärtet
ProtectHome=on blockiert /home → UserDir & CMS können nicht mehr schreiben.
Lösung:
sudo systemctl edit httpd
Inhalt:
### Editing /etc/systemd/system/httpd.service.d/override.conf
[Service]
ProtectHome=no
sudo systemctl daemon-reload
sudo systemctl restart httpd
Prüfen:
systemctl show -p ProtectHome httpd
# → ProtectHome=no
▶️ Apache starten und beim Booten starten
sudo systemctl restart httpd
sudo systemctl enable httpd
🔍 Apache Status prüfen
systemctl status httpd
(Abbruch mit Strg & C)
📋 Listet PHP Module
php -m
🪵 Apache/PHP Error Log
cat /var/log/httpd/error_log
🧪 PHP Info Datei erstellen und speichern
kate /srv/http/phpinfo.php
<?php
phpinfo();
?>
Dann im Browser localhost/phpinfo.php öffnen, PHP Version und Konfiguration sollte angezeigt werden.
🗃️ phpMyAdmin
phpMyAdmin ist eine freie Webanwendung zur Administration von MySQL-Datenbanken und MariaDB, im Browser localhost/phpmyadmin/ öffnen.
⚠️ Wenn die Fehlermeldung kommt:
„Auf das $cfg['TempDir'] (/usr/share/webapps/phpMyAdmin/tmp/) kann nicht zugegriffen werden. PhpMyAdmin kann keine Templates zwischenspeichern und ist daher langsam.“
Den Temp Ordner anlegen und http als Besitzer und Gruppe setzen (chmod 777 ist dann nicht notwendig):
sudo mkdir /usr/share/webapps/phpMyAdmin/tmp/
sudo chown -R http:http /usr/share/webapps/phpMyAdmin/tmp/
⚠️ Sollte die Meldung kommen:
„Der phpMyAdmin-Konfigurationsspeicher ist nicht vollständig konfiguriert, einige erweiterte Funktionen wurden deaktiviert...“
Dann fehlt wahrscheinlich die Datenbank „phpmyadmin“. Dann einfach mit diesem Link die Datenbank „phpmyadmin“ anlegen und die Konfigurationsspeicher-Tabellen einrichten: localhost/phpmyadmin/index.php?route=/check-relations.
🛠️ Eine andere mögliche Lösung für dieses Problem ist:
Eine neue Datenbank manuell in phpMyAdmin zu erstellen und dann die Konfigurationsspeicher-Tabellen darin einzurichten:
- Öffne phpMyAdmin und klicke auf Registerkarte „Datenbanken“ oben auf dem Bildschirm.
- Gebe als Name „phpmyadmin“ für die neue Datenbank ein und stelle die Codierung auf „utf8mb4_unicode_ci“.
💡 Hinweis
utf8mb4_unicode_ci sortiert und vergleicht Zeichen nach den Unicode-Regeln genauer, während utf8mb4_general_ci dies vereinfacht und dadurch weniger präzise, aber minimal schneller ist.
Klicke auf „Erstellen“, um die neue Datenbank zu erstellen. Wechsel zur Registerkarte „Importieren“ oben auf dem Bildschirm und wähle die Datei create_tables.sql im phpMyAdmin-Installationsverzeichnis aus (/usr/share/webapps/phpMyAdmin/sql/), klicke auf „OK“, um die Konfigurationsspeicher-Tabellen in der neuen Datenbank zu erstellen.
👤 „User directories“ aktivieren ~/public_html
(möchte mein CMS nicht im Ordner /var/www/ testen, sondern in meinem /home)
kate /etc/httpd/conf/extra/httpd-userdir.conf
Dieser Bereich sollte so aussehen:
UserDir public_html
#
# Control access to UserDir directories. The following is an example
# for a site where these directories are restricted to read-only.
#
<Directory "/home/*/public_html">
DirectoryIndex index.php index.html
AllowOverride All
Options MultiViews SymLinksIfOwnerMatch IncludesNoExec
Require method GET POST OPTIONS
</Directory>
Habe das „Directory Listing“ des Apache-Webservers deaktiviert, also Indexes entfernt (Zugriff auf alle Unterverzeichnisse werden verwehrt).
📁 Ordner public_html erstellen und Berechtigungen anpassen
mkdir ~/public_html
chmod 775 ~/public_html
chmod 711 /home/$USER
🔄 Apache neustarten:
sudo systemctl restart httpd
🧪 PHP Info Datei erstellen und speichern
kate ~/public_html/phpinfo.php
<?php
phpinfo();
?>
Dann im Browser localhost/~BENUTZERNAME/phpinfo.php öffnen, PHP Version und Konfiguration sollte angezeigt werden.
👥 Dateien die der Webserver erzeugt oder ändert
Dateien die der Webserver erzeugt oder ändert (z.B. ein CMS) sind nur für Mitglieder der Gruppe http (bei Debian www-data) schreibbar. Um diese Dateien zu beschreiben, den Benutzer zu dieser Gruppe hinzufügen (Neustart notwendig):
sudo gpasswd -a $USER http
(entfernen mit: sudo gpasswd -d $USER http)
🔐 Berechtigungen für home und public_html anpassen / prüfen – die Reihenfolge ist wichtig
1. Eigene Home- und Benutzerrechte korrekt setzen
sudo chown -R $USER:$USER ~/
chmod 711 /home/$USER
2. public_html vorbereiten
find ~/public_html/ \( -type d -exec chmod 775 {} + \) -or \( -type f -exec chmod 664 {} + \)
3. Schreibrechte für Apache (z. B. CMS-Cache, Uploads)
sudo chown -R http:http ~/public_html
ENDE
Damit lässt sich z.B. das CMF MODX 3 problemlos im eigenen Home-Ordner
~/public_htmlinstallieren und man hat damit eine sichere Testumgebung im eigenen Heimnetz.
