Go je open-source víceúčelový programovací jazyk. Byl inspirován produktivitou jazyka Python a zároveň nabízí možnosti jazyka C. Původně byl vyvinut společností Google k řešení problémů, kterým čelili se svým kódem (složitost kódu a dlouhá doba kompilace). Jako každý jiný moderní programovací jazyk je Go vhodný pro nejrůznější účely. Lze jej využít například pro vývoj webových aplikací, skriptování v příkazové řádce, síťové serverové aplikace, vývoj front-endu atd.
V této příručce vás provedeme kroky nasazení jednoduché webové aplikace v jazyce Go na Ubuntu 22.04 LTS. Implementujeme také reverzní proxy server Nginx pro zvládnutí síťového provozu.
Požadavky
K provedení kroků popsaných v této příručce budete potřebovat následující předem nakonfigurované komponenty:
- Správně nakonfigurované Ubuntu Zjistěte více o setting up your own Ubuntu server on CloudSigma.
- Programovací prostředí Go s potřebnými proměnnými prostředí ( $GOROOT a $GOPATH). Podívejte se na příručku o configuring the Go programming environment on Ubuntu.
- Nginx pro reverzní proxy. Tato příručka podrobně popisuje installing and configuring Nginx on Ubuntu.
- Vhodný textový editor pro práci s kódem Go, například Atom, Sublime Text, Brackets, VS Code, Vim atd. Pro tuto příručku bude naším vybraným textovým editorem VS Code.
Pokud má být služba přístupná pod doménovým jménem, musíte mít FQDN nasměrovaný na server. V takovém případě se doporučuje zabezpečit Nginx pomocí SSL. Více se dozvíte v našem návodu na securing Nginx with Let’s Encrypt on Ubuntu from our tutorial.
Krok 1 – Vytvoření webové aplikace v Go
Vytvoříme jednoduchou webovou aplikaci v Go, která při přístupu na doménu vypíše na obrazovku “Hello World”. Dále aplikace pozdraví uživatele při přístupu na <doména>/greet/<uživatelské_jméno>.
Začněte vytvořením nového projektu pod $GOPATH. Vytvořte adresář projektu:
|
1 |
mkdir -pv $GOPATH/go-web |

Změňte aktuální adresář:
|
1 |
cd $GOPATH/go-web |

Poté inicializujte projekt:
|
1 |
go mod init <název_balíčku> |

Dále vytvořte main.go který bude sloužit jako kořen naší aplikace Go. Bude obsahovat zdrojový kód naší webové aplikace:
|
1 |
touch main.go |
Otevřete projekt ve VS Code:
|
1 |
code . |
Do souboru vložte následující kód 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) } |

Pojďme si stručně rozebrat program v Go, který jsme právě vytvořili:
- Termín package main slouží jako vstupní bod do naší aplikace. Také instruuje kompilátor Go, aby soubor zkompiloval jako spustitelný soubor namísto sdílené knihovny.
- Příkaz import importuje všechny další moduly potřebné pro fungování programu. Zde jsme importovali balíčky fmt (pro tisk textů) a net/http (pro aplikace webového serveru).
- Pomocí funkce
http.HandleFunc, jsme vytvořili dvě trasy:
- První trasa / slouží jako nadřazená trasa v rámci func main.
- Druhá trasa
/greet/ přijímá parametr URL (v tomto případě řetězec). Tento řetězec se pak zobrazí společně s uvítací zprávou.
- URL Cesta se používá k uložení hodnoty za /greet/. Hodnota je pak předána jako name parametru URL.
- Funkce http.ListenAndServe spouští webový server. Zde naslouchá na portu 9990.
Nyní, když je náš program připraven, zkompilujte soubor do spustitelného souboru:
|
1 |
go build main.go |
Kompilátor Go vytvoří spustitelný soubor se stejným názvem jako soubor. Podívejte se na výstup:
|
1 |
ls -lh |
Krok 2 – Konfigurace unit souboru systemd pro spuštění na pozadí
Pokud se až dosud aktuální uživatel odhlásil ze systému, webová aplikace v Go se přestala spouštět. To je pro webový server špatný návrh. Chcete-li tento problém vyřešit, vytvoříme unit soubor systemd, který ji udrží spuštěnou na pozadí, i když se uživatel ze serveru odhlásí. Tím se konfigurace posune o krok blíže k nasazení na produkční úrovni.
Vytvořte vyhrazený systemd soubor goweb.service v /lib/systemd/system:
|
1 |
sudo nano /lib/systemd/system/goweb.service |
Do unit souboru přidejte následující úryvek:
|
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 |

