Neuigkeiten    Das Projekt    Technik    RoboSpatium    Unterstützung    Stichwortverzeichnis    Download    Reaktionen    Spiele    Kauftipps    Kontakt   




<<< Python: Kommandozeilenparameter         Sicheres Kommunikations-Terminal (SKT) >>>

Apache Webserver

Wozu wird ein Webserver benötigt?

Webserver sind diejenigen Computer im World Wide Web, welche Inhalte bereitstellen, die dann per Browser abgerufen werden können. Dieser Text, der gerade auf eurem Bildschirm angezeigt wird, ist auf einem derartigen Rechner, auch Server, also "Bereitsteller" genannt, als Datei abgespeichert. Um diese Datei aufzurufen, habt ihr entweder die Addresse meines Servers eingegeben (was unwahrscheinlich ist, denn die kenne selbst ich nicht auswendig), oder seid einem sogenannten Hyperlink (kurz: Link) gefolgt (was wahrscheinlicher ist). Die abrufbaren Webseiten sind auf dem Webserver im Hypertext Markup Language Format gespeichert. Dabei handelt es sich um Textdateien, welche spezielle Befehle beinhalten können. Ein Link ist ein derartiger Befehl, der euch zu einer anderen Webseite weiterleitet, sobald ihr diesen anklickt.
Damit ein Computer als Webserver fungieren kann, muss eine entsprechende Software installiert werden, welche all die nötigen Befehle interpretieren kann, die ihr (meist unbewusst) sendet, um eine Seite betrachten zu können. Die verbreitetste derartige Software ist der Apache Webserver, dessen Quellcode von der Apache Software Foundation, gepflegt und für alle frei zur Verfügung gestellt wird.

Fernsteuern per WWW

Sobald mehr als ein Computer benötigt wird, um ein Projekt zu verwirklichen, müssen diese Rechenknechte miteinander kommunizieren. Diese Kommunikation mit Hilfe des Hypertext Transfer Protocol über Webserver abzuwickeln, vereinfacht die nötige Programmierarbeit auf zweierlei Arten:
(1) Man kann auf eine weltumspannende Infrastruktur zugreifen.
(2) Mit einem Browserinterface kann man sehr schnell eine grafische Benutzeroberfläche einrichten, die auf sehr vielen unterschiedlichen Betriebssystemen läuft, ohne Abhängigkeiten zu irgendwelchen "App-Stores" mit zweifelhaften Nutzungsbedingungen aufzubauen.

Apache installieren

Die hier beschriebene Installationsanleitung bezieht sich auf RaspiOS und gilt somit für fast alle auf Debian Linux basierende Betriebssysteme.

