Go to otwartoźródłowy język programowania ogólnego przeznaczenia. Został zainspirowany wydajnością Python oferując jednocześnie możliwości języka C. Został pierwotnie opracowany przez Google, aby rozwiązać problemy, z którymi borykali się w swoim kodzie źródłowym (złożoność kodu i długi czas kompilacji). Podobnie jak każdy inny współczesny język programowania, Go nadaje się do wszelkiego rodzaju celów. Na przykład może być wykorzystywany do tworzenia stron internetowych, skryptów wiersza poleceń, sieciowych aplikacji serwerowych, programowania front-endu itp.
W tym poradniku przeprowadzimy Cię przez kroki wdrażania prostej aplikacji internetowej Go na systemie Ubuntu 22.04 LTS. Wdrożymy również odwrotne proxy Nginx do obsługi obciążenia ruchem.
Wymagania wstępne
Aby wykonać kroki przedstawione w tym poradniku, będziesz potrzebować następujących wstępnie skonfigurowanych komponentów:
- Odpowiednio skonfigurowany Ubuntu Dowiedz się więcej o konfiguracji własnego serwera Ubuntu na CloudSigma.
- Środowisko programistyczne Go z niezbędnymi zmiennymi środowiskowymi ( $GOROOT oraz $GOPATH). Zapoznaj się z poradnikiem dotyczącym konfiguracji środowiska programistycznego Go na Ubuntu.
- Nginx jako odwrotne proxy. Ten poradnik szczegółowo opisuje instalację i konfigurację Nginx na Ubuntu.
- Odpowiedni edytor tekstu do pracy z kodem Go, na przykład Atom, Sublime Text, Brackets, VS Code, Vim, itp. W tym poradniku naszym edytorem tekstu będzie VS Code.
Jeśli usługa ma być dostępna pod nazwą domeny, musisz posiadać FQDN wskazującą na serwer. W takim przypadku zaleca się zabezpieczenie Nginx za pomocą SSL. Możesz dowiedzieć się więcej o zabezpieczaniu Nginx za pomocą Let’s Encrypt na Ubuntu z naszego samouczka.
Krok 1 – Tworzenie aplikacji internetowej Go
Zbudujemy prostą aplikację internetową Go, która po wejściu na domenę wyświetli na ekranie “Hello World”. Ponadto aplikacja przywita użytkownika po przejściu na <domena>/greet/<nazwa_użytkownika>.
Zacznij od utworzenia nowego projektu w $GOPATH. Utwórz katalog projektu:
|
1 |
mkdir -pv $GOPATH/go-web |

Zmień bieżący katalog:
|
1 |
cd $GOPATH/go-web |

Następnie zainicjuj projekt:
|
1 |
go mod init <nazwa_pakietu> |

Następnie utwórz main.go który będzie służył jako katalog główny naszej aplikacji Go. Będzie on zawierał kod źródłowy naszej aplikacji internetowej:
|
1 |
touch main.go |
Otwórz projekt w VS Code:
|
1 |
code . |
Wklej następujący kod do pliku 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) } |

Przeanalizujmy krótko program Go, który właśnie stworzyliśmy:
- Termin package main służy jako punkt wejścia do naszej aplikacji. Informuje również kompilator Go, aby skompilował plik jako plik wykonywalny, a nie bibliotekę współdzieloną.
- Instrukcja import importuje wszystkie dodatkowe moduły wymagane do działania programu. Tutaj zaimportowaliśmy pakiety fmt (do wypisywania tekstu) oraz net/http (do aplikacji serwerów WWW).
- Używając funkcji
http.HandleFunc, utworzyliśmy dwie trasy:
- Pierwsza trasa / służy jako trasa nadrzędna wewnątrz func main.
- Druga trasa
/greet/ przyjmuje parametr URL (w tym przypadku ciąg znaków). Ciąg ten jest następnie wyświetlany wraz z komunikatem powitalnym.
- URL Ścieżka służy do przechowywania wartości po /greet/. Wartość jest następnie przekazywana jako name parametru URL.
- Funkcja http.ListenAndServe inicjuje serwer WWW. W tym miejscu nasłuchuje na porcie 9990.
Teraz, gdy nasz program jest gotowy, skompiluj plik do postaci pliku wykonywalnego:
|
1 |
go build main.go |
Kompilator Go utworzy plik wykonywalny o takiej samej nazwie jak plik. Sprawdź dane wyjściowe:
|
1 |
ls -lh |
Krok 2 – Konfiguracja pliku jednostki systemd do uruchamiania w tle
Do tej pory, jeśli bieżący użytkownik wyloguje się z systemu, aplikacja internetowa Go przestanie działać. To zły projekt dla serwera WWW. Aby rozwiązać ten problem, utworzymy plik jednostki systemd, aby utrzymać jej działanie w tle, nawet gdy użytkownik wyloguje się z serwera. Przybliża to konfigurację o krok do wdrożenia klasy produkcyjnej.
Utwórz dedykowany plik systemd file goweb.service w katalogu /lib/systemd/system:
|
1 |
sudo nano /lib/systemd/system/goweb.service |
Dodaj następujący fragment kodu do pliku jednostki:
|
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 |

