28 gennaio 2017

tutorial: come creare un server web in casa con il raspberry pi 3


Benvenuti!
Questo tutorial vi aiuterà a portare a termine una configurazione iniziale di un server web "domestico" sul raspberry pi 3 (qui trovate tutti i miei focus su questo dispositivo).

Nota: il presente articolo contiene una infarinatura generale per farvi capire quelli che sono i concetti base, e non vuole assolutamente essere una guida definitiva. Dietro tutti gli argomenti toccati, infatti, c'è un mondo immenso di dettagli e criticità, cosa che va ben oltre gli scopi di questo tutorial. Se siete interessati ad approfondirli, però, non esitate a lasciare un commento o a contattarmi sui canali social.

Prima di addentrarci, vi riporto il video di supporto a questa guida che ho pubblicato sul mio canale YouTube:


Inoltre vi segnalo che nella pagina dedicata troverete tutti i tutorial da me pubblicati.


1. l'attrezzatura minima per iniziare


Per realizzare un server web "domestico" occorrono:
  1. un raspberry pi 3 (ma questa guida, con le dovute accortezze, va bene per qualsiasi altra SBC della fondazione) + una microSD (almeno di classe 10) + un alimentatore (da almeno 2.1A)
  2. un PC o smartphone o tablet
  3. un sistema operativo adatto all'uso server per il raspberry pi
  4. una connessione ad internet + un router + un cavo di rete

Per quanto riguarda il primo punto non occorre altro: non collegherete il raspberry pi ad un monitor esterno e non avrete, quindi, neppure la necessità di periferiche aggiuntive (come mouse o tastiera) per controllarlo. Il secondo punto è direttamente collegato con il primo: si raccomanda l'uso di un PC al fine di programmare e controllare il pi da remoto, ma per l'utilizzo finale può bastare anche solo uno smartphone o un tablet.
Configurare un server web significa avere la possibilità di installare determinati software (li vedremo fra poco), il che implica la necessità di disporre di un sistema operativo capace di eseguirli. Praticamente qualsiasi distribuzione Linux va bene, ma tra le tantissime a disposizione ce ne sono alcune che sono pensate già in partenza per essere utilizzate a mo' di server. Conviene perciò puntare su una di esse, ed io -se siete alle prime armi- vi consiglio Ubuntu Server (che in versione 16.04 è perfettamente compatibile con il raspberry pi 3).
Serve commentare il quarto punto? =D


2. la configurazione iniziale del raspberry pi e del sistema operativo


Il primo passo è quello di copiare su microSD l'immagine di Ubuntu Server 16.04. Sul sito ufficiale di canonical trovate tutte le istruzioni del caso. Una volta completata la copia potete inserire la microSD nel raspberry pi, collegare quest'ultimo al router tramite il cavo di rete, e avviare il pi collegandolo alla presa di corrente. A seconda della classe di velocità della vostra microSD, il sistema impiegherà da pochi secondi a diversi minuti per attivarsi (per questo è consigliato l'uso di una microSD almeno di classe 10).
A questo punto dal PC dovete accedere alla configurazione del vostro router (solitamente digitando il suo indirizzo IP sul browser, es: 192.168.1.1) per capire quale indirizzo IP è stato assegnato al raspberry pi. Se avete un router "chiuso" (come quelli forniti dagli operatori telefonici) potete provare ad indovinare l'indirizzo IP assegnato al pi tentando con il comando ping da terminale (su distribuzione Linux o macOS) o prompt dei comandi (su Windows): a seconda di quanti dispositivi (n) avete già connessi alla vostra rete domestica, è molto probabile che l'indirizzo IP assegnato al pi termini con un numero uguale ad n+1 (es: ping 192.168.1.3 se 2 sono i dispositivi già precedentemente connessi alla vostra rete).
Se proprio non doveste riuscire a capire quale è l'indirizzo IP, allora collegate un monitor ed una tastiera al raspberry pi, autenticatevi (utente: ubuntu, password: ubuntu) e digitate il comando: ifconfig che vi mostrerà la configurazione di rete attiva (l'indirizzo IP è accanto alla voce eth0).

Ad ogni modo, una volta scovato l'indirizzo IP assegnato dal router al pi, dal vostro PC potrete avviare una connessione SSH verso di lui così da poterlo controllare e configurare da remoto:
  • se utilizzate una distribuzione Linux o macOS allora basterà aprire il terminale e digitare: ssh ubuntu@<indirizzoip> (es: ssh ubuntu@192.168.1.2). Vi sarà richiesta la password (ubuntu), di accettare la richiesta di autenticità dell'host (yes) e sarete dentro!
  • se utilizzate Windows allora vi occorrerà scaricare un programma che vi permetta di connettervi in SSH, come PuTTY.

Una volta autenticati, potrete eseguire una serie di operazioni facoltative che personalmente vi consiglio di compiere:
  • se il layout della tastiera del vostro PC non è statunitense, dovrete cambiarlo con quello corrispondente al vostro (presumibilmente italiano). C'è una utility preinstallata sul sistema operativo che vi permetterà di scegliere il layout corretto:
    • digitare: sudo dpkg-reconfigure keyboard-configuration
    • seguire le istruzioni a video

  • se la microSD in uso ha una dimensione maggiore a 4 GB, allora vi suggerisco di espandere il file system così da poter sfruttare tutto lo spazio presente. Per far ciò basterà eseguire i seguenti passi:
    • digitare: sudo fdisk /dev/mmcblk0
    • digitare in sequenza (aspettando di volta in volta la richiesta successiva): d, 2, n, p, 2, premere invio, premere invio, w
    • riavviare il sistema con il comando: sudo reboot
    • sarete "buttati" fuori da SSH quindi, una volta che Ubuntu Server sia ripartito, dovrete riconnettervi con il terminale (Linux o macOS) o PuTTY (Windows) al raspberry pi con l'IP a lui assegnato dal router (presumibilmente lo stesso di prima)
    • digitare: sudo resize2fs /dev/mmcblk0p2

  • potete configurare la rete Wi-Fi in modo da non dover essere obbligati a collegare il pi al router via cavo. Oppure impostare un indirizzo IP statico cosicché il router stesso assegni sempre lo stesso IP al pi ad ogni sua riaccensione. Ciò che dovrete fare è fondamentalmente aggiornare le interfacce di rete affinché la vostra rete WiFi venga rilevata:
    • digitare: sudo vim.tiny /etc/network/interfaces
    • premere la lettera i (insert) sulla tastiera per entrare in edit mode
    • aggiungere alla fine del file un blocco di testo simile al seguente:

      auto wlan0
      iface wlan0 inet static
      address 192.168.1.150
      netmask 255.255.255.0
      gateway 192.168.1.1
      wpa-ssid "<il_nome_della_vostra_rete_wifi>"
      wpa-psk "<la_password_della_vostra_rete_wifi>"
      dns-nameservers 8.8.8.8 192.168.1.1

      • tutte le informazioni in grassetto dipendono da come è configurata la vostra rete locale. Il valore static serve per richiedere un indirizzo IP statico da assegnare al pi, indirizzo che è indicato nella riga successiva (address). Il valore gateway è l'indirizzo IP del vostro router (ripetuto anche nella voce dns-nameservers).
        Se non volete un indirizzo IP statico, è possibile utilizzare il dhcp (da digitare al posto di static) che lascia al router la decisione su quale indirizzo IP assegnare (e potenzialmente varierà ad ogni accensione del pi), quindi non sarà necessario specificare né address, né netmask, né gateway e nemmeno dns-nameservers
      • in address potete indicare un indirizzo IP qualsiasi, con l'ultimo gruppo (sono separati dai .) con un valore compreso tra 2 e 255. Attenzione a non indicare un indirizzo IP che collida facilmente con quelli utilizzati dagli altri dispositivi che usate in casa: se ad esempio siete soliti avere una decina (tra PC, smartphone, tablet, console, smart-tv, ...) di device collegati alla rete WiFi, allora è molto probabile che il router assegni loro indirizzi IP compresi tra xxx.yyy.zzz.1 e .10. Il consiglio è di specificare in address un numero più o meno elevato, che abbia scarse possibilità di collisione (nell'esempio precedente era indicato 150). Attenzione anche al valore indicato nel 3° gruppo: il vostro router potrebbe assegnare indirizzi IP appartenenti alla famiglia 192.168.0.x, quindi un possibile indirizzo IP statico potrebbe essere 192.168.0.150. O, ancora, se il vostro router rilascia indirizzi IP appartenenti ad altre famiglie allora dovrete configurare il tutto di conseguenza (es: 10.x.x.x)
      • chiaramente al posto di <il_nome_della_vostra_rete_wifi> e <la_password_della_vostra_rete_wifi> vanno indicati i rispettivi valori
    • premete il tasto ESC sulla tastiera, quindi digitare :wq (compreso i :)
    • riavviare il pi digitando: sudo reboot

  • se non volete utilizzare l'utente configurato di default, allora potrete aggiungerne uno nuovo con il comando: sudo useradd <nomeutente> (es: sudo useradd mariorossi) e seguire le istruzioni a video. Utente da utilizzare al prossimo riavvio oppure immediatamente digitando: su <nomeutente> (es: su mariorossi). Oppure potrete accontentarvi di modificare la password per l'utente base (ubuntu) semplicemente digitando: passwd e seguendo le istruzioni a video.

  • aggiornate il sistema operativo ed il software installato:
    • digitare: sudo apt-get update
    • digitare: sudo apt-get upgrade && sudo apt-get dist-upgrade


3. l'installazione di un server web


Completate le operazioni descritte nel paragrafo 2, il primo passo successivo è quello di installare il server Apache. L'installazione su Ubuntu Server è davvero banale, basterà infatti richiedere il pacchetto apache2 con il comando: sudo apt-get install apache2, confermare ed attendere che il gestore termini le sue operazioni.

Il secondo passo è quello di scegliere un linguaggio di programmazione che permetta di sviluppare sul pi una applicazione che possa essere richiamata da remoto. Per semplicità e per gli scopi di questo tutorial, puntiamo sul PHP: non solo questo linguaggio è facile se vorrete impararlo, ma è anche utilizzato in tantissimi prodotti open-source gratuiti che si possono scaricare da internet, e che possono essere usati come punto di partenza per i vostri progettini.
Installare il linguaggio PHP è semplice al pari di apache con la sola accortezza di installare oltre al linguaggio stesso anche i pacchetti che permettono ad Apache di interpretarlo. Andrà richiesto il pacchetto libapache2-mod-php che non solo installerà (come si intuisce dal nome) il linguaggio PHP (al momento in versione 7.0), ma porterà con sé tutto il necessario per Apache. Il comando è ovviamente: sudo apt-get install libapache2-mod-php.

A questo punto potremmo iniziare a giochicchiare con il nostro web server. Il demone di apache dovrebbe essere già attivo, e per controllarne lo stato basterà digitare: sudo service apache2 status. Nel qual caso non fosse stato già avviato, il comando da digitare per attivare Apache è: sudo service apache2 start. Allo stesso modo, per riavviarlo oppure fermarlo potrete sostituire il comando start rispettivamente con i comandi restart oppure stop.

Per verificare che la configurazione base funzioni, basterà aprire il browser web del vostro PC o tablet o smartphone (connesso ovviamente alla stessa rete a cui è collegato il rasbperry pi), e digitare l'indirizzo IP assegnato al pi stesso (vedi paragrafo 2): apparirà la pagina di benvenuto di Apache che ci confermerà come tutto stia funzionando correttamente.

Apro una parentesi: Apache è un server potentissimo, uno dei più utilizzati nel mondo e sfruttato dietro praticamente ogni sito web a cui accedete quotidianamente. Per questo motivo ha una miriade di configurazioni e possibilità d'uso. In questo tutorial non entrerò nel merito altrimenti non basterebbero ore di video, ma se siete curiosi fatemelo sapere nei commenti perché si potrebbe approfondire al riguardo... Allo stesso modo, anche la configurazione di PHP andrebbe effettuata punto per punto, a seconda di cosa stiate realizzando. Ma, parimenti ad apache, non entrerò nel merito perché tra moduli, estensioni e possibilità non si finirebbe più!

A questo punto occorre verificare che il PHP sia interpretato correttamente da Apache. Per verificarlo dovrete entrare nella directory pubblica di Apache dove vengono ricercati i contenuti che debbono essere spediti al client che li sta richiedendo (es: il browser del vostro PC o smartphone o tablet). La configurazione base presente sui pacchetti di Ubuntu Server prevede che tutte le risorse siano memorizzate nel percorso /var/www/html, ed è infatti proprio qui dentro che troverete il file index.html che corrisponde alla pagina che era stata mostrata sul browser con cui avete richiamato l'indirizzo IP del raspberry pi. Utilizzate il comando cd /var/www/html per spostarvi su quel percorso.

Dovrete create un nuovo file all'interno di questa cartella: per semplicità e quindi per evitare di andare oltre gli scopi di questo tutorial e addentrarci nella gestione di utenti, permessi e così via (tutte cose che invece dovreste necessariamente tenere in considerazione per questioni di sicurezza), utilizzate i permessi da amministratore così da non dovervi preoccupare appunto di andare a configurare gli accessi, etc...
  • digitare: sudo vim.tiny index.php per creare un nuovo file (chiamato appunto index.php) e automaticamente anche modificarne il contenuto
  • premere la lettera i (insert) sulla tastiera per entrare in edit mode
  • digitare il seguente contenuto demo:

    <?php echo "Ciao mondo!"; ?>
    • nota: il tag di apertura "<?php" va sempre utilizzato in PHP quando stiamo inserendo del codice scritto in tale linguaggio, e serve per far capire ad apache che deve interpretarlo come tale. Il tag di chiusura, cioè "?>", non è necessario se lo script finisce e non c'è altro codice successivo, quindi volendo si può ometterlo.

  • premete il tasto ESC sulla tastiera, quindi digitare :wq (compreso i :)
  • digitare sul browser del PC, tablet o smartphone l'indirizzo IP del raspberry pi seguito da /index.php (es: 192.168.1.2/index.php). Apache andrà a cercare in /var/www/html la risorsa index.php, e vedrete mostrato sul browser proprio il messaggio che avete scritto all'interno delle doppie virgolette.

Se a questo punto tutto funziona significa che Apache risponde correttamente e che interpreta con successo il PHP. Congratulazioni: avete creato il vostro server web e potete iniziare a pensare come impiegarlo!


4. alcune idee per l'uso di un server web


Visto che stiamo parlando di server web, uno degli utilizzi più scontati è quello di metterci su un piccolo sito web, un blog o qualcosa che comunque non richieda prestazioni elevate e non generi eccessivo traffico di rete (così da non intasare la vostra connessione di casa, oppure se non avete a disposizione traffico dati illimitato).
Potreste pensare di sfruttare uno dei tanti CMS o framework scaricabili gratuitamente dal web (come Drupal, Joomla o Wordpress) ed iniziare da lì piuttosto che costruire tutto a mano da zero. Questa seconda possibilità è fantastica per imparare, ma assolutamente sconsigliata se cercate un minimo di affidabilità o se non volete "diventare matti".

Per installare un CMS avrete sicuramente la necessità di avere sul vostro server web anche un gestore di database sul quale andranno memorizzati i contenuti da mostrare a chi usufruisce del sito web, blog, ecc. Potete facilmente installare MySQL oppure MariaDB, presenti sui repository di Ubuntu Server, con il comando: sudo apt-get install mariadb-server oppure mysql-server a seconda della vostra scelta.
Una volta installato uno dei due, esso deve essere configurato. Le operazioni base da eseguire sono:
  • digitare: sudo mysql_secure_installation e seguire le istruzioni a video
  • digitare: sudo mysqld --initialize e seguire le istruzioni a video
  • potete verificare lo stato del demone con il comando: sudo service mysql status
  • al pari di Apache, anche il gestore DB può essere controllato con: sudo service mysql start o stop, etc...