In dem Beispiel gehe ich davon aus, dass Raspberry Pi OS with desktop installiert ist (Lite kann zu Problemen führen). Es ist dringend zu empfehlen, eine Neuinstallation von RaspiOS vorzunehmen, wenn Probleme beim Installieren auftreten oder der Wesbserver anschließend nicht korrekt funktioniert.
  • Auf derm Raspberry Pi ein Terminalfenster öffnen (Ctrl+Alt+T) und in das home Verzeichnis wechseln (sollte das nicht schon der Fall sein):
    cd /home/pi
  • Die Paketverwaltung aktualisieren mit:
    sudo apt-get update
  • Apache Webserver installieren mit:
    sudo apt-get install apache2
  • Die Verzeichnisse "www" und "www/python" anlegen mit:
    mkdir www
    mkdir www/python
  • Nun die Datei
    /etc/apache2/sites-available/000-default.conf
    mit einem Texteditor öffnen:
    sudo nano /etc/apache2/sites-available/000-default.conf
    und die Zeile:
    DocumentRoot /var/www/
    ändern in:
    DocumentRoot /home/pi/www/
  • Die Datei:
    /etc/apache2/apache2.conf
    mit einem Texteditor öffnen:
    sudo nano /etc/apache2/apache2.conf
    und am Ende die folgenden Zeilen einfügen:
    ScriptAlias /cgi-bin/ /home/pi/www/python/ <Directory /home/pi/www/python/> Options ExecCGI AddHandler cgi-script cgi py </Directory> <Directory /home/pi/www/> Options Indexes FollowSymLinks AllowOverride None Require all granted </Directory>
  • Aktiviere das Ausführen von CGI Skripts mit:
    sudo a2enmod cgi
  • Es muss eine Nutzergruppe "www-data" existieren:
    sudo addgroup www-data
  • Um auf die GPIOs zugreifen zu können, muss der User "www-data" der Gruppe "gpio" hinzugefügt werden:
    sudo adduser www-data gpio
    Sollen ferner über den Webserver Bilder von der Raspberry Kamera übertragen werden, wie ich es bei meinen Robotern mache, so muss der User "www-data" auch der Gruppe "video" hinzugefügt werden:
    sudo adduser www-data video
  • Führe einen Neustart von Apache durch:
    sudo systemctl restart apache2
  • Nun kann getestet werden, ob der Webserver ordnungsgemäß läuft. Öffne dazu einen Browser und gebe die IP-Adresse des Rechners mit dem Webserver ein, z.B.:
    http://192.168.2.104
    Es muss unbedingt "http://" vor der IP-Adresse eingegeben werden, da der Browser ansonsten versucht, eine verschlüsselte Verbindung (https://) aufzubauen, was nicht gelingen wird. Die IP-Adresse des Linuxrechners mit dem Webserver könnt ihr mit dem Befehl:
    ifconfig
    herausfinden. Die Ausgabe lautet in etwa:
    wlan0: flags=4163  mtu 1500
            inet 192.168.2.104  netmask 255.255.255.0  broadcast 192.168.2.255
            inet6 2003:f0:af25:88e7:abe:acff:fe06:7974  prefixlen 64  scopeid 0x0
            inet6 fe80::abe:acff:fe06:7974  prefixlen 64  scopeid 0x20
            ether 08:be:ac:06:79:74  txqueuelen 1000  (Ethernet)
            RX packets 28054  bytes 18046269 (17.2 MiB)
            RX errors 0  dropped 206  overruns 0  frame 0
            TX packets 7293  bytes 1136959 (1.0 MiB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
              
    direkt hinter "inet" wird die gesuchte IP-Adresse angezeigt. Wird die Apache Testseite angezeigt, so ist die Installation abgeschlossen.

Einen GPIO per Webserver schalten

Als Nächstes soll ein GPIO über ein Python Skript geschaltet werden. Ich verwende dazu das Beispiel aus dem Kapitel Python: Ein- und Ausschalten von GPIOs. Dieses muss nur ein wenig abgeändert werden, da der Webserver erwartet, dass bestimmte Zeilen als Text zu Beginn und am Ende des Skripts ausgegeben werden:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#!/usr/bin/env python  
 
# To make a Python script work on a web server,  
# special text lines must be printed at the beginning:  
 
print("Content-type: text/html\n\n") # double line ending needed!  
print("<html><head>")  
print("")  
print("</head><body>")  
 
 
import RPi.GPIO as GPIO   
from time import sleep    
 
GPIO.setmode(GPIO.BOARD)  
 
GPIO.setup(16, GPIO.OUT)  
 
loopCount = 0  
 
while (loopCount < 3):  
    GPIO.output(16, GPIO.HIGH)  
    sleep(0.1)                  
    GPIO.output(16, GPIO.LOW)   
    sleep(1)                    
    loopCount = loopCount + 1   
      
GPIO.output(16, GPIO.HIGH) # Turn LED ON  
sleep(2)                   # Do nothing for 2 seconds  
GPIO.output(16, GPIO.LOW)  # Turn LED OFF  
 
# Free all GPIOs for use in other programs    
GPIO.cleanup()    
 
print("...all done, end of script reached!")  
 
# Finally a terminating text line must be printed to make the script  
# work with a web server:  
print ("</body></html>")  
    
  • Ist das Python Skript in dem Verzeichnis "/home/pi/" unter dem Namen "blink.py" gespeichert, so muss dieses als ausfühtbare Datei deklariert:
    chmod a+x blink.py
    und in das Unterverzeichnis "www/python/" kopiert werden:
    sudo cp blink.py www/python/
  • Nun kann das Skript ausgeführt werden, indem in einem Browser die IP-Adresse des Webservers, gefolgt von "/python/blink.py" eingegeben wird:
    http://192.168.2.104/python/blink.py
    Erneut ist zu beachten, dass der IP-Adresse "http://" vorangestellt wird!
  • Die LED sollte zu blinken beginnen und anschließend der Text:
    "...all done, end of script reached!"
    im Browser erscheinen. Ruft ihr über den Browser den Quelltext von "http://192.168.2.104/python/blink.py" auf, so wird euch nicht der Quelltext des Python Skripts angezeigt, sondern der Quelltext der Webseite, welchen das Skropt über die "print" Befehle generiert hat:
    <html><head> </head><body> ...all done, end of script reached! </body></html> Das muss so sein, denn wir haben den Apache Webserver ja so configuriert, dass alle Dateien im Verzeichnis "www/python/", welche auf ".py" enden, ausgeführt und nicht als Text übertragen werden sollen. Hin zum Browser werden somit nur die Textzeilen übermittelt, welche das Skript über den "print" Befehl ausdruckt.

    Wird die Datei "blink.py" in das Basisverzeichnis des Webservers, in unserem Fall also nach "/home/pi/www/" kopiert:
    sudo cp blink.py www/
    und dann per Browser diese Datei mit der Adresse:
    http://192.168.2.104/blink.py
    aufgerufen, so wird entweder der Quelltext des Skripts in eurem Browser angezeigt, oder es wird euch angeboten, die Datei "blink.py" herunterzuladen und auf eurem Rechner zu speichern. Damit ein Skript ausgeführt wird, muss dieses
    (1) sich in dem Verzeichnis "/home/pi/www/python/" befinden,
    (2) die Dateiendung ".py" aufweisen,
    (3) die erste Zeile im Skript muss "#!/usr/bin/env python" sein,
    (4) das Bit für ausführbare Dateien muss gesetzt sein (sudo chmod a+x *.py),
    (5) die Datei muss im Besitz von www-data sein (sudo chown www-data:www-data /home/pi/www/python -R),
    (6) und schließlich muss das Skript über "print"-Befehle das Grundgerüst einer HTML-Datei ausgeben.
Der GPIO kann somit von jedem anderen Rechner angesteuert werden, der Zugang zu dem Raspberry Pi mit laufendem Webserver hat.

"Es klappt net!"

...ist wie immer keine Aussage, mit der euch irgend jemand weiter helfen kann! Jeder Installationsschritt des Apache Webservers gibt eine Meldung aus. Lest euch diese Meldungen gefälligst durch, denn dafür haben die Programmierer die Meldungen geschrieben! Sucht im Internet nach diesen Fehlermeldungen und euch wird geholfen. Ist bei der Installation (scheinbar) alles glatt gelaufen, es funktioniert aber dennoch nicht, so gibt der Browser einen Fehler aus, der weiter helfen kann. Besser ist es aber, im Fehlerspeicher des Webservers nachzuschauen:
tail /var/log/apache2/error.log
Besonders die in dieser Datei gespeicherten Meldungen sind hilfreich, wenn ihr jemanden um Hilfe bitten möchtet. Das kann für einfache Probleme über einen Kommentar auf dieser Seite geschehen. Für kniffligere Fälle solltet ihr vorher lesen, wie ihr mit mir in Kontakt treten könnt.

"Es klappt!" freut mich immer zu hören und bedarf keiner weiteren Ausführungen.
...und wer sich für diese Anleitung und eventuelle Hilfestellungen besonders bedanken möchte, kann gerne mit einer Spende einen Motivationsschub für weitere derartige Kapitel übermitteln - vielen Dank an alle, die davon schon Gebrauch gemacht haben!


Webserver Apache auf einem Raspberry Pi Model B+
Abbildung 1:
...wenn die LED blinkt, ist alles korrekt installiert. Der Webserver Apache läuft selbst auf einem Raspberry Pi Model B+ flüssig. Das Script habe ich mit einem Smartphone augerufen - es ist keine "App" nötig, ein Browser genügt.




<<< Python: Kommandozeilenparameter         Sicheres Kommunikations-Terminal (SKT) >>>


Neuigkeiten    Das Projekt    Technik    RoboSpatium    Unterstützung    Stichwortverzeichnis    Archiv    Download    Reaktionen    Spiele    Verweise    Kauftipps    Kontakt    Impressum   





Twitter YouTube Hackaday Patreon TPO