Bild på min Raspberry server

Webbserver på Raspberry Pi 4 – en kort guide

Med en Raspberry Pi är det ganska enkelt att sätta upp en egen webbserver för lokal hosting av hemsidor. Den här guiden är inte en detaljerad steg-för-steg guide, utan mer en generell överblick över de olika delarna som behöver göras.

Slutprodukten är en klassisk ”LAMP”-server (Linux, Apache, MySQL, PHP) som är hyfsat snabb och som klarar av att driva ett flertal hemsidor samtidigt. Beviset för det är att denna hemsida (samt tre andra) körs på min Raspberry Pi 4.

Det här behöver du:

  1. En Raspberry Pi 4 (eller liknande varianter, helst ska den ha så mycket RAM-minne och processorkraft som möjligt. Ett chassi/skal kan vara bra med. För RPi4 rekommenderas också en fläkt för den blir ganska varm. Min idlar på ~64 grader utan fläkt med skal.)
  2. En Ethernetsladd för att ansluta Raspberryn till routern
  3. En router för att kunna ansluta Raspberryn till internet
  4. En datorskärm med HDMI uttag (Raspberry Pi 4 har micro-HDMI uttag)
  5. En micro-HDMI till HDMI (h-h) sladd/adapter (eller vilken kontakt du nu har i skärmen)
  6. En nätadapter till Raspberryn (Raspberry Pi 4 har micro USB-C uttag).
  7. En mus och tangentbord, båda med USB-uttag för att kunna styra Raspberryn
  8. Ett micro-SD-kort att installera Raspberryns operativsystem på, helst mellan 16 och 32 GB
  9. En hårddisk med USB-uttag att lagra all data på (helst en SSD, men en HDD funkar som sista utväg om hög hastighet inte är ett krav)

Operativsystemet

När du har alla delar är det dags att installera operativsystemet på Raspberryn. Det finns flera olika att välja på om man ska köra en webbserver, men i denna guiden används Raspbian NOOBS. (Hellre hade jag använt Ubuntu Server, men den är för komplicerad att installera tills RPi4 får stöd för USB-boot).

Ladda ned NOOBS härifrån: https://www.raspberrypi.org/downloads/noobs/, sedan anslut SD-kortet till datorn och flytta alla filer i zip-filen till rootmappen på SD-kortet. (Alt. kan man flasha operativsystemet (inte den zip-filen) på SD-kortet med t.ex. balenaEtcher eller liknande. Finns en guide här annars.) När NOOBS är installerat på SD-kortet så sätt i det i Raspberryn och anslut alla kablar till skärm, tangentbord, Ethernet m.m. Strömsladden är bra att sätta i sist. Hårddisken ska helst sitta i ett av de blåa USB 3.0 uttagen för maximal hastighet. Sätt i strömsladden så att Raspberryn startas.

Följ installationsinstruktionerna på skärmen, och välj NOOBS Lite, versionen utan desktop. Ett skrivbord ska inte användas på en webbserver då den bara använder extra processkraft och har en större attackyta. Välj hårddisken som installationsplats, inte SD-kortet! Detta gör så att boot-partitionen installeras på SD-kortet medans allt annat hamnar på hårddisken.

Mjukvaran / Servern

När det är klart och Raspberryn har kommit igång så är det dags att installera mjukvaran som utgör servern. Men före detta steget så är det bra att byta användarnamn och lösenord på både root och ”pi” kontot till något annat. En guide finns här. Använd alltid långa lösenord som är svåra att gissa. Vill du kunna ansluta till Raspberryn utan att koppla in en skärm hela tiden så kan du aktivera SSH. Det går att göra enkelt via raspi-config.

  • Börja med att uppdatera Raspberryn och installera Apache (eller Nginx) samt PHP. En bra guide finns här: https://pimylifeup.com/raspberry-pi-apache/ När Apache är installerat, en mapp för din webbsida är skapad, t.ex. /var/www/minhemsida/public_html/, alla permissions är korrekta och VirtualHost är konfigurerad så är det dags för databasen.
  • Som databas används MySQL (MariaDB), för att installera den: https://pimylifeup.com/raspberry-pi-mysql/. Skapa en databas och en användare med åtkomst till den.
  • Installera ett TLS-certifkat. Detta kan göras med Certbot, som hämtar och installer ett gratis certifikat från Let’s Encrypt. Guide finns här: https://pimylifeup.com/raspberry-pi-ssl-lets-encrypt/.

Säkerhet

Innan Raspberryn öppnas upp mot internet så är det bra att säkra den mot angrepp först. Raspberry har en bra dokumentation om detta. Det kan göras på flera olika sätt, men jag rekommenderar att du;

  • Stäng av rootåtkomst över SSH: kör ’sudo nano /etc/ssh/sshd_config’, hitta raden med ’PermitRootLogin yes’ och ändra den till ’PermitRootLogin no’. Spara filen med Ctrl+X, tryck på Y, och sedan Enter för att spara. Starta om sshd med ’sudo systemctl restart sshd’.
  • Installera fail2ban som bannar IP-adresser med upprepade felaktiga inloggningsförsök över t.ex. SSH.
  • Installera en brandvägg, t.ex. ufw och blockera alla portar förutom dom du behöver använda (i detta fall port 80 för HTTP, 443 för HTTPS och porten du använder för SSH, vanligtvis 22).
  • Byt SSH-port från 22 till något annat.
  • Använd SSH nycklar istället för lösenord.
  • Använd TLS för att kryptera anslutningen till hemsidan.
  • Använd en säker hashfunktion för lösenord, t.ex. bcrypt.
  • Håll Raspberryn uppdaterad genom att kolla efter uppdateringar ofta.
  • Avaktivera versionsnummer för felmeddelanden för Apache. Lägg till ”ServerSignature Off” och ”ServerTokens Prod” på var sin rad längst ner i /etc/apache2/apache2.conf.
  • Avancerat: Installera och konfigurera Apache modulerna mod_security och mod_evasive, 1, 2, 3. Glöm inte att aktivera reglerna för modSecurity. Denna del kräver lite mer konfiguration och kan vara krånglig i början. (Paketen heter libapache2-mod-security2 och libapache2-mod-evasive för Raspbian. Kör du WordPress så följ denna guide. Ändra /etc/modsecurity/crs/REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf)
