Een webserver met PHP (Raspbian)

Doel 

Een webserver draaien op je RPi (met Raspbian) waarmee je via PHP commando's kan uitvoeren of waarden uitlezen.

Benodigdheden 
Tutorial 

Als je een website zoals deze bezoekt wordt hij aan je gepresenteerd door een webserver. Ondanks dat de server waar je nu mee praat om deze website te zien een wat sterkere machine is, is onze RPi ook prima in staat om als webserver op te treden. In deze tutorial beginnen we met het serveren van een basis, puur html website met de webserver Nginx (Spreek uit: "Engine X"). Om de RPI via deze website ook leuke dingen te laten doen zoals het schakelen van lampen hebben we PHP nodig.

De webserver, Nginx

Zorg als eerste dat je software respository databases up-to-date zijn:
sudo apt-get update
Installeer vervolgens Nginx:
sudo apt-get install nginx
Start Nginx:
sudo /etc/init.d/nginx start
en zorg dat Nginx na elke reboot vanzelf weer start:
sudo update-rc.d nginx defaults
Zo, dat was het. Als je nu naar het IP adres van je RPi surft met je webbrowser wordt je begroet door de volgende boodschap:

nginx werkt

Je kunt meteen al wat leuke dingen doen, bijvoorbeeld Nginx gebruiken om files in mappen weer te geven. Noem hiervoor je de index.html tijdelijk even anders:
cp /usr/share/nginx/www/index.html /usr/share/nginx/www/index.html.bak
Open de Nginx configfile van je site:
sudo nano /etc/nginx/sites-enabled/default
en voeg onder "Location /" de volgende zin toe:

autoindex on;
om vervolgens Nginx te herstarten:
sudo /etc/init.d/nginx restart
Dan zie je dat Nginx je netjes een overzicht van de map /usr/share/nginx/www/ geeft:

Nginx directory listing

In dit plaatje heb ik de map Test_map aangemaakt als demo (met sudo mkdir /usr/share/nginx/www/Test_map). Nginx zal altijd een overzicht van de map geven behalve als er in de map een index.html of index.php file staat, dan wordt die pagina weer gegeven.

PHP

PHP aan de praat krijgen is iets lastiger maar je krijg er voor terug dat je webserver straks commando's kan uitvoeren. Bijvoorbeeld een lamp aanzetten als je op een knop drukt. Of de waarde van je thermometer weergeven op een webpagina. Als je php5-fpm installeert dan komen PHP en alles wat je verder nodig hebt vanzelf mee:
sudo apt-get install php5-fpm

Vervolgens moeten de de Nginx configfile ook aanpassen:
sudo nano /etc/nginx/sites-available/default
Voeg onder "Server {" aan het rijtje "index index.html index.htm", "index.php" toe, zodat er staat:

server {
        #listen   80; ## listen for ipv4; this line is default and implied
        #listen   [::]:80 default_server ipv6only=on; ## listen for ipv6

        root /usr/share/nginx/www;
        index index.html index.htm index.php;

...
Scroll verder naar de regel met "location ~ \.php$ {" en haal de hekjes weg van de eerste en de laatste 3 opties zodat er staat:
location ~ \.php$ {
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
        #       # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
        #
        #       # With php5-cgi alone:
        #       fastcgi_pass 127.0.0.1:9000;
        #       # With php5-fpm:
                fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_index index.php;
                include fastcgi_params;
        }
Sluit de file: ctrl-x, y, enter.
Start PHP-fpm
sudo /etc/init.d/php5-fpm start
En zorgt dat PHP-fpm ook start na een reboot:
update-rc.d php5-fpm defaults
Herstart als laatste Nginx:
sudo /etc/init.d/nginx restart

PHP zou nu moeten werken maar dat gaan we even testen. Delete eerst de standaard "index.html:
sudo rm /usr/share/nginx/www/index.html
Maak een nieuwe file "index.php" aan in dezelde map:
sudo nano /usr/share/nginx/www/index.php
Kopieer de volgende text de file in:

<html>
<head>
<title>Welcome to nginx!</title>
</head>
<body bgcolor="white" text="black">
<center><h1>Welcome to nginx!</h1></center>

<p>
<?php
phpinfo();
?>
</p>

</body>
</html>
Sla de file op: ctrl-x, y, enter.
Herlaad nu je RPi webpagina in de browser, je ziet een berg informatie over PHP staan:

Nginx met PHP

Je kunt je PHP commando nu weg halen uit de index.php (met ctrl-k knip je in nano in 1 keer een hele lijn weg) en er iets nuttigers neer zetten, als je de volgende code in je file plakt zie een aantal dingen die mogelijk zijn:

<html>
<head>
<title>Welcome to nginx!</title>
</head>
<body bgcolor="white" text="black">
<center><h1>Welcome to nginx!</h1></center>

<H2>Onder welke gebruiker wordt PHP code uitgevoerd?</H2>
<p>
<?php
echo exec ('whoami');
?>
</p>

<H2>Welke files staan er in de map /home/pi?</H2>
<p>
<?php
echo exec ('ls /home/pi');
?>
</p>

<H2>Wat is de temperatuur van de CPU van deze RPi?</H2>
<p>
<?php
echo exec ('cat /sys/class/thermal/thermal_zone0/temp');
?>
</p>

</body>
</html>
En ga zo nog maar even door. Als je een temperatuur sensor hebt, bijvoorbeeld een DS18B20 kun je PHP gebruiken om hem uit te lezen via een webpagina die draait op je eigen RPi. Dit soort leuke dingen volgen in latere tutorials want mijn DS18B20 is pas een paar dagen geleden binnen gekomen. Ik ben nog volop aan het uittesten hoe hij precies werkt en hoe hij met Python uitgelezen kan worden... Als dat allemaal lukt moet ik nog een manier vinden om real-time de waarden op een webpagina te krijgen (inmiddels is er wel een tutorial: Temperaturen meten met de RPi ). Oh en uiteraard moet ook nog op basis hiervan mijn ketel aan of uitgezet worden. Nog genoeg te doen dus.

Bronnen