Raspberry-Server
Einen Raspberry-Pi als Webserver nutzen
Zuletzt aktualisiert am 17.03.2021- Vorwort
- Betriebssystem installieren
- Raspberry-Pi vorbereiten
- SSH-Verbindung
- Apache-Server aufsetzen
- SFTP (FTP) Zugang
- PHP
- DBMS: Datenbankmanagementsystem
- phpMyAdmin
- Dauerbetrieb
Nachfolgend wird beschrieben, wie ein Raspberry-Pi als Webserver eingesetzt werden kann. Dabei soll die Anleitung möglichst kurzgehalten und somit auf detailliertere Beschreibungen verzichtet werden. Daher werden einige grundlegende Kenntnisse im Umgang mit dem Raspberry-Pi vorausgesetzt.
Folgende Materialien habe ich verwendet:
- Raspberry-Pi 4 Model B mit Gehäuse
- Raspberry-Pi Netzteil (KSA-15E-051300HE)
- SD-Karte
- Funk- oder USB-Tastatur
- Mini-HDMI auf HDMI Adapter und HDMI-Kabel, um den Raspberry-Pi an einem Bildschirm anschließen zu können
- Netzwerkkabel
Das hier beschriebene Vorgehen wurde ausschließlich mit den oben aufgelisteten Materialien und dem Raspberry Pi OS Lite V5.4 getestet.
Zuerst steht die Wahl eines Betriebssystems bevor. Dabei habe ich mich für das Raspberry Pi OS Lite entschieden. Die Lite-Version verfügt über keine grafische Oberfläche und kann nur über eine Konsole bedient werden. Dies ist ausreichend, da der Raspberry-Pi nachher ohnehin headless (Ohne Peripherie wie Bildschirm oder Tastatur) arbeiten soll.
Es gibt mehrere Möglichkeiten das Betriebssystem zu installieren. In der Regel nutze ich balenaEtcher, um ein bootfähiges Betriebssystem auf eine SD-Karte zu schreiben. Dieser Vorgang ist relativ einfach und soll hier nicht weiter behandelt werden. Ansonsten finden sich viele Anleitungen dazu im Netz.
Der Raspberry-Pi kann nun mit dem Betriebssystem gestartet werden. Für die weiteren Schritte muss ein Bildschirm und eine Tastatur an dem Raspberry-Pi angeschlossen werden, da einige Einstellungen nur lokal angepasst werden können.
Grundlegende Konfigurationen
Ist der Mikrorechner vollständig hochgefahren, dann kann man sich mit den Standard-Login Daten (raspberrypi login: pi, Password: raspberry) am Raspberry anmelden. Mit folgendem Befehl gelangt man ins Konfigurations-Tool des Raspberry-Pi:
sudo raspi-config
Dort werden dann diese Einstellungen vorgenommen:
- System Options → Hostname: Name des Raspberry-Pi im Netzwerk.
- Interface Options → SSH aktivieren: SSH wird benötigt, damit der Raspberry-Pi später über das Netzwerk konfiguriert werden kann. Und SFTP benötigt SSH.
- Performance Options → GPU Memory: Da der Raspberry-Pi als Server kaum grafische Aufgaben zu erledigen hat, kann der dafür zugewiesene RAM-Speicher auf ein Minimum von 16MB verringert werden.
- Localisation Options: Stellt dort alle Einstellungen auf die für euch passenden Werte ein.
- Advanced Options → Expand Filesystem: Der Raspberry-Pi kann die volle Größe der SD-Karte ausnutzen.
- Update: Überprüfen, ob das Betriebssystem auf dem aktuellsten Stand ist.
Nach diesen Einstellungen kann das Konfigurations-Tool geschlossen werden. Der Raspberry-Pi wird am besten neu gestartet:
sudo reboot
pi-Benutzer umbenennen
Der Standard-Benutzer "pi" sollte aus Sicherheitsgründen nicht weiterverwendet werden. Entweder wird ein komplett neuer Benutzer angelegt und der pi-Benutzer anschließend gelöscht, oder der pi-Benutzer wird wie nachfolgend beschrieben abgeändert.
Zunächst muss man sich mit dem pi-User wieder an dem Mikrorechner anmelden. Während der pi-Benutzer genutzt wird, kann Dieser natürlich nicht geändert werden. Daher nutzen wir den ebenfalls standardmäßig vorhandenen Benutzer "root". Dieser ist normalerweise deaktiviert und kann erst mit der Einrichtung eines Passworts genutzt werden:
sudo passwd root
Das gesetzte Passwort muss nicht besonders sicher sein, da es nach diesem Vorgang wieder entfernt wird.
Nach der Vergabe des Passworts melden wir uns von pi-Benutzer ab:
logout
Anschließend melden wir uns am Benutzer root an und geben folgende Befehle ein:
-
Home-Verzeichnis-Pfad anpassen, Benutzer umbenennen, altes Home-Verzeichnis übernehmen:
sudo usermod -d /home/BENUTZERNAME -l BENUTZERNAME -m pi
-
Gruppenname ändern:
sudo groupmod -n GRUPPENNAME pi
-
Passwort ändern:
sudo passwd BENUTZERNAME
-
Besondere sudo-Rechte des pi-Benutzers löschen:
sudo rm /etc/sudoers.d/010_pi-nopasswd
-
root-Benutzer wieder deaktivieren:
sudo passwd -l root
Der Raspberry-Pi kann nun nochmal neu gestartet werden (sudo reboot). Der Bildschirm und die Tastatur werden nicht mehr benötigt und können abgebaut werden.
Die nachfolgenden Schritte werden alle über eine SSH-Verbindung durchgeführt. Der Bildschirm und die Tastatur werden am Raspberry-Pi nicht mehr benötigt.
Mittlerweile unterstützt Windows von Haus aus die Nutzung einer SSH-Verbindung. Dafür kann entweder die klassische Eingabeaufforderung oder PowerShell verwendet werden. Eine zusätzliche Software ist nicht notwendig.
Eine SSH-Verbindung wird standardmäßig wie folgt aufgebaut:
ssh BENUTZERNAME@HOSTNAME
Alternativ zum Hostname kann auch die IP-Adresse des Raspberry-Pi angegeben werden.
Mögliche Besonderheiten
Bei der ersten Verbindung ist der Mikrorechner für den PC noch unbekannt. Daher wird eine Sicherheitsabfrage auftauchen, welche bestätigt werden muss:
The authenticity of host 'Test (192.168.178.1)' can't be established.
ECDSA key fingerprint is SHA256:ILCeTj+OrwZGypT92mIJYxj1wDGjQ/LfcaqjcFI0cIs.
Are you sure you want to continue connecting (yes/no)?
Sollte der Mikrorechner bereits einmal unter einer anderen Konfiguration per SSH verbunden gewesen sein, oder wurde der ECDSA-Key aus anderen Gründen geändert, dann kann es zu einer Fehlermeldung kommen:
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ECDSA key sent by the remote host is
SHA256:P51oaCHJ7DkiAUx/zXBRS5cDfVkrT6/F0nEUjhrLzpk.
Please contact your system administrator.
Add correct host key in C:\\Users\\USER/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in C:\\Users\\USER/.ssh/known_hosts:1
ECDSA host key for HOSTNAME has changed and you have requested strict checking.
Host key verification failed.
Dieser Fehler kann behoben werden, indem der alte ECDSA-Key in der Datei (Auf dem PC) C:\Users\USER\.ssh\known_hosts durch den neuen Key ersetzt wird. Sollten in dieser Datei keine weiteren, wichtigen Daten vorhanden sein, dann kann Diese alternativ einfach gelöscht werden.
Als Server wird ein Apache HTTP Server genutzt. Dieser kann mit einem Befehl installiert werden:
sudo apt-get install apache2 -y
Direkt nach der Installation ist bereits eine Demoseite im Browser unter dem Hostnamen oder der IP-Adresse des Raspberry-Pi erreichbar:
Das Hauptverzeichnis des Servers befindet sich auf dem Raspberry-Pi im Ordner /var/www/html. Dort müssen alle weiteren Dateien, die der Server verarbeiten soll, abgelegt werden.
.htaccess-Dateien aktivieren
Möchte man z.B. eigene Fehlerseiten (403, 404, usw.) einbinden, dann kann dies in einer .htaccess-Datei angewiesen werden. Allerdings ist die Unterstützung von .htaccess-Dateien standardmäßig deaktiviert.
Um .htaccess-Dateien anwenden zu können, müssen wir die apache2.conf bearbeiten:
sudo nano +172 /etc/apache2/apache2.conf
Dort finden sich folgende Anweisungen (Bereits durch den oberen Befehl ausgewählt):
<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
Dort ändert man die Zeile "AllowOverride None" nach "AllowOverride All"
<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
Nun können auch .htaccess-Dateien verwendet werden.
Um einfach Dokumente mit dem Webserver austauschen zu können, wird eine FTP-Verbindung eingerichtet. Allerdings wäre der Betrieb eines eigenständigen FTP-Servers unnötig.
Stattdessen kann der SSH-Server genutzt werden, um FTP-Befehle auszuführen und somit Daten auf dem Webserver zu verwalten. Dieses Protokoll nennt sich SFTP.
Für den SFTP-Zugang wird natürlich ein Benutzer auf dem Raspberry-Pi benötigt. Dafür könnte der bereits existierende Standardbenutzer genutzt werden (Der, mit den wir bereits die ganze Zeit arbeiten).
Allerdings bezieht sich der SFTP-Zugang auf das Home-Verzeichnis eines Benutzers. Der Standardbenutzer soll jedoch noch für andere Dinge benutzt werden und somit nicht als Webserver-Verzeichnis dienen.
Daher wird ein neuer Benutzer angelegt:
sudo useradd BENUTZERNAME_SFTP -M
Der Benutzer wird ohne eigenes Home-Verzeichnis angelegt. Stattdessen weisen wir das Verzeichnis des Webservers zu:
sudo usermod -d /var/www/html/ BENUTZERNAME_SFTP
Um den Benutzer später nutzen zu können, muss ein Passwort zugewiesen werden:
sudo passwd BENUTZERNAME_SFTP
Damit der neue Benutzer nachher auf alle notwendigen Verzeichnisse zugreifen kann, weisen wir Ihm noch folgende Gruppe zu:
sudo usermod -G www-data BENUTZERNAME_SFTP
Als nächstes machen wir den Benutzer zum Besitzer des Webserver-Verzeichnis:
sudo chown BENUTZERNAME_SFTP:www-data -R /var/www/html
Zum Schluss werden noch die notwendigen Rechte für das Webserver-Verzeichnis eingestellt:
sudo chmod 775 -R /var/www/html
Nun kann mit entsprechender Software (z.B. FileZilla) per SFTP auf das Webserver-Verzeichnis zugegriffen werden. Die notwendigen Zugangsdaten sind die des angelegten Benutzers. Der Standard-Port ist 22.
Bisher können wir mit dem Server nur statische HTML-Seiten anzeigen. Für die Nutzung dynamischer Inhalte ist PHP ein wichtiges Werkzeug. Dieses kann auf dem Raspberry-Pi mit einem Befehl installiert werden:
sudo apt-get install php -y
Um PHP zu testen, erstellen wir eine Testseite.
Zunächst kann die statische Demoseite gelöscht werden:
sudo rm /var/www/html/index.html
Anschließend wird an selber Stelle eine neue php-Datei mit dem Namen index erstellt:
sudo nano /var/www/html/index.php
Diese Datei kann z.B. mit <?php phpinfo(); ?> gefüllt werden. Ruft man nun wieder die Startseite des Servers im Browser auf, dann sollte das Ergebnis ungefähr so aussehen (PHP funktioniert):
Auf dem Raspberry-Pi soll nun noch ein DBMS (Datenbankmanagementsystem) installiert werden. Dafür nutze ich das weit verbreitete MySQL, bzw. MariaDB System.
Zur Installation genügt zunächst ein Befehl:
sudo apt-get install mariadb-server -y
Um nun noch die Sicherheit des DBMS zu erhöhen, wird folgender Befehl ausgeführt:
sudo mysql_secure_installation
Mithilfe dieses Befehls wird ein Passwort für den root-Benutzer gesetzt. Alle gestellten Fragen sollten mit Ja (y) beantwortet werden.
Neuen Benutzer anlegen
Als Standard-Benutzer des DBMS wird der root-Benutzer genutzt. Da root allerdings nur für wichtige, administrative Zwecke genutzt werden sollte, wird ein neuer Benutzer für das DBMS erstellt.
Dazu loggt man sich zunächst in das DBMS ein:
sudo mysql -u root -p
Anschließend befindet man sich im "MariaDB monitor". Hier können wir eine Datenbank erstellen, welcher der Benutzer später nutzen soll:
CREATE DATABASE datenbankname;
Nun wird der neue Benutzer angelegt:
CREATE USER 'benutzername'@'localhost' IDENTIFIED BY 'passwort';
Dem Benutzer werden alle Rechte für die zuvor erstellte Datenbank zugewiesen:
GRANT ALL PRIVILEGES ON datenbankname.* TO 'benutzername'@'localhost';
Zuletzt werden die Rechte neu geladen und der MariaDB Monitor verlassen:
FLUSH PRIVILEGES;
quit
Um den neuen Benutzer zu testen, melden wir uns mit eben Diesen an:
sudo mysql -u BENUTZERNAME -p
Ist eine Anmeldung möglich, dann wurde der Benutzer richtig angelegt und kann verwendet werden.
Eine Administration der Datenbanken wäre über die Konsole des Raspberry-Pi sehr umständlich. Daher wird phpMyAdmin installiert, um diese Arbeit zu erleichtern.
Auch hier erfolgt die Installation mit einem Befehl:
sudo apt-get install phpmyadmin -y
Während der Installation erscheint ein Konfigurationsfenster. In diesem wählt man zunächst "apache2" aus. Die spätere Frage bezüglich der Konfiguration mit "dbconfig-common" wird verneint.
Hat die Installation geklappt, dann ist phpMyAdmin unter HOSTNAME/phpmyadmin, bzw. IP-ADRESSE/phpmyadmin erreichbar:
Dort kann man sich nun mit dem Benutzer, welchen wir im Abschnitt "DBMS: Datenbankmanagementsystem" eingerichtet haben, anmelden.
Pfad anpassen
Standardmäßig ist phpMyAdmin, wie oben erwähnt, unter HOSTNAME/phpmyadmin, bzw. IP-ADRESSE/phpmyadmin erreichbar. Dies kann ein Sicherheitsrisiko darstellen, weshalb der Standardpfad in der apache.conf geändert werden soll:
sudo nano +3 /etc/phpmyadmin/apache.conf
In dieser Datei befindet sich folgende Zeile:
Alias /phpmyadmin /usr/share/phpmyadmin
Dort ersetzt man "/phpmyadmin" durch den eigenen, gewünschten Pfad.
Der Apache-Server wird neu gestartet:
sudo /etc/init.d/apache2 restart
Danach ist phpMyAdmin unter dem neuen Pfad aufrufbar.
phpMyAdmin-Konfigurationsspeicher
Unter Umständen erscheint in phpMyAdmin ein Fehler, dass der phpMyAdmin-Konfigurationsspeicher nicht vollständig konfiguriert wurde. Diesen Fehler beheben wir, indem wir uns zunächst auf dem Raspberry-Pi mit root bei dem DBMS anmelden:
sudo mysql -u root -p
Anschließend führen wir ein Skript aus, welches uns die notwendige Datenbank mit den entsprechenden Tabellen erstellt:
\. /usr/share/phpmyadmin/sql/create_tables.sql
Des Weiteren wird ein Kontrollbenutzer benötigt, der angelegt werden muss:
CREATE USER 'phpmyadminmanager'@'localhost' IDENTIFIED BY 'phpmyadminmanagerpassword';
GRANT ALL PRIVILEGES ON `phpmyadmin`.* TO 'phpmyadminmanager'@'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;
Der MariaDB Monitor kann wieder verlassen werden (quit).
Der angelegte Benutzer muss nun noch in die "config.inc.php" eingetragen werden. Diese Datei öffnet man wie folgt:
sudo nano +77 /etc/phpmyadmin/config.inc.php
Dort editiert man folgende Zeilen:
-
Von:
$cfg['Servers'][$i]['controluser'] = $dbuser;
Nach:
$cfg['Servers'][$i]['controluser'] = 'phpmyadminmanager';
-
Von:
$cfg['Servers'][$i]['controlpass'] = $dbpass;
Nach:
$cfg['Servers'][$i]['controlpass'] = 'phpmyadminmanagerpassword';
Anschließend wird die Datei gespeichert und der Fehler sollte verschwunden sein.
Warning count();
Ein weiterer Fehler kann ungefähr so aussehen:
Dieser Fehler muss in der sql.lib.php Datei auf dem Raspberry-Pi behoben werden:
sudo nano +613 /usr/share/phpmyadmin/libraries/sql.lib.php
Dort editiert man die Zeile 613 (Bereits durch den oberen Befehl ausgewählt) wie folgt:
Von:
|| (count($analyzed_sql_results['select_expr'] == 1)Nach: (Änderung rot hervorgehoben.)
|| ((count($analyzed_sql_results['select_expr']) == 1)
Nachdem man sich bei phpMyAdmin neu eingeloggt hat, sollte der Fehler verschwunden sein.
Da sich der Raspberry-Pi als Server vermutlich im Dauerbetrieb befindet, gibt es noch einige Verbesserungsmöglichkeiten. Diese werden gut auf Elektronik-Kompendium.de beschrieben.