In diesem Beitrag dokumentieren wir Schritt für Schritt das gesamte technische Setup dieser Website. Diese Anleitung dient als Blaupause, um das identische Setup auf einem anderen Debian-basierten Server mit Apache, MariaDB und WordPress nachzubauen.
Schritt 1: Systempakete und PHP-Module installieren
Zuerst werden der Webserver, die Datenbank und PHP mit allen für WordPress (inkl. Medienverarbeitung) notwendigen Erweiterungen installiert:
sudo apt-get update
sudo apt-get install -y php php-mysql php-curl php-gd php-mbstring php-xml php-soap php-intl php-zip php-imagick libapache2-mod-php mariadb-server mariadb-client
Schritt 2: Webserver-Konfiguration anpassen
Damit WordPress-Sicherheitsregeln und Permalinks (.htaccess) funktionieren, muss das Apache-Rewrite-Modul aktiviert und die Konfiguration angepasst werden:
- Rewrite-Modul aktivieren:
sudo a2enmod rewrite headers expires sudo systemctl restart apache2 - Verzeichnisrechte in
/etc/apache2/apache2.conffreigeben:
Suchen Sie nach dem Block<Directory /var/www/>und ändern SieAllowOverride NoneinAllowOverride All:<Directory /var/www/> Options Indexes FollowSymLinks AllowOverride All Require all granted </Directory>
Schritt 3: Dateiberechtigungen & Gruppenrechte
Damit der Webserver (www-data) Plugins und Updates ohne FTP-Abfrage schreiben kann, aber der Systembenutzer (z. B. support) vollen Schreibzugriff im Terminal behält, wird eine gemeinsame Gruppe genutzt:
# Webserver-Benutzer zur Gruppe des Systembenutzers hinzufügen
sudo usermod -aG support www-data
# Eigentümerschaft und Rechte für das Web-Verzeichnis anpassen
sudo chown -R support:www-data /var/www/html
sudo find /var/www/html -type d -exec chmod 775 {} \;
sudo find /var/www/html -type f -exec chmod 664 {} \;
Schritt 4: WP-CLI (Kommandozeilen-Tool) installieren
WP-CLI vereinfacht die WordPress-Administration per Konsole dramatisch:
curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
chmod +x wp-cli.phar
sudo mv wp-cli.phar /usr/local/bin/wp
Schritt 5: Erweiterte Konfiguration in der wp-config.php
Öffnen Sie die wp-config.php und fügen Sie folgende Konfigurationen hinzu:
- Direktes Schreiben erzwingen (FTP-Prompt abschalten):
define( 'FS_METHOD', 'direct' ); - Nginx Reverse Proxy & SSL-Erkennung (mit CLI/Cron-Fallbacks):
Verhindert Weiterleitungsschleifen (Redirect Loops), wenn die Seite öffentlich über einen SSL-Proxy (HTTPS) angesprochen wird, aber intern unverschlüsselt (HTTP) läuft:if ( isset( $_SERVER['HTTP_X_FORWARDED_PROTO'] ) && 'https' === $_SERVER['HTTP_X_FORWARDED_PROTO'] ) { $_SERVER['HTTPS'] = 'on'; } if ( isset( $_SERVER['HTTP_X_FORWARDED_HOST'] ) ) { $_SERVER['HTTP_HOST'] = $_SERVER['HTTP_X_FORWARDED_HOST']; } $http_host = $_SERVER['HTTP_HOST'] ?? 'urbanart.andur.de'; $is_https = ( isset( $_SERVER['HTTPS'] ) && 'on' === $_SERVER['HTTPS'] ); $http_protocol = $is_https ? 'https://' : 'http://'; define( 'WP_HOME', $http_protocol . $http_host ); define( 'WP_SITEURL', $http_protocol . $http_host );
Schritt 6: Performance-Optimierung (Caching)
- Page-Cache-Plugin installieren:
wp plugin install wp-super-cache --activate --path=/var/www/htmlAktivieren Sie das Caching in der Konfigurationsdatei
wp-content/wp-cache-config.phpdurch Ändern des Werts:$cache_enabled = true; - Browser-Caching in
.htaccesshinzufügen:
Fügen Sie folgenden Block außerhalb der WordPress-Standardregeln in die/var/www/html/.htaccessein:<IfModule mod_expires.c> ExpiresActive On ExpiresDefault "access plus 1 month" ExpiresByType text/html "access plus 0 seconds" ExpiresByType text/css "access plus 1 year" ExpiresByType application/javascript "access plus 1 year" ExpiresByType image/gif "access plus 1 year" ExpiresByType image/jpeg "access plus 1 year" ExpiresByType image/png "access plus 1 year" ExpiresByType image/svg+xml "access plus 1 year" ExpiresByType image/x-icon "access plus 1 year" </IfModule>
Schritt 7: Lokales Benutzer-Avatar (statt Gravatar)
Um Avatare direkt in WordPress ohne externe Verbindung zu verwalten, nutzen wir ein lokales Plugin:
# Plugin installieren
wp plugin install simple-local-avatars --activate --path=/var/www/html
# Bild in die Mediathek importieren (gibt eine Attachment-ID zurück, z.B. 12)
wp media import /pfad/zum/bild.png --title="Mein Avatar" --path=/var/www/html
# Dem Benutzer programmatisch zuweisen (z.B. User "Gemini")
wp eval "global \$simple_local_avatars; \$user = get_user_by('login', 'Gemini'); \$simple_local_avatars->assign_new_user_avatar([IMAGE_ATTACHMENT_ID], \$user->ID);" --path=/var/www/html
Schritt 8: Interaktive Inhalte (wichtige WordPress-Hacks)
Wenn CSS-Animationen oder JavaScript-Code (z. B. für den Radioplayer) direkt in Beiträgen verwendet werden sollen, wandelt der WordPress-Parser (wpautop) Zeilenumbrüche standardmäßig in Paragraphen (<p>) und logische Operatoren (wie &&) in HTML-Entities (&&) um, was den Code unbrauchbar macht.
- CSS-Animationen: Müssen komplett in einer einzigen Zeile (minifiziert) innerhalb des
<style>-Tags im HTML-Editor eingefügt werden. - JavaScript: Sollte als reines Inline-JavaScript direkt in den
onclick-Attributen der HTML-Buttons platziert werden. Vermeiden Sie logische Operatoren wie&&durch verschachtelteif-Abfragen.
Schritt 9: Automatisches Backup & Recovery einrichten
Erstellen Sie ein Backup-Skript (z. B. unter ~/bin/backup_wordpress.sh) und legen Sie einen wöchentlichen Cronjob an (Sonntag 5:00 Uhr):
0 5 * * 0 /home/support/bin/backup_wordpress.sh
Das Skript sichert die Datenbank mittels mysqldump, komprimiert die Web-Dateien über tar in das Verzeichnis ~/Backup/ und bereinigt Backups, die älter als 30 Tage sind.
Mit dieser Anleitung lässt sich das vollständige, hochperformante und sichere Setup jederzeit auf einer neuen WordPress-Instanz detailgetreu reproduzieren!