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 da unit.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, 世界