Go è un linguaggio di programmazione general-purpose open-source. È stato ispirato dalla produttività di Python pur offrendo le capacità del C. È stato originariamente sviluppato da Google per affrontare i problemi riscontrati con la loro codebase (complessità del codice e lunghi tempi di compilazione). Come qualsiasi altro linguaggio di programmazione moderno, Go è adatto a tutti i tipi di scopi. Ad esempio, potrebbe essere utilizzato per lo sviluppo web, lo scripting da riga di comando, le app server di rete, lo sviluppo front-end, ecc.
In questa guida, vi guideremo attraverso i passaggi per distribuire una semplice applicazione web Go su Ubuntu 22.04 LTS. Implementeremo anche un reverse proxy Nginx per gestire il carico di traffico.
Prerequisites
Per eseguire i passaggi illustrati in questa guida, avrete bisogno dei seguenti componenti preconfigurati:
- Un server configurato correttamente Ubuntu Scoprite di più su come setting up your own Ubuntu server on CloudSigma.
- Ambiente di programmazione Go con le variabili d'ambiente necessarie ( $GOROOT e $GOPATH). Consultate la guida su come configuring the Go programming environment on Ubuntu.
- Nginx per il reverse proxy. Questa guida approfondisce l' installing and configuring Nginx on Ubuntu.
- Un editor di testo adatto per lavorare con il codice Go, ad esempio, Atom, Sublime Text, Brackets, VS Code, Vim, ecc. Per questa guida, VS Code sarà l'editor di testo scelto.
Se il servizio deve essere accessibile tramite un nome di dominio, è necessario disporre di un FQDN puntato al server. In tal caso, si consiglia di proteggere Nginx con SSL. Potete saperne di più su come securing Nginx with Let’s Encrypt on Ubuntu from our tutorial.
Passo 1 – Creazione di un'app web Go
Costruiremo una semplice app web Go che stamperà “Hello World” sullo schermo quando si accede al dominio. Inoltre, l'app saluterà l'utente quando si accede a <domain>/greet/<username>.
Iniziate creando un nuovo progetto sotto $GOPATH. Create la directory del progetto:
|
1 |
mkdir -pv $GOPATH/go-web |

Cambiate la directory corrente:
|
1 |
cd $GOPATH/go-web |

Quindi, avviate un progetto:
|
1 |
go mod init <package_name> |

Successivamente, create main.go che fungerà da root della nostra applicazione Go. Ospiterà il codice sorgente della nostra app web:
|
1 |
touch main.go |
Aprite il progetto in VS Code:
|
1 |
code . |
Incollate il seguente codice nel file main.go:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
package main import ( "fmt" "net/http" ) func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hello World") }) http.HandleFunc("/greet/", func(w http.ResponseWriter, r *http.Request) { name:= r.URL.Path[len("/greet/"):] fmt.Fprintf(w, "Hello %s\n", name) }) http.ListenAndServe(":9990", nil) } |

Diamo una rapida occhiata alla struttura del programma Go che abbiamo appena creato:
- Il termine package main funge da punto di ingresso per la nostra applicazione. Istruisce inoltre il compilatore Go a compilare il file come un eseguibile invece di una libreria condivisa.
- L'istruzione import importa tutti i moduli aggiuntivi necessari per il funzionamento del programma. Qui abbiamo importato i pacchetti fmt (per la stampa di testi) e net/http (per le applicazioni server web).
- Utilizzando la funzione
http.HandleFunc, abbiamo stabilito due rotte:
- La prima rotta / funge da rotta principale all'interno di func main.
- La seconda rotta
/greet/ accetta un parametro URL (una stringa, in questo caso). La stringa viene quindi visualizzata accompagnata dal messaggio di saluto.
- URL Path viene utilizzato per memorizzare il valore dopo /greet/. Il valore viene quindi passato come name del parametro URL.
- La http.ListenAndServe avvia il server web. Qui, è in ascolto sulla porta 9990.
Ora che il nostro programma è pronto, compila il file in un eseguibile:
|
1 |
go build main.go |
Il compilatore Go creerà un eseguibile con lo stesso nome del file. Controlla l'output:
|
1 |
ls -lh |
Passo 2 – Configurazione di un file di unità systemd per l'esecuzione in background
Fino ad ora, se l'utente corrente si disconnette dal sistema, l'app web Go smetterà di funzionare. Questo è un pessimo design per un server web. Per risolvere questo problema, creeremo un file di unità systemd per mantenerla in esecuzione in background, anche quando l'utente si disconnette dal server. Ciò avvicina la configurazione di un passo a una distribuzione di livello di produzione.
Crea un file systemd dedicato goweb.service sotto /lib/systemd/system:
|
1 |
sudo nano /lib/systemd/system/goweb.service |
Aggiungi il seguente frammento nel file di unità:
|
1 2 3 4 5 6 7 8 9 10 11 |
[Unit] Description=goweb [Service] Type=simple Restart=always RestartSec=5s ExecStart=/home/<username>/go/go-web/main [Install] WantedBy=multi-user.target |

