Caddy
Sehr kurze Konfiguration, automatisches HTTPS, ideal als Reverse Proxy und für überschaubare VPS-Setups.
Installation und Einordnung der drei verbreiteten Webserver inklusive PHP-FPM, MariaDB/MySQL-Anbindung und sinnvoller PHP-Module für WordPress-Systeme.
80 und
443. Werden mehrere gleichzeitig gestartet, entstehen Portkonflikte.
Parallelbetrieb ist möglich, benötigt aber einen bewusst geplanten Reverse Proxy
und abweichende interne Ports.
Sehr kurze Konfiguration, automatisches HTTPS, ideal als Reverse Proxy und für überschaubare VPS-Setups.
Breite Kompatibilität, unterstützt .htaccess und ist für klassische WordPress-Projekte vertraut.
Effizient bei statischen Dateien und vielen Verbindungen, verlangt aber explizitere Konfiguration.
| Merkmal | Caddy | Apache2 | Nginx |
|---|---|---|---|
| HTTPS | Automatisch integriert | Certbot oder manuell | Certbot oder manuell |
| PHP | PHP-FPM | PHP-FPM empfohlen; mod_php möglich | PHP-FPM |
| .htaccess | Nein | Ja | Nein |
| Reverse Proxy | Sehr einfach | Möglich | Sehr leistungsfähig |
| Konfigurationsaufwand | Niedrig | Mittel | Mittel bis hoch |
sudo apt update
sudo apt full-upgrade -y
sudo apt install -y curl wget unzip ca-certificates gnupg debian-keyring debian-archive-keyring apt-transport-https
timedatectl
hostnamectl
hostname -f
Der A- beziehungsweise AAAA-Record der Domain muss auf die öffentliche IP-Adresse des VPS zeigen.
Caddy wurde gewählt, weil er Reverse Proxy, statischen Webserver, PHP-Anbindung und automatisches HTTPS mit sehr kompakter Konfiguration verbindet. Das offizielle Paket richtet zugleich einen systemd-Dienst ein.
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt install -y caddy
caddy version
sudo systemctl status caddy --no-pager
| Konfiguration | /etc/caddy/Caddyfile |
|---|---|
| systemd-Dienst | caddy.service |
| Logs | journalctl -u caddy oder eigener Log-Pfad |
| Webverzeichnisse | Typischerweise /var/www/<projekt> |
sudo mkdir -p /var/www/example
echo '<h1>Caddy läuft</h1>' | sudo tee /var/www/example/index.html
sudo chown -R www-data:www-data /var/www/example
example.de {
root * /var/www/example
file_server
}
sudo caddy fmt --overwrite /etc/caddy/Caddyfile
sudo caddy validate --config /etc/caddy/Caddyfile
sudo systemctl reload caddy
sudo apt install -y php-fpm php-cli php-mysql php-curl php-mbstring php-xml php-zip php-gd php-intl php-bcmath php-imagick php-opcache
Den tatsächlichen Socket ermitteln:
find /run/php -maxdepth 1 -type s -name 'php*-fpm.sock'
example.de {
root * /var/www/example/public
encode zstd gzip
php_fastcgi unix//run/php/php8.5-fpm.sock
file_server
}
php8.5-fpm.sock ist ein Beispiel für Ubuntu 26.04. Verwende
immer den auf deinem System tatsächlich vorhandenen Socket.
api.example.de {
reverse_proxy 127.0.0.1:3000
}
Für WebSockets ist normalerweise keine zusätzliche Spezialkonfiguration nötig; Caddy behandelt das Upgrade automatisch.
Beantragung und regelmäßige Erneuerung von TLS-Zertifikaten sowie Weiterleitung von HTTP auf HTTPS.
Weiterleitung von Domains und Subdomains an interne Anwendungen wie Node.js, Nuxt, APIs oder Dashboards.
Auslieferung von HTML, CSS, JavaScript, Bildern, Downloads und generierten Frontend-Builds.
Übergabe von PHP-Anfragen an PHP-FPM, beispielsweise für WordPress oder phpMyAdmin.
Gzip/Zstandard-Kompression, Security-Header, Caching-Regeln und Zugriffsbeschränkungen.
Moderne HTTP-Versionen, strukturierte Zugriffslogs und zentrale Fehlerdiagnose über systemd.
Apache ist die klassische Wahl für WordPress, wenn .htaccess, bekannte
Hosting-Konventionen oder maximale Kompatibilität zu älteren Projekten wichtig sind.
sudo apt update
sudo apt install -y apache2 php-fpm php-cli php-mysql php-curl php-mbstring php-xml php-zip php-gd php-intl php-bcmath php-imagick php-opcache
sudo a2enmod proxy_fcgi setenvif rewrite headers expires ssl http2
sudo a2enconf php8.5-fpm
sudo systemctl restart apache2
libapache2-mod-php.
sudo mkdir -p /var/www/example/public
sudo chown -R www-data:www-data /var/www/example
sudo find /var/www/example -type d -exec chmod 755 {} \;
sudo find /var/www/example -type f -exec chmod 644 {} \;
Datei anlegen:
sudo nano /etc/apache2/sites-available/example.conf
<VirtualHost *:80>
ServerName example.de
ServerAlias www.example.de
DocumentRoot /var/www/example/public
<Directory /var/www/example/public>
Options FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/example-error.log
CustomLog ${APACHE_LOG_DIR}/example-access.log combined
</VirtualHost>
sudo a2ensite example.conf
sudo a2dissite 000-default.conf
sudo apache2ctl configtest
sudo systemctl reload apache2
sudo apt install -y certbot python3-certbot-apache
sudo certbot --apache -d example.de -d www.example.de
sudo systemctl status apache2 --no-pager
sudo ss -lntp | grep -E ':80|:443'
sudo journalctl -u apache2 -n 100 --no-pager
Nginx eignet sich für performante, explizit konfigurierte Setups. PHP wird immer über
PHP-FPM angebunden; eine .htaccess-Auswertung gibt es nicht.
sudo apt update
sudo apt install -y nginx php-fpm php-cli php-mysql php-curl php-mbstring php-xml php-zip php-gd php-intl php-bcmath php-imagick php-opcache
find /run/php -maxdepth 1 -type s -name 'php*-fpm.sock'
systemctl list-units --type=service | grep php.*fpm
sudo mkdir -p /var/www/example/public
sudo chown -R www-data:www-data /var/www/example
sudo find /var/www/example -type d -exec chmod 755 {} \;
sudo find /var/www/example -type f -exec chmod 644 {} \;
server {
listen 80;
listen [::]:80;
server_name example.de www.example.de;
root /var/www/example/public;
index index.php index.html;
client_max_body_size 64M;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.5-fpm.sock;
}
location ~ /\. {
deny all;
}
location = /xmlrpc.php {
deny all;
}
access_log /var/log/nginx/example-access.log;
error_log /var/log/nginx/example-error.log;
}
Datei anlegen und aktivieren:
sudo nano /etc/nginx/sites-available/example
sudo ln -s /etc/nginx/sites-available/example /etc/nginx/sites-enabled/example
sudo rm -f /etc/nginx/sites-enabled/default
sudo nginx -t
sudo systemctl reload nginx
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d example.de -d www.example.de
sudo systemctl status nginx --no-pager
sudo nginx -t
sudo journalctl -u nginx -n 100 --no-pager
Die Ubuntu-Standardpakete liefern immer nur eine an die Ubuntu-Version gekoppelte
PHP-Version. Für eine gezielte Version oder mehrere parallel installierte Versionen
wird das PPA ondrej/php genutzt.
sudo apt install -y software-properties-common
sudo add-apt-repository -y ppa:ondrej/php
sudo apt update
Verfügbare Versionen anzeigen:
apt-cache search '^php[0-9]\.[0-9]-fpm$'
Eine bestimmte Version installieren, zum Beispiel PHP 8.3 zusätzlich zu PHP 8.5:
sudo apt install -y php8.3-fpm php8.3-cli
php8.3-fpm.sock und php8.5-fpm.sock. Der Webserver-Vhost
entscheidet über den Socket-Pfad, welche Version eine Domain verwendet.
Um beim Umstieg keine Pakete zu vergessen, lassen sich die aktuell installierten Module einer Version auslesen und direkt für eine neue Version installieren.
Installierte Module der alten Version anzeigen, zum Beispiel PHP 8.5:
dpkg -l 'php8.5-*' | awk '/^ii/{print $2}'
Dieselben Module direkt für die neue Version (hier PHP 8.3) installieren:
sudo apt install -y $(dpkg -l 'php8.5-*' | awk '/^ii/{print $2}' | sed 's/^php8\.5-/php8.3-/' | tr '\n' ' ')
dpkg -l listet alle installierten Pakete, awk filtert
installierte (ii) php8.5-*-Pakete und gibt nur den Paketnamen
aus, sed ersetzt das Versionspräfix. Das Ergebnis wird als Paketliste an
apt install übergeben.
CLI-Standardversion umschalten, falls mehrere Versionen installiert sind:
sudo update-alternatives --config php
Jede PHP-Version besitzt ein eigenes Konfigurationsverzeichnis unter
/etc/php/<version>/, zusätzlich getrennt nach SAPI (FPM, CLI,
Apache-Modul). Änderungen an einer php.ini wirken sich nur auf die
jeweils zugehörige Version und SAPI aus.
| SAPI | Pfad | Gilt für |
|---|---|---|
| FPM | /etc/php/<version>/fpm/php.ini | Caddy, Nginx, Apache mit proxy_fcgi |
| CLI | /etc/php/<version>/cli/php.ini | wp-cli, Cronjobs, manuelle Skriptausführung |
| Apache-Modul | /etc/php/<version>/apache2/php.ini | Nur bei libapache2-mod-php (mod_php) |
| FPM-Pool | /etc/php/<version>/fpm/pool.d/www.conf | Prozess-Limits, User/Group, Listen-Socket je Version |
php.ini unter fpm/ wird erst nach
sudo systemctl restart php<version>-fpm aktiv. Änderungen unter
cli/ gelten sofort beim nächsten Aufruf, da hier kein Dienst läuft.
Eine praxistaugliche Installation für WordPress und verbreitete Plugins:
sudo apt install -y php-fpm php-cli php-mysql php-curl php-mbstring php-xml php-zip php-gd php-intl php-bcmath php-imagick php-opcache
| Paket | Aufgabe |
|---|---|
php-fpm | Verwaltet PHP-Worker für Caddy, Nginx und Apache-FPM. |
php-mysql | MySQLi- und PDO-Verbindung zu MariaDB/MySQL. |
php-curl | Remote-Anfragen, Updates, APIs und externe Dienste. |
php-mbstring | Verarbeitung mehrbytefähiger Zeichen und UTF-8. |
php-xml | DOM, XML, SimpleXML und zahlreiche Plugin-Funktionen. |
php-zip | Installation und Entpacken von Themes, Plugins und Updates. |
php-gd | Grundlegende Bildbearbeitung und Thumbnail-Erzeugung. |
php-imagick | Erweiterte Bildverarbeitung; sinnvoll zusätzlich zu GD. |
php-intl | Internationalisierung, Datums-, Sprach- und Formatfunktionen. |
php-bcmath | Exakte Berechnungen, häufig von Shop- oder Payment-Plugins genutzt. |
php-opcache | Speichert kompilierten PHP-Bytecode und verbessert die Leistung. |
php -v
php -m
php --ini
sudo systemctl restart php8.5-fpm
sudo systemctl status php8.5-fpm --no-pager
php8.5-fpm durch den tatsächlichen Dienstnamen deines Systems.
Die Datei liegt je nach SAPI beispielsweise unter /etc/php/8.5/fpm/php.ini.
memory_limit = 256M
upload_max_filesize = 64M
post_max_size = 64M
max_execution_time = 120
max_input_vars = 3000
expose_php = Off
display_errors = Off
log_errors = On
Für einen kompakten Ubuntu-VPS ist MariaDB meist die unkomplizierte Standardwahl.
sudo apt install -y mariadb-server
sudo systemctl enable --now mariadb
sudo mariadb-secure-installation
sudo mariadb
CREATE DATABASE wordpress
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
CREATE USER 'wordpress'@'localhost'
IDENTIFIED BY 'EIN_SEHR_STARKES_PASSWORT';
GRANT ALL PRIVILEGES ON wordpress.* TO 'wordpress'@'localhost';
FLUSH PRIVILEGES;
EXIT;
sudo ss -lntp | grep 3306
Gewünscht ist in einem Einzelserver-Setup typischerweise 127.0.0.1:3306,
nicht 0.0.0.0:3306.
cd /tmp
curl -O https://wordpress.org/latest.tar.gz
tar -xzf latest.tar.gz
sudo rsync -a wordpress/ /var/www/example/public/
sudo chown -R www-data:www-data /var/www/example/public
sudo find /var/www/example/public -type d -exec chmod 755 {} \;
sudo find /var/www/example/public -type f -exec chmod 644 {} \;
cd /var/www/example/public
sudo -u www-data cp wp-config-sample.php wp-config.php
sudo -u www-data nano wp-config.php
define( 'DB_NAME', 'wordpress' );
define( 'DB_USER', 'wordpress' );
define( 'DB_PASSWORD', 'EIN_SEHR_STARKES_PASSWORT' );
define( 'DB_HOST', 'localhost' );
define( 'DB_CHARSET', 'utf8mb4' );
curl -s https://api.wordpress.org/secret-key/1.1/salt/
php_fastcgi üblicherweise ohne .htaccess.mod_rewrite und AllowOverride All relevant.try_files $uri $uri/ /index.php?$args; übernimmt die Rewrite-Funktion.777 vergebensudo apt install -y ufw
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
sudo ufw status verbose
Damit du Dateien im Webverzeichnis bearbeiten kannst, ohne für jeden Zugriff sudo
zu benötigen, und neu angelegte Dateien automatisch die richtige Gruppe erhalten, den eigenen
Benutzer zur Gruppe www-data hinzufügen:
sudo usermod -aG www-data USERNAME
newgrp www-data.
Das Verzeichnis anschließend der Gruppe www-data zuordnen und mit dem
SGID-Bit (Set-Group-ID) versehen, damit neu angelegte Dateien und Unterordner automatisch
diese Gruppe erben statt der primären Gruppe des erstellenden Benutzers oder Prozesses:
sudo chown -R USERNAME:www-data /var/www/example
sudo find /var/www/example -type d -exec chmod g+s {} \;
www-data) statt der primären Gruppe des
erstellenden Benutzers oder Prozesses (z. B. PHP-FPM). So bleiben Dateiberechtigungen
zwischen manuellen Änderungen per SSH/SFTP und Schreibvorgängen des Webservers (Uploads,
Caches, Updates) konsistent.
Damit neu erstellte Dateien innerhalb der Gruppe auch beschreibbar sind, zusätzlich einen
passenden umask-Wert für den Benutzer setzen:
echo 'umask 002' | sudo -u USERNAME tee -a /home/USERNAME/.bashrc
sudo chgrp -R www-data /var/www/example nachträglich der Gruppe zuordnen.
sudo apt install -y unattended-upgrades
sudo dpkg-reconfigure --priority=low unattended-upgrades
sudo ss -lntp | grep -E ':80|:443|:3306'
systemctl --type=service --state=running | grep -E 'caddy|apache2|nginx|php.*fpm|mariadb|mysql'
sudo caddy validate --config /etc/caddy/Caddyfile
sudo apache2ctl configtest
sudo nginx -t
sudo journalctl -fu caddy
sudo journalctl -fu apache2
sudo journalctl -fu nginx
sudo journalctl -fu php8.5-fpm
sudo journalctl -fu mariadb
| Fehler | Wahrscheinliche Ursache |
|---|---|
| 502 Bad Gateway | PHP-FPM läuft nicht oder falscher Socket konfiguriert. |
| 403 Forbidden | Dateirechte, DocumentRoot oder Zugriffsregel fehlerhaft. |
| Port already in use | Ein anderer Webserver belegt bereits Port 80 oder 443. |
| HTTPS-Zertifikat schlägt fehl | DNS zeigt nicht auf den VPS oder Port 80/443 ist blockiert. |
| WordPress-Datenbankfehler | Zugangsdaten, Benutzerrechte, DB-Host oder PHP-MySQL-Modul prüfen. |
| Permalinks liefern 404 | Rewrite-/try_files-Regel fehlt oder Apache-.htaccess wird nicht erlaubt. |
| Situation | Empfehlung |
|---|---|
| Mehrere APIs, Bots, Dashboards und Subdomains | Caddy |
| Klassische WordPress-Projekte mit .htaccess-Abhängigkeiten | Apache2 |
| Bewusst fein abgestimmtes, stark frequentiertes Setup | Nginx |
| Kleiner VPS mit möglichst einfacher Administration | Caddy |
| Migration eines traditionellen Shared-Hosting-Projekts | Apache2 |
Quellen und weiterführende Dokumentation: Caddy Installation · Caddy php_fastcgi · Ubuntu Apache2 · Ubuntu PHP · Nginx Dokumentation · WordPress Anforderungen · WordPress Hosting Handbook
↑ Nach oben