Torna al blog

Distribuzione di un'applicazione web Go utilizzando Nginx su Ubuntu 22.04

Distribuzione di un'applicazione web Go utilizzando Nginx su Ubuntu 22.04

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:

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:

Go Web Application Make Dir

Cambiate la directory corrente:

Go Web Application Change Dir

Quindi, avviate un progetto:

Go Web Application Init Project

Successivamente, create main.go che fungerà da root della nostra applicazione Go. Ospiterà il codice sorgente della nostra app web:

Aprite il progetto in VS Code:

Incollate il seguente codice nel file main.go:

Go Web Application Main Go

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:

Il compilatore Go creerà un eseguibile con lo stesso nome del file. Controlla l'output:

Go Web Application 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:

Aggiungi il seguente frammento nel file di unità:

go web service

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:

go web start

Verifica se il servizio è attivo e funzionante:

go web 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:

cd

Ora, crea un file con il nome di dominio con cui desideri esporre la tua applicazione. A scopo dimostrativo, utilizzeremo example.com:

 

Inserisci il seguente codice nel file di blocco:

example.com

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:

create sym

Ricarica la configurazione di Nginx per rendere effettive le modifiche:

reload nginx

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:

Hello World

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:

Hello Cloud

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!

author

Pranay Kapgate

Autore · CloudSigma

Preslav Dobrev è un designer creativo presso CloudSigma, con un focus su un'identità aziendale coerente attraverso l'uso di canali di marketing tradizionali e innovativi. È abile nel fondere la visione artistica con il marketing strategico per creare narrazioni di brand di grande impatto.

Commenti

Ancora nessun commento. Scrivi il primo.