作者选择了(https://www.brightfunds.org/funds/tech-education)作为 写给捐款计划的一部分的捐款。
介绍
[GO] (https://golang.org/)是一种通用编程语言,正在逐渐成为最受欢迎的网络后端编程语言之一. Go的设计者们通过注重简洁,创造了一种语言,既容易学习,也快于许多其他语言的网络应用,利用它由于其通用语而一次处理多个请求的能力等高效功能. 由于这个原因,在Go中部署一个网络应用程序将会对许多后端开发者有用.
Nginx是世界上最受欢迎的网页服务器之一,由于其轻量级的资源使用和其在负载下可靠性。互联网上最大的和最受欢迎的网站很多都依赖 Nginx 来服务他们的内容。在部署中, Nginx 经常被用作负载平衡器或反向代理来增加安全性和使应用程序更强大。与 Go 网页后端相结合, Nginx 可以提供强大而快速的网页应用程序。
在本教程中,您将在Go中构建一个Hello World
Web 应用程序,并将其部署到 Ubuntu 18.04 服务器上,使用 Nginx 作为反向代理。
前提条件
要遵循本教程,您将需要以下内容:
- 1个Ubuntu 18.04 服务器通过跟踪此初始服务器设置为Ubuntu 18.04 教程而设置,包括一个sudo非root用户和一个防火墙.
- [Go] (https://www.digitalocean.com/community/tutorial_series/how-to-code-in-go) 编程语言通过遵循[如何在Ubuntu 18.04上安装并设置本地编程环境(https://andsky.com/tech/tutorials/how-to-install-go-and-set-up-a-local-programming-environment-on-ubuntu-18-04)而安装.
- [Nginx] (https://www.nginx.com/) 安装方式是跟随[如何在Ubuntu 18.04上安装Nginx (https://andsky.com/tech/tutorials/how-to-install-nginx-on-ubuntu-18-04). 不要跟 [ 步骤5 – 设置服务器块** (https://andsky.com/tech/tutorials/how-to-install-nginx-on-ubuntu-18-04# step-5-%E2%80%93-setting-up-server-blocks-(recommended ) ); 您将在此教程中稍后创建一个 Nginx 服务器块 。
- 一个域名指向您的服务器,详见如何用数字海洋设置主机名. 此教程将始终使用
您的域
。 这是为您的网站获取 SSL 证书所必需的, 这样您就可以安全地使用 TLS 加密服务您的应用程序 。 .
此外,为了实现您的 Go Web 应用程序的生产级部署,重要的是通过安装 TLS/SSL 证书来保持您的服务器安全。 强烈鼓励此步骤**. 为了确保您的 Go Web 应用程序,请遵循 How To Secure Nginx with Let's Encrypt on Ubuntu 18.04之后的** 本教程的步骤 3** 获得免费的 TLS/SSL 证书。
步骤1 - 构建Go Web应用程序
在此步骤中,您将构建一个示例的Go Web 应用程序,该应用程序在)文章。
首先,在您的 GOPATH
目录中创建一个新的目录,以保持源文件。您可以随意命名文件夹,但本教程将使用 go-web
:
1mkdir $GOPATH/go-web
按照前提教程中建议的文件结构(How To Install Go and Set Up a Local Programming Environment on Ubuntu 18.04)(https://andsky.com/tech/tutorials/how-to-install-go-and-set-up-a-local-programming-environment-on-ubuntu-18-04),这将为您的目录提供‘~/go/go-web’的路径。
接下来,运行以下操作以更改您的GOPATH
中的新创建文件夹的目录:
1cd $GOPATH/go-web
使用nano
或您喜爱的文本编辑器创建一个名为main.go
的文件,该文件将包含您的Web应用程序的源代码:
1nano main.go
要创建Hello World
应用程序的功能,请在新创建的main.go
文件中添加以下Go代码:
1[label ~/go/go-web/main.go]
2package main
3
4import (
5 "fmt"
6 "net/http"
7)
8
9func main() {
10 http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
11 fmt.Fprintf(w, "Hello World")
12 })
13
14 http.HandleFunc("/greet/", func(w http.ResponseWriter, r *http.Request) {
15 name := r.URL.Path[len("/greet/"):]
16 fmt.Fprintf(w, "Hello %s\n", name)
17 })
18
19 http.ListenAndServe(":9990", nil)
20}
现在让我们来看看前面的代码片段会做什么,从第一行开始。
首先,你写入你的应用程序的入门点:
1[label ~/go/go-web/main.go]
2package main
3...
包主
告诉 Go 编译器将此文件编译为可执行的程序,而不是作为共享库。
接下来,你有进口
声明:
1[label ~/go/go-web/main.go]
2...
3
4import (
5 "fmt"
6 "net/http"
7)
8...
本片段导入了此代码工作所需的必要模块,其中包括标准的 fmt
包和您的 Web 服务器的 net/http
包。
下一个片段在主
函数中创建你的第一个路线,这是任何Go应用程序的入口点:
1[label ~/go/go-web/main.go]
2...
3func main () {
4 http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
5 fmt.Fprintf(w, "Hello World")
6 })
7 ...
8}
9...
在func main
中创建一个母路线,在请求时将返回文本Hello World
。
第二条路线如下所示,接受一个URL参数,在这种情况下,一个名称,以显示伴随着一个问候。
1[label ~/go/go-web/main.go]
2...
3func main () {
4 ...
5 http.HandleFunc("/greet/", func(w http.ResponseWriter, r *http.Request) {
6 name := r.URL.Path[len("/greet/"):]
7 fmt.Fprintf(w, "Hello %s\n", name)
8 })
9...
10}
11...
这使用Go的URL.Path
来存储在/greet/
之后的值,并将其作为URL参数的名称传递。
最后,您可以安装您的服务器:
1[label ~/go/go-web/main.go]
2...
3func main () {
4 ...
5 http.ListenAndServe(":9990", nil)
6}
上面的片段启动了服务器,并通过使用Go的内置http
服务器的端口9990
曝光您的应用程序。
一旦你完成了main.go
中的代码检查,保存文件并停止你的文本编辑器。
接下来,通过运行构建您的应用程序的二进制可执行:
1go build main.go
前一个命令将编译main.go
来生成一个名为main
的可执行命令。
接下来,您将创建一个 systemd 单元文件,使您的应用程序在后台运行,即使您没有访问您的服务器。
步骤 2 — 创建一个 Systemd 单位文件
在此步骤中,您将创建一个 systemd单元文件,使您的应用程序在后台运行,即使用户退出服务器。
首先,创建一个名为goweb.service
的/lib/systemd/system
目录中的新文件,使用nano
或您偏好的文本编辑器:
1sudo nano /lib/systemd/system/goweb.service
要设置服务的参数,请将下列片段添加到文件中。
1[label /lib/systemd/system/goweb.service]
2[Unit]
3Description=goweb
4
5[Service]
6Type=simple
7Restart=always
8RestartSec=5s
9ExecStart=/home/user/go/go-web/main
10
11[Install]
12WantedBy=multi-user.target
" ExecStart=/ home/user/go/go-web/main " 变量规定,这项服务的入站点是通过位于 " /home/user/go/go-web " 目录中的 " main " 可执行点,其中 " user " 是服务器的非root sudo账户用户名。 Restart=Always'确保系统在程序停止时总是试图重新启动。 在下行,
RestartSec=5s'为重启尝试设定了5秒钟的等待时间。 `WantedBy=多用户.object' 指定您服务器启用服务的状态 .
保存和退出文件。
现在你已经编写了服务单元文件,开始你的Go Web 服务,运行:
1sudo service goweb start
要确认服务是否正在运行,请使用以下命令:
1sudo service goweb status
您将收到以下输出:
1[secondary_label Output]
2● goweb.service - goweb
3 Loaded: loaded (/lib/systemd/system/goweb.service; disabled; vendor preset: enabled)
4 Active: active (running) since Wed 2019-07-17 23:28:57 UTC; 6s ago
5 Main PID: 1891 (main)
6 Tasks: 4 (limit: 1152)
7 CGroup: /system.slice/goweb.service
8 └─1891 /home/user/go/go-web/main
要了解更多有关使用 systemd 单元文件的信息,请参阅 理解 Systemd 单元和单元文件。
现在你已经启动了你的应用程序,你可以设置 Nginx 反向代理。
步骤 3 — 使用 Nginx 设置反向代理
在此步骤中,您将创建一个 Nginx 服务器块,并设置一个 Nginx 反向代理,将您的应用程序暴露在互联网上。
首先,将工作目录更改为 Nginx sites-available
目录:
1cd /etc/nginx/sites-available
创建一个新的文件,名称域,你想暴露你的应用程序. 这个教程将使用 your_domain
:
1sudo nano your_domain
將下列行添加到檔案中,以建立「your_domain」的設定:
1[label /etc/nginx/sites-available/your_domain]
2server {
3 server_name your_domain www.your_domain;
4
5 location / {
6 proxy_pass http://localhost:9990;
7 }
8}
这个 Nginx 服务器块使用 proxy_pass
在您的服务器的 IP 地址上服务 Go Web 应用程序,表示为 localhost
,使其在端口 9990
上运行。
接下来,通过运行以下命令在Sites-enabled
文件夹中创建此 Nginx 配置的 symlink:
1sudo ln -s /etc/nginx/sites-available/your_domain /etc/nginx/sites-enabled/your_domain
一个simlink是另一个位置的文件的缩写,新创建的缩写将始终引用原始文件,以便在进行编辑时调整到更新。
接下来,通过运行重新加载命令来重新加载您的 Nginx 配置:
1sudo nginx -s reload
要确保您的部署工作,请访问您的浏览器中的http://your_domain
。
<美元 > [注] 注: 正如Preressites部分所提及,建议此时启用服务器上的SSL/TLS. 这将确保应用程序与其访问者之间的所有通信都会被加密,这在应用程序要求登录或密码等敏感信息时尤为重要. 跟着 [How To Security Nginx with Let's Encrym on Ubuntu 18.04] (https://andsky.com/tech/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-ubuntu-18-04) 现在在 Ubuntu 18.04 为 Nginx 获得免费的 SSL 证书. 获取您的 SSL/ TLS 证书后, 请返回并完成此教程 。 < $ > (美元)
您现在已经设置了 Nginx 反向代理程序,以便将您的应用程序暴露在您的域名上,并通过 SSL/TLS 保护您的 Go Web 应用程序。
步骤4:测试应用程序
在此步骤中,您将通过安全连接测试您的应用程序,以确保一切正常工作。
打开您喜欢的网页浏览器,请访问 https://your_domain
:
您将收到一个简单的Hello World
消息.在URL中使用https://
时收到此消息表示您的应用程序正在通过安全连接提供服务。
接下来,尝试访问第二条路线 https://your_domain/greet/your-name
,取代 your-name
以任何你想要你的应用程序问候的名称:
应用程序将返回一个简单的问候,加上你的名字
,这是基于向URL传递的参数。
一旦您收到这些结果,您已经成功部署了 Go Web 应用程序。
结论
在本教程中,您使用其标准库创建了一个简单的网络应用程序,使用 Nginx 设置反向代理,并在您的域中使用 SSL 证书来保护您的应用程序. 要了解更多关于 Go,请查看他们的 官方文档. 此外,您还可以查看我们的系列 如何在 Go 中编码来了解更多关于编程在这个高效的语言。