Skärmbild av serverns loggfil
Varför det är nödvändigt att skydda servern från obehöriga.

Använder du WordPress går det att att använda fail2ban till inloggningssidan där med. T.ex. kan du installera ett plugin som loggar alla inloggningar till /var/log/auth.log. Ändra sedan fail2ban-konfigurationen så att den även lyssnar efter wordpress-loggen.

Hemsidan

När Raspberryn är skyddad så är det dags att skapa eller ladda upp det innehåll du vill ha på din hemsida i /var/www/exempel/public_html/. Vill du ha WordPress kan du installera det ganska enkelt. Har du redan en WordPress installation på en annan hemsida och vill flytta den till din nya server så kan du t.ex. använda ett kloningsverktyg och flytta alla filer manuellt, eller använda WordPress egna export/import verktyg (finns i adminpanelen -> Verktyg -> Import / Export). För att flytta min WordPress installation använda jag mig av pluginet Duplicator. Jag använde ”Two-part Install”, kopierade hela min /public_html/ mapp från min gamla server till min nya, och sen skapade ett ”Database-only” paket. Finns en bra guide på utvecklarnas hemsida om detta.

Dirigera Trafiken

Nu borde du ha en fungerande webbserver, men för att andra ska kunna ansluta till den måste du öppna upp portarna i din router, dvs port forwarding. Öppna upp port 80, 443 och den port du använder för SSH och peka dem till Raspberryns lokala IP (oftast något i stil med 192.168.1.123).

Har du en domän måste denna pekas om så att de som ansluter till din domän skickas till din Raspberry Pi server. Ändra zonfilerna (DNS-records) hos din domänhanterare så att A-record pekar på din routers publika IP-adress. (Det är bra om du har en statisk IP-adress. Dom flesta internetleverantörer använder dynamiska IP-adresser, men det brukar gå att få en statisk. Kolla hos din internetleverantör för mer information). Det brukar att räcka med att ändra A-record för ’minsida.se’. Efter ändringen tar det vanligtvis några minuter innan trafiken dirigeras om till din server.

DNS-records
Så här ser DNS-konfigurationen ut i cPanel för mig. Adressen draklyckan.se pekar på min publika IP-adress.

Efteråt

Nu kan du koppla bort alla sladdar och enheter förutom Ethernetsladden, hårddisken, SD-kortet samt strömsladden. Om t.ex. strömmen går så startar Raspberryn upp servern automatiskt när strömmen är tillbaks. Raspberryn ska nu klara sig själv, men du måste ändå hålla den uppdaterad, säker och ej för varm. Lyckas du låsa ute dig själv från t.ex. SSH så är det bara att ansluta tangentbordet och skärmen igen och logga in direkt istället.

Felsökning

403, Access Denied: Troligen fel i Apachekonfigurationen, eller felaktiga permissions för /public_html/ mappen. Kör ’sudo chown -R www-data:www-data /var/www/exempel/public_html/’ en extra gång. Kontrollera apache2.conf så att allt ser rätt ut (/etc/apache2/apache2.conf). Ibland behövs +FollowSymLinks som Options, eller AllowOverride All för .htaccess override, se en exempelkonfig nedan.

<Directory /var/www/exempelsida/public_html/>
Options -Indexes +FollowSymLinks -ExecCGI
AllowOverride All
Require all granted
</Directory>

”Fatal Error” i WordPress: Kan vara fel i .htaccess eller VirtualHost som dirigerar fel. I mitt fall var det att om jag skrev in draklyckan.se så dirigerades jag om till https://www.draklyckan.se, inte https://www.draklyckan.se. Det löste jag genom att sätta en permanent redirect till https://www.draklyckan.se i VirtualHost konfigurationen. Se nedan för /etc/apache2/sites-available/exempel.conf. Första VirtualHost redirectar all trafik till https://www….. medans andra stycker bestämmer var document root och loggfilerna ligger.

<VirtualHost *:80>
ServerName exempel.se
Redirect permanent / https://www.exempel.se/
RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

<VirtualHost *:80>
ServerName www.exempel.se
DocumentRoot /var/www/exempel/public_html
ErrorLog ${APACHE_LOG_DIR}/exempel_error.log
CustomLog ${APACHE_LOG_DIR}/exempel_access.log combined
</VirtualHost>

”Unable to connect” error i webbläsaren: Antingen har du lyckats banna din IP med fail2ban, eller så funkar inte Apache som den ska.

Kommer jag på fler fel eller mer nödvändig information så läggs det till i efterhand.

 

Har du gjort rätt så borde allt fungera som det ska. För mig tog det ca. 30 timmar över tre-fyra dagar för att få allt att fungera som det ska, men jag gjorde precis allt fel. Följer du guiderna så borde det gå bra. Är det något som är oklart eller du behöver hjälp med så är det bara att fråga 🙂 Fungerar det inte så testa att starta om hela Raspberryn. Kom ihåg att sökmotorer är din bästa vän när inget funkar 😀

Lämna en kommentar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *