Lab - Web Server
Gli esempi qui indicati fanno riferimento al contenuto del folder Esempi Web
disponibile nel folder delle slides. Scaricare l'intero folder sul proprio PC.
Installazione Web server locale
L'ambiente di programmazione Python contiene un semplice web server.
- Installare Python.
- Lanciare un interprete di comandi (shell).
- Spostare la shell nella directory in cui si trovano i file html di esempio.
- Lanciare il web server Python
python -m http.server
. Di default questo web server è in ascolto sulla porta 8000. Il web server rimane in esecuzione fino a quando è in esecuzione la shell dalla quale lo si è lanciato. - Lanciare un'altra shell. Eseguire
netstat -an
per elencare l'insieme di porte attualmente utilizzate. Deve comparire nell'elenco la porta8000
associata al protocolloTCP
e nello statoLISTENING
, cioè in attesa di richieste di connessione. Ciò conferma che il web server è effettivamente in esecuzione.
Riferimento utile
Il riferimento indicato più sotto suggerisce di lanciare il web server con il comando python3
e di collegare il browser all'URL http:0.0.0.0:8000
. A seconda della configurazione e dell'ambiente specifico, questi "dettagli" non funzionano, nel mio ambiente funzionano python
e localhost
. Provate e non vi arrendete.
Accesso a sito web localhost
-
Lanciare un browser e scrivere nella barra degli URL
http://localhost:8000
.- La parte
:8000
è una componente opzionale nella sintassi degli URL; se presente, indica il numero di porta del server al quale dovrà collegarsi il browser (il codice del browser non eseguiràconnect(IP-server, 80)
bensìconnect(IP-server, 8000)
, doveIP-server
sarà stato ottenuto traducendo il nome contenuto nella seconda parte dell'URL, in questo casolocalhost
)
- La parte
-
Il browser deve mostrare l'elenco dei file presenti nella directory del web server. Cliccare su un file html di esempio e verificarne la corretta visualizzazione.
Risorse prelevate dal browser
-
Aprire i Developer tools del browser e localizzare la funzione per vedere l'elenco delle risorse prelevate dal browser:
- quante sono?
- quali sono?
- il nome dei file sul disco è identico alla terza parte dell'URL o no? Che legame c'è tra nomi di file e terza parte degli URL?
-
Modificare il file
html
(o crearne uno identico e lavorare su quest'ultimo) in modo da:- aggiungere un'immagine (scaricata da Internet e memorizzata nella directory del file di esempio);
- modificare lo
IFRAME
inserendovi un URL diverso.
-
Visualizzare nuovamente il documento html con il browser ed analizzare le risorse prelevate dal browser, come sopra.
- Provare a modificare nuovamente il documento
html
aggiungendovi una immagine non scaricata da Internet. Occorre cercare una immagine su Internet, trovarne l'URL (tasto destro del mouse) ed usarlo come attributosrc
del nuovo elementoimg
.
Connessioni TCP e numeri di porta
-
Eseguire
netstat -an
mentre il browser sta visualizzando il documento. L'elenco dovrebbe contenere almeno una connessione con protocolloTCP
nello statoESTABLISHED
e numero di porta8000
ad una delle due estremità. Questa è la connessione che il browser ha con il web server; il numero di porta8000
è all'estremità che corrisponde al web server:- Qual è il numero di porta all'altra estremità, cioè a quella che corrisponde al browser? E'
8000
, cioè uguale a quello sull'estremità del web server? Oppure è un numero diverso, "molto grande"?
- Qual è il numero di porta all'altra estremità, cioè a quella che corrisponde al browser? E'
-
Se l'elenco non contiene nessuna connessione con le caratteristiche sopra indicate, il motivo è che il browser o il server hanno deciso di chiudere la connessione TCP ed al momento in cui è stato eseguito
netstat
la connessione era già stata chiusa. In questo caso, premere il tasto di reload sul browser e generare l'elenco nuovamente. L'elenco dovrebbe adesso contenere la connessione.
Ripetere quanto segue fino a che non lo si è capito:
- Premere reload sul browser, eseguire
netstat -an
, identificare la connessione tra browser e web server,cercare il numero di porta all'estremità del browser. - Stamparsi in testa che quel numero di porta è diverso da quello all'estremità del server: è un numero "molto grande" ed "ogni volta diverso"
- Stamparsi in testa che il punto precedente non è qualcosa da imparare a memoria. E' stato detto a lezione: cercare nelle slide il punto in cui è stato detto.
Osservazione
Le connessioni tra browser e server non sono di facile interpretazione, per due motivi:
- Quando il browser è collegato ad un web server in esecuzione sulla stessa macchina in cui è in esecuzione il browser, come in questo caso, l'esecuzione di
netstat -an
mostrerà due righe per ogni connessione esistente invece di una: una riga in cui considera il browser locale ed il server remoto, un'altra in cui considera il server locale ed il browser remoto. - Il browser può usare più connessioni in parallelo verso lo stesso web server: se il browser si accorge che deve prelevare più risorse dallo stesso web server, allora il browser può decidere di aprire più connessioni verso quel web server ed inviare più richieste in parallelo, una su ogni connessioni.
Negli esercizi, per semplicità, assumeremo sempre che il punto 2 non accade mai: ad ogni istante:
- un browser può avere più connessioni aperte, ma verso web server diversi;
- un browser non ha più connessioni aperte in parallelo verso lo stesso web server.
Accesso a sito web con nome
-
Modificare il file
hosts
sul proprio PC in modo da assegnare l'indirizzo IP locale cosiddetto loopback (127.0.0.1
) ad un nome a piacere.- Ad esempio, su Windows aggiungere al file
hosts
la riga127.0.0.1 parlamento.it
implica che nel PC nel cui filehosts
è stata aggiunta quella riga il nomeparlamento.it
sarà tradotto in127.0.0.1
. - Notare che la sintassi del file
hosts
è diversa da quella dei RR DNS. - Questa conversazione con ChatGPT dovrebbe riassumere le operazioni da fare su Windows, Linux, Mac per modificare il file
hosts
.
- Ad esempio, su Windows aggiungere al file
-
Scrivere nella barra degli URL del browser
http://parlamento.it:8000
e verificare la corretta visualizzazione.
E' possibile aggiungere più righe al file hosts
che mappino più nomi sullo stesso indirizzo IP locale. In questo modo tutti i nomi aggiunti saranno associati allo stesso web server locale.
Il web server Python però non è in grado di ospitare più siti web diversi e fornire contenuti diversi a seconda del sito web richiesto dal browser.
- Ad esempio, se
parlamento.it
erealmadrid.es
fossero associati a quel web server, richieste per http://parlamento.it/index.html e http://realmadrid.es otterrebbero la stessa risposta, cioè il contenuto del fileindex.html
nella directory del web server.
Per gestire più siti web con un unico web server occorre un web server leggermente più complesso, ad esempio Abyss o Apache. Il primo è un web server "molto completo", relativamente semplice da installare e configurare. Il secondo è un web server professionale tra i più diffusi, più complesso da installare e configurare.
ATTENZIONE VirusTotal segnala che Abyss ha al proprio interno del malware. Questa indicazione di VirusTotal potrebbe essere un falso positivo (cioè avvisa della presenza di un malware ma non c'è effettivamente un malware) ma non ne ho la certezza quindi non posso consigliarne l'uso.
CSS
- Lancia il web server locale come indicato sopra e preleva il documento
esempio_1-css.html
(con il nome di sitolocalhost
o con il nome di sito eventualmente inserito nel filehosts
) - Click con il tasto destro in una delle scritte colorate e seleziona
inspect
. Cerca di capire la descrizione delle proprietà CSS fornita dal browser. - Prova a modificare il valore di qualche proprietà CSS direttamente nei developer tools del browser (ad esempio, modifica
color
ofont-family
di qualche regola CSS). Il browser modifica la visualizzazione. - Al reload tornerà la visualizzazione specificata nelle risorse inviate dal web server.
Riferimento utile
JavaScript
- Lancia il web server locale come indicato sopra e preleva il documento
esempio_javascript.html
(con il nome di sitolocalhost
o con il nome di sito eventualmente inserito nel filehosts
) - Click sulle immagini come indicato nel documento visualizzato e verifica il cambio di visualizzazione.
- Click con il tasto destro e
View page source
. Cerca di farti un'idea di cosa accade cliccando sulle immagini. -
Reload e apri i Developer tools del browser. Ripeti i click:
-
Osserva le sezioni Sources e Network. Il browser genera traffico per modificare la visualizzazione? Sempre, mai, in qualche caso?
- Osserva il Render tree (sezione
Elements
dei Developer tools). Cerca di individuare le parti modificate dall'esecuzione di JavaScript.
Riferimento utile
Contenuto dinamico
- Crea una directory di nome
cgi-bin
- Crea in quella directory un file di nome
hello.py
e contenuto identico a quello del secondo esempio nella sezione "Execute a Script Remotely Through the Common Gateway Interface (CGI)" del riferimento indicato più sotto. - Lanciare il web server Python e mandarlo nuovamente in esecuzione con l'opzione "esegui programmi specificati con lo standard CGI":
python -m http.server --cgi
(se era già in esecuzione, fermarlo con ctrl-C o chiudendo la shell). - Visualizzare con il browser il documento
http://localhost:8000/cgi-bin/hello.py
Verificata la corretta visualizzazione:
- Premere il pulsante reload del browser più volte. Ogni volta sfondo e testo del documento visualizzato saranno diversi, nonostante ogni volta il browser richieda lo stesso URL.
- Cliccare con il tasto destro del mouse sul documento e selezionare "inspect page source". Dare un'occhiata al codice HTML. I file nei folder accessibili al web server contengono un file HTML con quel contenuto?
-
Aprire i Developer tools del browser e localizzare la funzione per vedere l'elenco delle risorse prelevate dal browser.
- Quante sono?
- Quali sono?
- Cosa cambia tra un prelievo ed il successivo?
Cosa accade sul web server
Dare un'occhiata al contenuto di hello.py
per cercare di avere un'idea di ciò che accade (spiegato in estrema sintesi più sotto). La programmazione Python non è parte di questo corso. La scrittura di programmi per web server nemmeno. Ci basta solo avere un'idea molto a grandi linee di cosa sia accaduto.
In questo caso il web server ha capito dalla forma dell'URL richiesto (/cgi-bin/hello.py
) che non deve costruire una risposta HTTP che trasporta il file identificato da quell'URL. Deve invece:
- mandare in esecuzione il programma
python hello.py
, permettendo al programma di accedere al contenuto della HTTP Request che ne ha provocato l'esecuzione (funzionios.getenv()
); - trasformare l'output dell'esecuzione del programma (stringa stampata con
print()
) in una HTTP Response da tornare al browser.
La regola con la quale il web server ha preso questa decisione è, in parole povere, questa: la terza parte dell'URL inizia con cgi-bin
e il web server è stato mandato in esecuzione con l'opzione --cgi
.