Go 是一种开源的通用编程语言。它的灵感来自 Python 的高效率,同时提供了 C 语言的能力。它最初由 Google 开发,旨在解决其代码库面临的问题(代码复杂性和编译时间长)。与任何其他现代编程语言一样,Go 适用于各种用途。例如,它可以用于 Web 开发、命令行脚本、网络服务器应用、前端开发等。
在本指南中,我们将引导您完成在 Ubuntu 22.04 LTS 上部署一个简单 Go Web 应用程序的步骤。 我们还将实现 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 Web 应用
我们将构建一个简单的 Go Web 应用,在访问该域名时,它将在屏幕上打印 “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 应用程序的根目录。它将托管我们 Web 应用的源代码:
|
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 编译器将该文件编译为可执行文件,而不是共享库。
- The import 语句导入了程序运行所需的所有其他模块。在这里,我们导入了 fmt(用于打印文本)和 net/http (用于 Web 服务器应用)包。
- 使用函数
http.HandleFunc,我们建立了两个路由:
- 第一个路由 / 作为 中的父路由func main.
- 第二个路由
/greet/ 接受一个 URL 参数(在本例中为一个字符串)。然后该字符串将与问候消息一起显示。
- URL Path 用于存储其后的值 /greet/。然后该值作为 name URL 参数传递。
- 该 http.ListenAndServe 函数启动 Web 服务器。在这里,它正在监听端口 9990.
现在我们的程序已经准备就绪,将文件编译为可执行文件:
|
1 |
go build main.go |
Go 编译器将创建一个与该文件同名的可执行文件。查看输出:
|
1 |
ls -lh |
第 2 步 – 配置用于后台执行的 systemd 单元文件
到目前为止,如果当前用户注销系统,Go Web 应用程序将停止运行。对于 Web 服务器来说,这是一个糟糕的设计。为了解决这个问题,我们将创建一个 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 创建一个服务器块以充当反向代理。Web 应用程序将通过反向代理暴露给互联网(以获得额外的性能和安全性)。
将当前活动目录更改为 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 Web 应用程序 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 程序.
祝您编程愉快!


评论
暂无评论。发表第一条评论吧。