Qui,
- La variabile ExecStart indica il punto di ingresso per il servizio tramite l'eseguibile principale situato nella directory del nostro progetto ( $GOPATH/go-web). Nota che invece di menzionare $GOPATH, abbiamo digitato il percorso completo del file eseguibile. Questo perché la variabile $GOPATH è visibile solo all'utente.
- La variabile Restart indica a systemd cosa fare nel caso in cui il programma smetta di funzionare. Il valore always indica a systemd di riavviare il programma ogni singola volta che smette di funzionare.
- La variabile RestartSec indica a systemd di attendere un periodo di tempo specifico prima di tentare di riavviare il programma. Qui, il valore è impostato su 5s (5 secondi).
- L'istruzione WantedBy=multi-user.target specifica in quale stato systemd abiliterà il servizio.
Salva il file e chiudi l'editor. Avvia il servizio:
|
1 |
sudo service goweb start |

Verifica se il servizio è attivo e funzionante:
|
1 |
sudo service goweb status |

Come suggerisce l'output, l'applicazione è attiva e funzionante. Ora siamo pronti a utilizzare Nginx come reverse proxy.
Passo 3 – Configurazione di Nginx come Reverse Proxy
Ora, creeremo un blocco server per consentire a Nginx di agire come reverse proxy. L'app web sarà esposta a Internet tramite il reverse proxy (per prestazioni e sicurezza aggiuntive).
Cambia la directory attiva corrente in sites-available:
|
1 |
cd /etc/nginx/sites-available |

Ora, crea un file con il nome di dominio con cui desideri esporre la tua applicazione. A scopo dimostrativo, utilizzeremo example.com:
|
1 |
sudo nano example.com |
Inserisci il seguente codice nel file di blocco:
|
1 2 3 4 5 6 |
server { server_name example.com www.example.com; location / { proxy_pass http: //localhost:9990; } } |

Qui, stiamo utilizzando proxy_pass per servire l'app web Go sull'indirizzo IP del server (localhost) sulla porta 9990.
Per abilitare il blocco Nginx, crea un symlink (noto anche come collegamento simbolico) del file nella cartella sites-enabled:
|
1 |
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/example.com |

Ricarica la configurazione di Nginx per rendere effettive le modifiche:
|
1 |
sudo nginx -s reload |
Passo 4 – Verifica
Se tutto è andato come previsto, l'applicazione web dovrebbe ora essere accessibile su localhost:9990 e sul dominio che abbiamo configurato. Apri l'URL in un browser web:
|
1 |
localhost:9990 |

Come previsto, l'applicazione sta stampando “Hello World” sullo schermo. Questo è il compito della rotta principale. Successivamente, testa la seconda rotta visitando il seguente URL:
|
1 |
localhost:9990/greet/<nome> |

L'applicazione restituisce correttamente il semplice messaggio di saluto con il nome ricavato dal parametro ricevuto dall'URL.
Voilà! Abbiamo distribuito con successo un'applicazione web Go sul nostro server locale!
Considerazioni finali
In questa guida, abbiamo mostrato come distribuire una semplice applicazione web Go con l'aiuto delle librerie standard di Go. Abbiamo anche distribuito un reverse proxy utilizzando Nginx. Sebbene la dimostrazione sia stata eseguita su un server locale, per un server pubblico si raccomanda vivamente di implementare un certificato SSL per un'esposizione sicura a Internet. Per saperne di più sulla programmazione in Go, puoi consultare il nostro tutorial su Compilazione e installazione di programmi Go.
Buona programmazione!


Commenti
Ancora nessun commento. Scrivi il primo.