Diese Serie wird euch hoffentlich zeigen, dass die Einrichtung eines Webservers, eines Mailservers und anderer nützlicher Dienste gar nicht so schwer ist, wie ihr vielleicht annehmt, und dass man mit einem preiswerten VPS (Virtual Private Server) sogar mehrere kleine Unternehmen bedienen kann.
Im Laufe der Jahre hatte ich die Gelegenheit, einige Websites einzurichten, sowohl statische als auch dynamisch generierte. Vor ein paar Jahren legte ich mich auf WordPress als Standard fest und baute anfangs einfach Websites mit Themes und Plugins auf, bis ich schließlich in den sauren Apfel biss und begann, meine eigenen PHP-Code-Schnipsel hinzuzufügen und später ein vollständiges, wenn auch einfaches, benutzerdefiniertes Theme zu erstellen. In diesem ersten Artikel werden wir uns mit der Ersteinrichtung unseres Ubuntu 20.04-Servers beschäftigen und ihn in einen netten kleinen LEMP-Server verwandeln. Ich setze voraus, dass man wenigstens ein Minimum an Kenntnissen über Terminal, SSH und die Installation von Paketen in Debian-basierten Distributionen mitbringt. Außerdem sollte man bereits eine Domain besitzen und wissen, wie man A-Records einrichtet.
Auswählen des Webhosting-Anbieters
Trotz der Beliebtheit von Diensten wie AWS, Azure und sogar Github Pages bevorzuge ich eine feinere Kontrolle über meine Webpräsenz. Zu diesem Zweck wähle ich oft zwischen zwei VPS-Anbietern – DigitalOcean und Contabo. DigitalOcean ist häufig eine beliebte Wahl aufgrund seiner leistungsstarken Tools, seiner großartigen Website und nicht zuletzt auch, weil es in der Vergangenheit eine Reihe von Tech/Linux-Medien gesponsert hat. Dort wurde es kürzlich von Linode verdrängt, aber dieser Einfluss ist immer noch vorhanden.
Digital Ocean
Meiner Erfahrung nach ist DO immer dann von unschätzbarem Wert, wenn man schnell und einfach etwas auf die Beine stellen will; wenn die Zeit knapp ist und man nicht vorhat, es auf unbestimmte Zeit zu behalten – eine perfekte Prototyping-Umgebung. In weniger als einer Minute ist eine Distribution deiner Wahl in ihrem „Vanilla“-Zustand einsatzbereit, nach deinen Bedürfnissen vorkonfiguriert, aus einem Backup/Snapshot geklont oder aus deinem eigenen Image importiert. Eine bessere SSH-Verwaltung, schnelle Backups/Snapshots und viele weitere Annehmlichkeiten werden jedoch durch einen geringen Basis-Speicherplatz und verständlicherweise höhere Preise erkauft.
Dank der großartigen Tutorials, der Zuverlässigkeit und einer Fülle von Einstellungen und Optimierungen, die man direkt im Web-Dashboard vornehmen kann, empfehle ich DigitalOcean für alle, die sich den Premium-Preis leisten können. Wenn man sich für diese Option entscheidet, kann man diesen Artikel eigentlich überspringen und sich direkt für einen LEMP-Server entscheiden, die öffentlichen SSH-Schlüssel einrichten und einfach der hervorragenden Dokumentation folgen, um so ziemlich alles einzurichten, was man tun möchte. Wenn man wie ich ein Geizkragen ist, der seine Ausgaben optimieren möchte, dann sollte man weiter lesen.
Contabo
Lasst mich das direkt klarstellen: Contabo hat keinen besonders guten Ruf. Es ist unglaublich billig. Ich kenne keinen VPS-Hoster, der auch nur annähernd mit Contabos Preis/(Leistung+Speicherplatz+Standort)-Verhältnis mithalten kann. Dafür opfert man die superschnelle Einrichtung – bei VPS kann es bis zu 3 Stunden dauern, bis sie eingerichtet sind, bei echter Hardware sogar noch länger. Außerdem verliert man einige der Tools, die man bei DigitalOcean genießen kann. Und wenn man sich die Einrichtungsgebühr sparen will, muss man das ganze Jahr im Voraus bezahlen. Mit ihrer gnadenlosen deutschen Effizienz schrecken sie auch nicht davor zurück, deinen Server bei jedem Anzeichen von Missbrauch zu sperren (z. B. bei einer gehackten WordPress-Instanz) und verlangen von dir, dass du deine Sache in Ordnung bringst und eine Gebühr von ca. 30 € bezahlst, bevor sie deinen VPS wieder anschließen. Auf der anderen Seite muss man viele E-Mails schreiben und darum betteln, dass sie sich an die verschiedenen IP-Blacklist-Dienste wenden, um einen Mailserver in ihrer IP-Region zu bekommen, der E-Mails an Gmail, Hotmail und andere beliebte Mail-Dienste (oder besser gesagt Sammler personenbezogener Daten) liefern kann.
Wenn man schließlich eine E-Mail von Contabo erhält, dass der VPS eingerichtet und einsatzbereit ist, erhält man auch einen Login und ein Passwort für den SSH-Zugang. Diese muss man so schnell es geht nutzen und ändern. Sie werden per unverschlüsselter E-Mail zugestellt und ermöglichen den uneingeschränkten Zugang zum Server. Wenn Du deswegen „gehackt“ wirst, habe ich kein Mitleid mit Dir.
Erste Einrichtung
Nachdem dein VPS nun läuft, öffne deinen bevorzugten Terminalemulator und logge dich mit ssh ein.
ssh root@vps-ip-adresse
Sobald man drin ist, legt man einen neuen Benutzer an, gewährt ihm sudo-Rechte, beendet die root-Benutzersitzung, meldet sich mit dem eigenen Benutzer an und deaktiviert das root-Passwort.
adduser dein-username usermod -aG sudo dein-username exit ssh dein-username@vps-ip-adresse sudo passwd -l root
Ich richte ssh auch gerne so ein, dass es nur Verbindungen von Clients mit meinen privaten ssh-Schlüsseln annimmt. Ihr könnt das Wichtigste über ssh-Schlüssel in diesem großartigen Artikel auf freecodecamp.org lernen. Zuerst muss man einen versteckten .ssh-Ordner in seinem Home-Ordner anlegen, dann eine Datei namens authorized_users erstellen, diese so ändern, dass sie nur vom Besitzer gelesen und geändert werden kann und dann den öffentlichen Teil des Schlüssels einfügen.
mkdir ~/.ssh touch ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys nano ~/.ssh/authorized_keys
Danach sollte die Datei ungefähr so aussehen:
Meine Datei hat vier Zeilen, weil ich vier Clients habe (meine Linux-Workstation, mein Macbook Air, mein iPad und mein iPhone), die ich zur Verwaltung dieses Servers verwenden werde.
Dann öffnet man die Konfigurationsdatei für den ssh-Daemon und deaktiviert die Passwortanmeldung. Achtung, danach kann man sich von keinem Rechner aus anmelden, der seinen öffentlichen ssh-Schlüssel nicht in der eben erwähnten authorized_keys-Datei hat!
sudo nano /etc/ssh/sshd_config
Dort sucht man nach der Zeile
#PasswordAuthentication yes
und ändert sie in
PasswordAuthentication no
Danach speichert man die Datei, schließt den Editor und startet den ssh-Daemon neu:
sudo systemctl restart ssh
Zu guter Letzt aktivieren wir den Firewall-Manager ufw. Ich mag ufw, weil es eine sehr einfache Syntax hat und nicht so abschreckend ist wie die Konfiguration von iptables. In den nächsten drei Zeilen erlauben wir OpenSSH, durch die Firewall zu kommunizieren, schalten die Firewall an und überprüfen den Status der Firewall.
sudo ufw allow OpenSSH sudo ufw enable sudo ufw status
Im Moment akzeptiert der Server nur SSH-Verkehr (und sein Hypervisor akzeptiert VNC, es sei denn, man hat es klugerweise deaktiviert), was gut ist, denn man sollte nur den Zugriff auf Dienste erlauben, die man eingerichtet hat und von denen man weiß, was sie tun.
LEMP
LEMP ist ein Akronym, das für Linux, Nginx, MySQL und PHP steht. Es ist eine Alternative zu dem sehr beliebten LAMP, das Apache anstelle von Nginx verwendet. Viele bevorzugen das eine oder das andere, aber ich mag die einfache Syntax und die großartige Performance von Nginx. Unser Setup tauscht auch das Oracle-verseuchte MySQL gegen das kompatiblere MariaDB aus und wir installieren PHP 8.0 aus einem PPA eines Drittanbieters anstelle der Standardversion 7.4, die im offiziellen Canonical-Repository enthalten ist. Das ist meine persönliche Wahl – die erste ist eher politisch, die zweite hat mit Performance und Zukunftssicherheit zu tun. Zwei meiner häufig genutzten Webanwendungen – WordPress und Nextcloud – bevorzugen PHP 8.0 und werden es auch bald voraussetzen. Normalerweise verzichte ich auf die Verwendung von PPAs von Drittanbietern und warne sogar davor, aber in diesem Fall mache ich eine Ausnahme, weil es der einzige „einfache“ Weg ist, es zu installieren und weil dieses PPA von einem renommierten Debian-Mitarbeiter, Ondřej Surý, betreut wird. Wenn dein Server anfängt, Geld einzubringen, ziehe bitte in Erwägung, ihm ein paar Kröten über seinen Patreon zukommen zu lassen. Als erstes müssen wir ein Paket installieren, um Repositories von Dritten hinzufügen zu können. Danach fügen wir das Repository an sich hinzu.
sudo apt install software-properties-common -y sudo add-apt-repository ppa:ondrej/php -y
Sobald das Repository hinzugefügt wurde, kann man Nginx, MariaDB und PHP 8.0 mit allen benötigten Erweiterungen installieren. Ich werde alles installieren, was für eine grundlegende LEMP-Installation benötigt wird, und wahrscheinlich in späteren Teilen dieser Serie noch weitere installieren, falls es nötig ist. Dieser Befehl sollte alles installieren, was man zu diesem Zeitpunkt benötigt:
sudo apt install nginx mariadb-server php8.0 php8.0-fpm php8.0-mysql -y
Nachdem kurz darauf dann alle Pakete installiert sind, öffnet man die Ports für Nginx:
sudo ufw allow 'Nginx Full'
Dann kopiert man die Standardkonfigurationsdatei und nimmt die notwendigen Änderungen vor:
sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/your-site sudo nano /etc/nginx/sites-available/your-site
server { listen 80; listen [::]:80; root /var/www/your_server_dir; index index.html index.htm index.php; server_name yourserverdns.com www.yourserverdomain.com; location / { # Erst versuchen, eine passenden Datei zu liefern, # dann ein passendes Verzeichnis, # dann auf Fehler 404 zurückfallen. try_files $uri $uri/ =404; } # PHP Skripte an den FastCGI Server durchreichen. location ~ \.php$ { include snippets/fastcgi-php.conf; # Mit php-fpm (oder anderen Unix Sockets): fastcgi_pass unix:/var/run/php/php8.0-fpm.sock; # Mit php-cgi (oder anderen TCP Sockets): # fastcgi_pass 127.0.0.1:9000; } }
Nachdem man die Konfigurationsdatei gespeichert und geschlossen hat, kann man nun einen symbolischen Link zu /etc/nginx/sites-enabled/ erstellen, damit die Konfiguration aktiviert wird und getestet werden kann:
sudo ln -s /etc/nginx/sites-available/your-site /etc/nginx/sites-enabled/ sudo nginx -t
Wenn die nginx-Konfiguration in Ordnung ist, kann man nun sein SSL-Zertifikat bei LetsEncrypt anfordern.
sudo certbot --nginx --agree-tos -m your@email.com -d yourserverdomain.com -d www.yourserverdomain.com
Zum Schluss können wir das Verzeichnis für unseren Webserver erstellen und unsere Nginx- und PHP-Installation in einem Rutsch testen.
sudo mkdir /var/www/dein_server_verzeichnis echo -e '<?php \n phpinfo();' | sudo tee /var/www/dein_server_verzeichnis/index.php sudo chown -R www-data:www-data /var/www/dein_server_verzeichnis sudo systemctl restart nginx
Nun wechselt man einfach in einem Browser seiner Wahl zu seiner Domain und es sollte etwa so aussehen:
Nicht vergessen, diese Datei zu löschen:
sudo rm /var/www/dein_server_verzeichnis/index.php
Man kann das Einrichten der nginx-Konfiguration, das Anfordern des SSL-Zertifikats usw. wiederholen und so mehrere Websites unter mehreren Domains hosten. In den zukünftigen Teilen dieser Tutorial-Serie werde ich die Installation von WordPress, einem Mailserver, Nextcloud und möglicherweise mehr behandeln.
Dieser Artikel erschien auch auf Michal’s Blog und wurde von André Hahn übersetzt.