Tutaj,
- Zmienna ExecStart wskazuje punkt wejścia dla usługi poprzez główny plik wykonywalny znajdujący się w naszym katalogu projektu ( $GOPATH/go-web). Zauważ, że zamiast wspominać o $GOPATH, wpisaliśmy pełną ścieżkę do pliku wykonywalnego. Dzieje się tak, ponieważ zmienna $GOPATH jest widoczna tylko dla użytkownika.
- Zmienna Restart informuje systemd co zrobić w przypadku, gdy program przestanie działać. Wartość always nakazuje systemd restartować program za każdym razem, gdy przestanie on działać.
- Zmienna RestartSec informuje systemd o odczekaniu określonego czasu przed próbą ponownego uruchomienia programu. Tutaj wartość jest ustawiona na 5s (5 sekund).
- Instrukcja WantedBy=multi-user.target określa, w jakim stanie systemd uruchomi usługę.
Zapisz plik i zamknij edytor. Uruchom usługę:
|
1 |
sudo service goweb start |

Zweryfikuj, czy usługa działa:
|
1 |
sudo service goweb status |

Jak sugerują dane wyjściowe, aplikacja działa. Jesteśmy teraz gotowi do użycia Nginx jako odwrotnego proxy.
Krok 3 – Konfiguracja Nginx jako odwrotnego proxy
Now, we will create a server block for Nginx to act as a reverse proxy. The web app will be exposed to the internet through the reverse proxy (for additional performance and security).
Zmień bieżący katalog roboczy na sites-available:
|
1 |
cd /etc/nginx/sites-available |

Teraz utwórz plik o nazwie domeny, pod którą chcesz udostępnić swoją aplikację. W celach demonstracyjnych użyjemy example.com:
|
1 |
sudo nano example.com |
Wprowadź następujący kod w pliku bloku:
|
1 2 3 4 5 6 |
server { server_name example.com www.example.com; location / { proxy_pass http: //localhost:9990; } } |

Tutaj używamy proxy_pass do obsługi aplikacji internetowej Go pod adresem IP serwera (localhost) na porcie 9990.
Aby włączyć blok Nginx, utwórz dowiązanie symboliczne (znane również jako miękkie linkowanie) pliku do folderu sites-enabled:
|
1 |
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/example.com |

Przeładuj konfigurację Nginx, aby zmiany weszły w życie:
|
1 |
sudo nginx -s reload |
Krok 4 – Weryfikacja
Jeśli wszystko poszło zgodnie z oczekiwaniami, aplikacja internetowa powinna być teraz dostępna pod adresem localhost:9990 oraz na skonfigurowanej przez nas domenie. Otwórz ten adres URL w przeglądarce internetowej:
|
1 |
localhost:9990 |

Zgodnie z oczekiwaniami, aplikacja wyświetla “Hello World” na ekranie. To jest zadanie głównej trasy. Następnie przetestuj drugą trasę, odwiedzając następujący adres URL:
|
1 |
localhost:9990/greet/<name> |

Aplikacja pomyślnie zwraca proste powitanie z imieniem z parametru otrzymanego z adresu URL.
Voila! Pomyślnie wdrożyliśmy aplikację internetową Go na naszym lokalnym serwerze!
Podsumowanie
W tym poradniku zademonstrowaliśmy wdrożenie prostej aplikacji internetowej Go przy użyciu standardowych bibliotek Go. Wdrożyliśmy również odwrotne proxy za pomocą Nginx. Chociaż demonstracja została przeprowadzona na serwerze lokalnym, w przypadku serwera publicznego zdecydowanie zaleca się, aby wdrożyć certyfikat SSL w celu bezpiecznego udostępnienia w Internecie. Więcej informacji na temat programowania w Go znajdziesz w naszym samouczku dotyczącym Budowania i instalowania programów Go.
Miłego kodowania!


Komentarze
Brak komentarzy. Bądź pierwszy.