De RPi als webserver (Arch Linux)

Doel 

Een (PHP) website serveren vanaf je RPi, optioneel over HTTPS

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. Om de RPI via deze website ook leuke dingen te laten doen zoals het schakelen van lampen hebben we PHP nodig. Soms is het ook handig om een website via HTTPS te serveren, bijvoorbeeld als je gevoelige informatie gaat versturen via de website, in het laatste deel activeren we HTTPS (SSL). Voor domotica dingen kun je dat deel overslaan.

Er is een 4 GB image beschikbaar op de images pagina waarop Nginx met PHP al draait (het eindresultaat van deze tutorial).

De webserver, Nginx

Zorg dat je root bent met su en installeer Nginx:
pacman -Sy nginx
Zet nginx aan en zorg dat nginx na een reboot vanzelf weer opstart:
systemctl start nginx
systemctl enable nginx
Als je je RPi hebt beveiligd zet dan nog even poort 80 open in je firewall:
ufw allow http
systemctl restart ufw
Zo dat is het. Surf maar naar het IP adres van je RPi (in mijn geval http://192.168.1.2), als het goed is zie je daar de standaard pagina van Nginx:

nginx

Als je deze pagina wilt aanpassen of vervangen, vind je de index.html in de map /usr/share/nginx/html/.

Je RPi werkt nu als webserver voor simpele html pagina's, als je wat meer wilt (en dat wil je), zoals je lampen schakelen dan moet je de RPi opdrachten kunnen geven via deze website. En dat doe je met PHP.

PHP

Om PHP opdrachten uit te voeren gebruiken gebruiken we de FastCGI server php-fpm. Wij installeren die (terwijl je root bent) uiteraard met:
pacman -Sy php-fpm
(Je ziet als het goed is dat PHP ook mee geïnstalleerd wordt.)
Als de installatie klaar is gaan we de boel configureren:
nano /etc/php/php.ini
Zoek (ctrl-w) naar open_basedir, de open_basedir variable moet ene lijst bevatten met locatie die PHP files bevatten. We voegen dus onze standaard Nginx locatie toe zodat er uiteindelijk iets staat als (het belangrijkste is dat /usr/share/nginx/html/ erbij staat):
open_basedir = /usr/share/webapps/:/srv/http/:/home/:/tmp/:/usr/share/pear/:/usr/share/nginx/html/
We moeten ook de configuratie van Nginx aanpassen:
nano /etc/nginx/nginx.conf
Vind het server{...} blok
en zorg dat onder location / {...} het volgende staat:
location / {
            root   /usr/share/nginx/html;
            index  index.html index.htm index.php;
        }
(Je hebt vergeleken met de standaard instelling dus alleen index.php toegevoegd aan het rijtje achter "index".)
Voeg de volgende tekst toe (ook onder het server{...} blok maar niet binnen de haken van andere definities!):
location ~ \.php$ {
      root /usr/share/nginx/html/;
      try_files      $uri = 404; 
      fastcgi_pass   unix:/run/php-fpm/php-fpm.sock;
      fastcgi_index  index.php;
      include        fastcgi.conf;
 }
Herstart Nginx en start en enable php-fpm:
systemctl restart nginx
systemctl start php-fpm
systemctl enable php-fpm

Om te testen of het allemaal goed is gegaan, en of je server dus iets kan met PHP code, hernoem je de index.html naar index.php:
mv /usr/share/nginx/html/index.html /usr/share/nginx/html/index.php
Open de file:
nano /usr/share/nginx/html/index.php En plak net na het stuk "<p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p>" de volgende PHP code:

<?php
 phpinfo();
?>
Sla de file op en sluit nano (ctrl-x, y, enter).

Als het goed is zie je nu als je naar je RPi website surft een hele berg informatie staan over je PHP installatie, zoals hieronder:

nginx met PHP

Ok, nu kan je server straks commando's ontvangen die onder andere je lampen zullen schakelen maar je het PHP ook nodig als je bijvoorbeeld een WordPress blog wilt draaien al is je RPi daar wel een beetje traag voor. Om dit in de toekomst allemaal te kunnen zonder dat iemand je kan afluisteren gaan we nu HTTPS opzetten.

HTTPS

HTTPS zorgt ervoor dat de verbinding tussen browser en website beveiligd is zodat niemand kan meekijken, zelfs niet op een onbeveiligd netwerk. Je hebt HTTPS verder niet nodig als je een simpele, alleen-lezen website draait of binnen je eigen netwerk je lampen wilt gaan schakelen.

Maak de map /srv/ssl/ en navigeer er heen (nog steeds als root):
mkdir /srv/ssl/
cd /srv/ssl/
Geef het volgende commando om de SSL certificaten te maken:
openssl req -new -x509 -days 730 -nodes -out /srv/ssl/nginx.pem -keyout /srv/ssl/nginx.key -newkey rsa:2048 Vul de gevraagde informatie in, let op, deze informatie is zichtbaar voor iedereen die straks naar je site surft, ik heb dan ook niet alles ingevuld.
We moeten Nginx zelf ook nog aanpassen, open de config file:
nano /etc/nginx/nginx.conf
Voeg onder het http{...} block (net voor server{...}) het volgende stukje config toe:

ssl_session_cache    shared:SSL:10m;
ssl_session_timeout  10m;
en zet "keepalive_timeout" op 70:
keepalive_timeout  70;
In het server{...} block voeg je toe (net voor de laatste "}"):
listen 443 ssl;
      ssl_certificate      /srv/ssl/nginx.pem;
      ssl_certificate_key  /srv/ssl/nginx.key;
Als je nu naar je RPi surft maar met https voor het adres (dus bijvoorbeeld https:/192.168.1.2) dan krijg je allerlei waarschuwingen, dat is omdat je certificaat niet bevestigd is door een autoriteit die je browser erkend. Dit erkennen kost geld maar helpt je er zeker van te zijn dat je met de goede website praat. Zuiver voor de beveiliging maar het niet uit dat het certificaat niet erkend wordt, al het verkeer wordt gewoon gecodeerd. Voor deze site heb ik ook zelf een certificaat gemaakt, probeer maar: https://rpi.nl.eu.org.

Veel plezier met je webserver, laat maar weten via de comments of de contact pagina wat voor cools je er mee doet.

Bronnen