Web Application Server
Esercizio: Applicativo Go
Codice Sorgente
Creiamo la directory in cui scriveremo il programma sorgente e la directory in cui porremo l'eseguibile:
mkdir -p /www/go/src/hello
mkdir -p /www/app
cd /www/go/src/hello
Scriviamo il programma:
package main
import (
"fmt"
"log"
"net/http"
"unit.nginx.org/go"
)
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "Hello, 世界")
}
func main() {
http.HandleFunc("/", handler)
fmt.Println("Running demo app. Press Ctrl+C to exit...")
log.Fatal(unit.ListenAndServe(":8888", nil))
}
Da notare:
- deve importare il pacchetto di libreria
unit.nginx.org/go
- la tradizionale funzione
http.ListenAndServe()
è sostituita daunit.ListenAndServe()
- non vi sono altri cambiamenti
Compilazione
Se non già lanciato, compiamo il run del contenitore Unit:
docker run -d --name unitgo --net unitnet --ip 192.168.100.10 \
-v /www:/www -p 8080:8080 -p 80:80 unit:1.32.0-go1.21 \
unitd --control 192.168.100.10:8080 --no-daemon
Apriamo una sessione al contenitore Unit:
docker exec -ti unitgo bash
Posizioniamoci nella directory del nostro programma:
cd /www/go/src/hello
Creiamo un modulo di compilazione:
go mod init hello
Importiamo le dipendenze necessarie:
go get unit.nginx.org/go@1.32.0
Compiliamo il programma:
go build -o /www/app/hello .
Attenzione a non omettere il punto finale.
Configurazione Unit
Usciamo dal contenitore ed andiamo nella nostra directory degli esercizi:
exit
cd ~/unit
Prepariamo uno snippet di configurazione:
vim go.snippet
{
"listeners": {
"*:8082": {
"pass": "applications/go"
}
},
"applications": {
"go": {
"type": "external",
"working_directory": "/www/",
"executable": "/www/app/hello"
}
}
}
Esecuzione e Test
Sottoponiamo lo snippet a Unit:
curl -X PUT --data-binary @go.snippet 192.168.100.10:8080/config
Test dell'applicativo:
curl 192.168.100.10:8082
Hello, 世界