Ein einziger Befehl — und ein sauberer VPS oder Dedicated Server wird in wenigen Minuten zu einem fertigen Webhosting: ohne Control Panel, ohne überflüssige Pakete und mit einer Konfiguration, die neue Domains selbstständig erkennt.
Das Skript ist voll funktionsfähig: Die Konfigurationen wurden über Jahre hinweg verfeinert und auf Hunderten von VPS und Dedicated Servern erprobt, und wir nutzen sie selbst täglich. Dennoch hängt vieles vom Hoster, dessen Einstellungen und anderen externen Faktoren ab — bitte prüfen Sie die Funktionsfähigkeit vor dem Produktiveinsatz.
Informationen#
Was es macht#
Richtet einen VPS oder Dedicated Server vollautomatisch von Grund auf für den Betrieb als Webserver ein.
Installiert:
- Nginx
- PHP-FPM in den Versionen 7.4 und 8.2 (umschaltbar in der Konfiguration)
- MariaDB
Worin der Nutzen liegt#
- Automatisierung — die universelle Konfiguration erspart die manuelle Einrichtung jeder einzelnen Domain (dazu weiter unten)
- Sicherheit — es gibt kein Control Panel, der Server kann also nicht über dessen Schwachstellen gehackt werden
- Sauberes System — keine unnötigen Pakete und keine überflüssige Software
- Flexibilität — alles lässt sich fein abstimmen, einschließlich komplexer Weiterleitungen und Redirects innerhalb des Servers
Was die universelle Konfiguration ist#
Das ist eine Webserver-Konfiguration, die automatisch erkennt, für welche Domain eine Anfrage eingeht, und sie in das richtige Verzeichnis leitet. Es genügt, in /var/www/ einen Ordner mit dem Domainnamen anzulegen (z. B. /var/www/google.com) und die Dateien dorthin hochzuladen — die Website funktioniert sofort, ohne zusätzliche Einstellungen.
Grundlegende Verwendung#
Wichtig! Das Skript funktioniert zu 100 % korrekt auf Rocky 9 und mit einer Wahrscheinlichkeit von 99,99 % auf CentOS 9. Die Verwendung von Rocky 8 oder CentOS 8 ist möglich, aber nicht empfehlenswert.
Nur ein sauberer Server! Kein LAMP und keine sonstigen Software-Pakete — nur das reine Betriebssystem. Fordern Sie es bei Ihrem Hoster an.
curl -s https://repo.privateflare.com/webhostscript/webhostscript.bash | bashNach wenigen Minuten ist der Server bereit. Verbinden Sie sich per SFTP (FileZilla, WinSCP, Transmit) und laden Sie Ihre Landingpages und Websites hoch.
Um die Funktionsfähigkeit zu prüfen, richten Sie eine beliebige Domain auf die IP des Servers und öffnen Sie sie im Browser. Erstellen Sie vorher eine Informationsdatei:
echo "<? phpinfo();" > /var/www/noroot/index.phpLöschen Sie sie nach der Prüfung unbedingt wieder:
rm -f /var/www/noroot/index.phpErweiterte Verwendung#
Alle Schritte werden per SFTP ausgeführt: FileZilla (Windows), WinSCP (Windows, empfohlen) oder Transmit (macOS).
Verwendung individueller Konfigurationen für Domains#
Das ist hilfreich, wenn auf einem Server mit gewöhnlichen White Pages, Landingpages und anderen einfachen Websites zusätzlich beispielsweise ein WordPress-Blog betrieben werden soll.
Bearbeiten Sie zunächst die Hauptkonfiguration von Nginx — sie befindet sich im Verzeichnis /etc/nginx:
Vorher:

Fügen Sie die Zeile include conf.d/*.conf; hinzu. Nachher:

Laden Sie die Konfiguration über die Konsole neu:
nginx -t && nginx -s reloadKopieren Sie anschließend die benötigte Vorlage: host_nossl.conf_ (in diesem Beispiel wird die Konfiguration ohne SSL-Zertifikate und HTTPS verwendet) nach google.com.conf.
Öffnen Sie die neue Datei google.com.conf und ersetzen Sie per Suchen-und-Ersetzen VHOST durch Ihre Domain (google.com). Den Rest passen Sie an Ihre Anforderungen an. Für WordPress sieht die Konfiguration beispielsweise so aus:
server {
listen 80;
server_name google.com; # <-- geändert
#access_log off;
error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log main;
root /var/www/google.com; # <-- geändert
index index.php index.html;
location ~ /.well-known {
root /var/www/noroot;
}
location / {
try_files $uri $uri/ /index.php?$args; # <-- geändert
}
location ~ \.php$ {
index index.php;
include php82.conf; # <-- geändert
}
}Speichern Sie die Datei und laden Sie die Konfigurationen neu:
nginx -t && nginx -s reloadDanach sollte der Blog bereits funktionieren.
Verwendung von SSL-(TLS-)Zertifikaten#
Das ist hilfreich, wenn Sie das Hosting direkt nutzen, ohne PrivateFlare oder Cloudflare.
Generieren Sie das Zertifikat.
Wichtig! Let’s Encrypt stellt Zertifikate manchmal nicht beim ersten Versuch aus — wegen Wartungsarbeiten, einer unvollständigen Aktualisierung der DNS-Einträge oder aus anderen Gründen. Wir stehen in keiner Verbindung zu dieser Organisation und können ihre Arbeit nicht beeinflussen. Prüfen Sie bei Störungen die A-Einträge und wiederholen Sie den Versuch später.
# In diesem Beispiel ist google.com Ihre Domain, ersetzen Sie sie durch Ihre eigene
# user@gmail.com ist Ihre E-Mail-Adresse, ersetzen Sie sie ebenfalls durch Ihre eigene
certbot certonly -d google.com -n --email user@gmail.com --agree-tos --webroot -w /var/www/norootWenn das Zertifikat erfolgreich generiert wurde, sehen Sie ungefähr diese Meldung:
Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/api.param.me/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/api.param.me/privkey.pem
Your cert will expire on 2019-06-27. To obtain a new or tweaked
version of this certificate in the future, simply run certbot again
with the "certonly" option. To non-interactively renew *all* of
your certificates, run "certbot renew"Gehen Sie anschließend genauso vor, verwenden Sie jedoch die Vorlage host_ssl.conf_. Die endgültige Konfiguration sieht so aus:
server {
listen 80;
server_name google.com; # <-- geändert
#access_log off;
error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log main;
location ~ /.well-known {
root /var/www/noroot;
}
location / {
# try_files $uri $uri/ /index.php?$args;
return 301 https://$host$request_uri;
}
}
server {
listen 443 ssl;
http2 on;
server_name google.com; # <-- geändert
client_max_body_size 32m;
root /var/www/google.com;
index index.php index.html;
ssl_certificate /etc/letsencrypt/live/google.com/fullchain.pem; # <-- geändert
ssl_certificate_key /etc/letsencrypt/live/google.com/privkey.pem; # <-- geändert
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_stapling on;
ssl_stapling_verify on;
error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log main;
location / {
try_files $uri $uri/ /index.php?$args; # <-- geändert
}
location ~ \.php$ {
index index.php;
include php82.conf;
}
}Erstellen Sie eine Cron-Aufgabe zur Erneuerung der Zertifikate. Führen Sie in der Konsole folgenden Befehl aus:
export EDITOR=nano && crontab -eund fügen Sie folgende Zeile hinzu:
0 0 1 * * /usr/bin/certbot renew --post-hook "systemctl reload nginx" > /var/log/renewals.logDrücken Sie Control+X und bestätigen Sie das Speichern mit der Taste Y — die Aufgabe ist erstellt.
Damit ist die Einrichtung abgeschlossen: Der Server läuft, und die Zertifikate werden automatisch erneuert.