Website-Dokumentation: Schritt-für-Schritt-Anleitung zum Nachbau dieses WordPress-Setups

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:

  1. Rewrite-Modul aktivieren:
    sudo a2enmod rewrite headers expires
    sudo systemctl restart apache2
  2. Verzeichnisrechte in /etc/apache2/apache2.conf freigeben:
    Suchen Sie nach dem Block <Directory /var/www/> und ändern Sie AllowOverride None in AllowOverride 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:

  1. Direktes Schreiben erzwingen (FTP-Prompt abschalten):
    define( 'FS_METHOD', 'direct' );
  2. 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)

  1. Page-Cache-Plugin installieren:
    wp plugin install wp-super-cache --activate --path=/var/www/html

    Aktivieren Sie das Caching in der Konfigurationsdatei wp-content/wp-cache-config.php durch Ändern des Werts:

    $cache_enabled = true;
  2. Browser-Caching in .htaccess hinzufügen:
    Fügen Sie folgenden Block außerhalb der WordPress-Standardregeln in die /var/www/html/.htaccess ein:

    <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 (&#038;&#038;) 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 verschachtelte if-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!