Go 是一種開源的通用程式語言。它的靈感來自於 Python 的高效生產力,同時提供了 C 語言的能力。它最初由 Google 開發,旨在解決他們在程式碼庫中面臨的問題(程式碼複雜性和漫長的編譯時間)。就像任何其他現代程式語言一樣,Go 適用於各種用途。例如,它可用於網頁開發、命令列腳本、網路伺服器應用程式、前端開發等。
在本指南中,我們將引導您完成在 Ubuntu 22.04 LTS 上部署簡單 Go 網頁應用程式的步驟。 我們還將實作 Nginx 反向代理來處理流量負載。
先決條件
要執行本指南中示範的步驟,您需要預先設定以下元件:
- 一個配置妥當的 Ubuntu 進一步了解 在 CloudSigma 上設定您自己的 Ubuntu 伺服器.
- 具有必要環境變數的 Go 程式設計環境( $GOROOT 和 $GOPATH)。請參閱關於 在 Ubuntu 上設定 Go 程式設計環境.
- Nginx 作為反向代理。本指南詳細闡述了 在 Ubuntu 上安裝和設定 Nginx.
- 一個適合編寫 Go 程式碼的文字編輯器,例如 Atom, Sublime Text, Brackets, VS Code, Vim 等。在本指南中,VS Code 將是我們首選的文字編輯器。
如果該服務要透過網域名稱存取,則您必須有一個指向該伺服器的 FQDN。在這種情況下,建議使用 SSL 保護 Nginx。您可以從我們的教學中了解更多關於 在 Ubuntu 上使用 Let’s Encrypt 保護 Nginx 的方法.
步驟 1 – 建立 Go 網頁應用程式
我們將建立一個簡單的 Go 網頁應用程式,在存取該網域時,它會在螢幕上列印 “Hello World”。此外,當存取以下路徑時,該應用程式將向使用者打招呼: <domain>/greet/<username>.
首先在 $GOPATH 底下建立一個新專案。建立專案目錄:
|
1 |
mkdir -pv $GOPATH/go-web |

切換目前目錄:
|
1 |
cd $GOPATH/go-web |

然後,初始化專案:
|
1 |
go mod init <package_name> |

接下來,建立 main.go 這將作為我們 Go 應用程式的根目錄。它將託管我們網頁應用程式的原始碼:
|
1 |
touch main.go |
在 VS Code 中開啟專案:
|
1 |
code . |
將以下程式碼貼到檔案 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) } |

讓我們快速分析一下剛建立的 Go 程式:
- 術語 package main 作為我們應用程式的進入點。它還指示 Go 編譯器將該檔案編譯為可執行檔,而不是共享程式庫。
- 這個 import 語句匯入了程式運作所需的所有其他模組。在這裡,我們匯入了 fmt(用於列印文字)和 net/http (用於網頁伺服器應用程式)套件。
- 使用函式
http.HandleFunc,我們建立了兩個路由:
- 第一個路由 / 作為以下函式中的父路由: func main.
- 第二個路由
/greet/ 接受一個 URL 參數(在此例中為字串)。然後該字串會與問候訊息一起顯示。
- URL Path 用於儲存之後的值 /greet/。然後該值會作為 name URL 參數。
- 該 http.ListenAndServe 函式會啟動網頁伺服器。在這裡,它正在監聽連接埠 9990.
現在我們的程式已準備就緒,將檔案編譯為執行檔:
|
1 |
go build main.go |
Go 編譯器將建立一個與該檔案同名的執行檔。查看輸出:
|
1 |
ls -lh |
步驟 2 – 設定用於背景執行的 systemd 單元檔案
在此之前,如果目前使用者登出系統,Go 網頁應用程式將停止執行。對於網頁伺服器來說,這是一個糟糕的設計。為了解決這個問題,我們將建立一個 systemd 單元檔案,使其在背景持續執行,即使使用者登出伺服器也是如此。這使該設定更接近生產級部署。
建立一個專用的 systemd 檔案 goweb.service 於 /lib/systemd/system:
|
1 |
sudo nano /lib/systemd/system/goweb.service |
在單元檔案中新增以下程式碼片段:
|
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 |

在這裡,
- 變數 ExecStart 表示該服務透過位於我們專案目錄中的主執行檔的進入點 ( $GOPATH/go-web)。請注意,我們沒有提及 $GOPATH,而是輸入了執行檔的完整路徑。這是因為 $GOPATH 變數僅對該使用者可見。
- 變數 Restart 告訴 systemd 在程式停止執行時該怎麼做。值 always 告訴 systemd 在每次程式停止執行時都重新啟動它。
- 變數 RestartSec 告訴 systemd 在嘗試重新啟動程式之前等待特定的時間。在這裡,值設定為 5s (5 秒)。
- 陳述式 WantedBy=multi-user.target 指定在什麼狀態下 systemd 將啟用該服務。
儲存檔案並關閉編輯器。啟動服務:
|
1 |
sudo service goweb start |

驗證服務是否已啟動並執行:
|
1 |
sudo service goweb status |

如輸出所示,應用程式已啟動並執行。我們現在準備好將 Nginx 用作反向代理。
步驟 3 – 將 Nginx 設定為反向代理
現在,我們將為 Nginx 建立一個伺服器區塊以充當反向代理。網頁應用程式將透過反向代理向網際網路公開(以獲得額外的效能和安全性)。
將目前工作目錄變更為 sites-available:
|
1 |
cd /etc/nginx/sites-available |

現在,使用您希望公開應用程式的網域名稱建立一個檔案。為了進行示範,我們將使用 example.com:
|
1 |
sudo nano example.com |
在區塊檔案中輸入以下程式碼:
|
1 2 3 4 5 6 |
server { server_name example.com www.example.com; location / { proxy_pass http: //localhost:9990; } } |

在這裡,我們使用 proxy_pass 在伺服器的 IP 位址 (localhost) 的連接埠上提供 Go 網頁應用程式 9990.
要啟用 Nginx 區塊,請建立該檔案到 sites-enabled 資料夾的符號連結(也稱為軟連結):
|
1 |
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/example.com |

重新載入 Nginx 設定以使變更生效:
|
1 |
sudo nginx -s reload |
步驟 4 – 驗證
如果一切順利,現在應該可以存取該 Web 應用程式,網址為 localhost:9990 以及我們設定的網域。在網頁瀏覽器中開啟該 URL:
|
1 |
localhost:9990 |

如預期,應用程式在螢幕上印出 “Hello World”。這是主要路由的工作。接下來,透過造訪以下 URL 來測試第二個路由:
|
1 |
localhost:9990/greet/<name> |

應用程式已成功傳回簡單的問候訊息,其中包含從 URL 接收到的參數中的名稱。
太棒了!我們已成功在本地伺服器上部署了 Go Web 應用程式!
結語
在本指南中,我們示範了如何藉助 Go 標準函式庫來部署一個簡單的 Go Web 應用程式。我們還使用 Nginx 部署了一個反向代理。雖然此示範是在本地伺服器上進行的,但對於公開伺服器,強烈建議您 實作 SSL 憑證 以安全地暴露於網際網路。若要了解更多 Go 程式設計,您可以參考我們關於 建置與安裝 Go 程式.
祝您運算愉快!


留言
目前尚無留言。成為第一個留言的人吧。