Zde,
- Proměnná ExecStart označuje vstupní bod pro službu prostřednictvím hlavního spustitelného souboru umístěného v adresáři našeho projektu ( $GOPATH/go-web). Všimněte si, že místo uvedení $GOPATH, jsme napsali celou cestu ke spustitelnému souboru. Je to proto, že proměnná $GOPATH je viditelná pouze pro uživatele.
- Proměnná Restart říká systemd co dělat v případě, že se program zastaví. Hodnota always říká systemd aby program restartoval pokaždé, když se zastaví.
- Proměnná RestartSec říká systemd aby před pokusem o restartování programu počkal určitou dobu. Zde je hodnota nastavena na 5s (5 sekund).
- Příkaz WantedBy=multi-user.target určuje, v jakém stavu systemd službu povolí.
Uložte soubor a zavřete editor. Spusťte službu:
|
1 |
sudo service goweb start |

Ověřte, zda je služba spuštěná a funkční:
|
1 |
sudo service goweb status |

Jak napovídá výstup, aplikace je spuštěná a funkční. Nyní jsme připraveni použít Nginx jako reverzní proxy.
Krok 3 – Konfigurace Nginx jako reverzního proxy
Nyní vytvoříme blok serveru pro Nginx, který bude fungovat jako reverzní proxy. Webová aplikace bude vystavena do internetu prostřednictvím reverzního proxy (pro vyšší výkon a bezpečnost).
Změňte aktuální aktivní adresář na sites-available:
|
1 |
cd /etc/nginx/sites-available |

Nyní vytvořte soubor s názvem domény, na které chcete aplikaci vystavit. Pro demonstraci použijeme example.com:
|
1 |
sudo nano example.com |
Do souboru bloku zadejte následující kód:
|
1 2 3 4 5 6 |
server { server_name example.com www.example.com; location / { proxy_pass http: //localhost:9990; } } |

Zde používáme proxy_pass k poskytování webové aplikace Go na IP adrese serveru (localhost) na portu 9990.
Chcete-li povolit blok Nginx, vytvořte symlink (také známý jako měkký odkaz) souboru do složky sites-enabled:
|
1 |
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/example.com |

Znovu načtěte konfiguraci Nginx, aby se změny projevily:
|
1 |
sudo nginx -s reload |
Krok 4 – Ověření
Pokud vše proběhlo podle očekávání, měla by být webová aplikace nyní přístupná na localhost:9990 a na doméně, kterou jsme nakonfigurovali. Otevřete URL adresu ve webovém prohlížeči:
|
1 |
localhost:9990 |

Podle očekávání aplikace vypisuje na obrazovku “Hello World”. To je úkolem primární trasy. Dále otestujte druhou trasu návštěvou následující URL adresy:
|
1 |
localhost:9990/greet/<name> |

Aplikace úspěšně vrací jednoduchou uvítací zprávu se jménem z parametru přijatého z URL adresy.
Voila! Úspěšně jsme nasadili webovou aplikaci v Go na náš lokální server!
Závěrečné myšlenky
V tomto návodu jsme demonstrovali nasazení jednoduché webové aplikace v Go s pomocí standardních knihoven Go. Nasadili jsme také reverzní proxy pomocí Nginx. Přestože byla ukázka provedena na lokálním serveru, pro veřejný server se důrazně doporučuje implementovat SSL certifikát pro zabezpečené vystavení do internetu. Pro více informací o programování v Go se můžete podívat na náš návod na Sestavení a instalace programů v Go.
Příjemné programování!


Komentáře
Zatím žádné komentáře. Buďte první.