Installato il gestore di database, potete scaricare il framework o CMS di vostra scelta, ad esempio Drupal. Poiché esso dovrà essere posizionato nella directory in cui Apache va a cercare i contenuti, spostatevi in /var/www/html con il comando cd /var/www/html. A questo punto:
  • digitare: sudo wget https://ftp.drupal.org/files/projects/drupal-8.2.5.tar.gz (che è la URL su cui, al momento della stesura di questa guida, si trova Drupal 8.2.5) per scaricare l'ultima versione di Drupal (sostituire la URL con quella del prodotto di vostra scelta)
  • al termine del download, digitare: sudo tar -xzvf drupal-8.2.5.tar.gz per decomprimere il pacchetto del prodotto (se esso è compresso come nel caso di Drupal)
  • digitare: sudo mv drupal-8.2.5 drupal (o un qualsiasi altro nome di vostro gradimento, come test oppure mysite, etc...)
  • digitare sul browser del PC, tablet o smartphone l'indirizzo IP del raspberry pi seguito da /drupal o il nome che avrete scelto (es: 192.168.1.2/drupal)
  • seguire le istruzioni a video per installare il prodotto


Ma questa è solo una tra le tante possibilità. Il fatto di utilizzare il PHP e poterlo richiederlo da web vi potrà permettere di eseguire comandi di varia natura sul raspberry pi. Con il PHP, infatti, non solo si può scrivere codice che genera HTML (cioè ciò che il browser del nostro PC, smartphone o tablet interpreta e mostra). Con il PHP si possono anche eseguire comandi su disco, come scrivere un testo su di un file, lanciare processi e applicazioni, e tantissime altre possibilità.

Apro una dovuta parentesi: finché rimarrete all'interno della vostra rete locale, potrete immaginare e pensare tutto ciò che vorrete senza farvi troppi problemi. Nel momento in cui vorrete invece esporre su internet il vostro lavoro, così da poterlo eventualmente eseguire anche quando siete fuori casa: beh fate molta attenzione!
A quel punto sarà indispensabile accertarsi che non ci siano falle di sicurezza.


5. esporre il vostro server web su internet


Per esporre su internet il vostro server web dovrete avere un router in grado di girare al raspberry pi le richieste che arrivano verso l'indirizzo IP pubblico della vostra connessione domestica. Per far ciò dovrete poter accedere alla configurazione interna del router (cosa solitamente non possibile sui modem/router forniti dagli operatori telefonici) e far sì che le richieste che provengono dall'esterno siano ruotate automaticamente verso l'indirizzo IP interno a cui risponde il vostro pi (es: 192.168.1.2). Per facilitare la procedura vi conviene impostare, come descritto nel paragrafo 2, un indirizzo IP statico per il raspberry pi cosicché, ogni volta che esso si riconnetta alla rete, il router gli assegni sempre lo stesso indirizzo IP.
A questo punto sapendo quale è l'indirizzo IP pubblico che il gestore della vostra connessione ad internet vi ha assegnato, digitandolo sul browser web del vostro PC, smartphone o tablet, il vostro router riceverà la richiesta e la rigirerà al raspberry pi: Apache cercherà la risorsa richiesta, nel vostro caso prodotta dal PHP, e vi sarà fornirà indietro la risposta desiderata.

Per rendere il tutto ancora più "potente", se registratre l'IP pubblico che vi viene fornito dal vostro operatore telefonico su di un servizio DNS (e molti router integrano tale funzione così da fare loro in autonomia tutta la configurazione), per accedere al vostro server web non dovrete nemmeno più esserne a conoscenza: l'unica cosa che dovrete sapere sarà il nome scelto sul servizio DNS. Insomma diventerà un po' come accedere a Google o Facebook o qualsiasi altro sito web: digiterete http://dominio sul vostro browser del PC, smartphone o tablet e sarete automaticamente direzionati sul pi, ricevendo da lui la risposta che cercate.



Bene: come indicato ad inizio guida, molti aspetti sono stati appositamente lasciati in secondo piano (soprattutto quelli legati alle impostazioni di sicurezza, alle configurazioni di utenti e permessi, e alle infinite possibilità fornite dallo stack Linux + Apache + MySQL/MariaDB + PHP).

Se siete interessati ad approfondire tali argomenti non esitate a contattarmi nei commenti di questo tutorial o del video ad esso correlato, oppure sui canali social!

Spero che la guida vi sia stata utile. Al prossimo tutorial!

Nessun commento:

Posta un commento