作者选择技术教育基金作为Write for DOnations计划的一部分接受捐赠。
介绍
Go是一种通用编程语言,逐渐成为最流行的Web后端编程语言之一。 通过专注于简单性,Go的设计人员创建了一种易于学习且比Web应用程序的许多其他语言更快的语言,利用了高效的功能,例如由于其并发性,它能够一次处理多个请求。 因此,在Go中部署Web应用程序对许多后端开发人员都很有用。
Nginx是世界上最受欢迎的Web服务器之一,因为它具有轻量级的资源使用和负载下的可靠性。 互联网上许多规模最大,交易量最大的网站依赖于Nginx来提供内容。 在部署中,Nginx通常用作负载平衡器或反向代理,以提高安全性并使应用程序更加健壮。 结合Go网络后端,Nginx可以提供强大而快速的Web应用程序。
在本教程中,您将在Go中构建一个Hello World
Web应用程序,并使用Nginx作为反向代理将其部署在Ubuntu 18.04服务器上。
先决条件
要学习本教程,您需要具备以下条件:
- 一个Ubuntu 18.04服务器通过遵循Ubuntu 18.04教程的初始服务器设置来设置 ,包括sudo非root用户和防火墙。
- 在Ubuntu 18.04上按照如何安装Go和设置本地编程环境安装的Go编程语言。
- 通过如何在Ubuntu 18.04上安装Nginx来安装Nginx 。 不要按照第5步 – 设置服务器块 ; 您将在本教程后面创建一个Nginx服务器块。
- 指向服务器的域名,如如何使用DigitalOcean设置主机名中所述 。 本教程将始终使用
your_domain
。 这是获取网站SSL证书所必需的,因此您可以使用TLS加密安全地为您的应用程序提供服务。
此外,为了实现Go Web应用程序的生产级部署,通过安装TLS / SSL证书来保持服务器安全非常重要。 强烈建议采取这一步骤。 要保护您的Go Web应用程序,请在本教程的第3步之后按照如何在Ubuntu 18.04上使用Let加密来保护Nginx,以获取免费的TLS / SSL证书。
第1步 – 构建Go Web应用程序
在此步骤中,您将构建一个示例Go Web应用程序,该应用程序在your_domain
上显示Hello World
并在your_domain /greet/
处向用户表示your_domain /greet/
。 如果您想了解有关Go中编程基础知识的更多信息,请查看我们如何编写您的第一个Go in Program文章。
首先,在GOPATH
目录中创建一个新目录来保存源文件。 您可以根据自己的喜好命名文件夹,但本教程将使用go-web
:
mkdir $GOPATH/go-web
按照Ubuntu 18.04上的前提教程如何安装Go和设置本地编程环境中建议的文件结构,这将为您的目录提供~/go/go-web
的路径。
接下来,运行以下命令将目录更改为GOPATH
新创建的文件夹:
cd $GOPATH/go-web
使用nano
或首选文本编辑器创建名为main.go
的文件,该文件将包含Web应用程序的源代码:
nano main.go
要创建Hello World
应用程序的功能,请将以下Go代码添加到新创建的main.go
文件中:
package mainimport ( "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)}
现在让我们从第一行开始查看前面的代码片段。
首先,您在应用程序中编写了入口点:
package main...
package main
告诉Go编译器将此文件编译为可执行程序而不是共享库。
接下来,您有import
语句:
...import ( "fmt" "net/http")...
此代码段导入此代码工作所需的必要模块,其中包括标准fmt
软件包和Web服务器的net/http
软件包。
下一个代码片段在main
函数中创建第一个路径,这是任何Go应用程序的入口点:
...func main () { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hello World") }) ...}...
父路由/
在func main
创建,它将在请求时返回文本Hello World
。
下面的代码段中显示的第二个路径接受一个URL参数,在这种情况下是一个名称,以显示伴随问候语。
...func main () { ... http.HandleFunc("/greet/", func(w http.ResponseWriter, r *http.Request) { name := r.URL.Path[len("/greet/"):] fmt.Fprintf(w, "Hello %s\n", name) })...}...
这使用Go的URL.Path
在/greet/
之后存储值,并将其作为URL参数中的名称传递。
最后,您实例化您的服务器:
...func main () { ... http.ListenAndServe(":9990", nil)}
前面的代码片段启动服务器并使用Go的内置http
服务器通过端口9990
公开您的应用程序。
检查完main.go
的代码后,保存文件并退出文本编辑器。
接下来,通过运行以下命令构建应用程序的二进制可执
go build main.go
上面的命令将编译main.go
以生成一个名为main
的可执行文件。
您已经创建了示例Go Web应用程序。 接下来,即使您没有访问服务器,也将创建一个systemd单元文件,以使您的应用程序在后台运行。
第2步 – 创建系统单元文件
在此步骤中,您将创建一个systemd单元文件,以便即使用户退出服务器,您的应用程序也可以在后台运行。 这将使您的应用程序保持持久性,使您更接近生产级部署。
首先,使用nano
或您首选的文本编辑器在名为goweb.service
/lib/systemd/system
目录中创建一个新文件:
sudo nano /lib/systemd/system/goweb.service
要设置服务的参数,请将以下代码段添加到文件中。
[Unit]Description=goweb[Service]Type=simpleRestart=alwaysRestartSec=5sExecStart=/home/user/go/go-web/main[Install]WantedBy=multi-user.target
ExecStart=/home/ user /go/go-web/main
变量指定此服务的入口点是通过位于/home/ user /go/go-web
目录中的main
可执行文件,其中user
是服务器非root sudo帐户用户名。 Restart=always
确保systemd在程序停止时始终尝试重新启动程序。 在下一行, RestartSec=5s
设置重新启动尝试之间的五秒等待时间。 WantedBy=multi-user.target
指定服务器将启用服务的状态。
保存并退出该文件。
现在您已经编写了服务单元文件,通过运行以下命令启动Go Web服务:
sudo service goweb start
要确认服务是否正在运行,请使用以下命令:
sudo service goweb status
您将收到以下输出:
● goweb.service - goweb Loaded: loaded (/lib/systemd/system/goweb.service; disabled; vendor preset: enabled) Active: active (running) since Wed 2019-07-17 23:28:57 UTC; 6s ago Main PID: 1891 (main) Tasks: 4 (limit: 1152) CGroup: /system.slice/goweb.service └─1891 /home/user/go/go-web/main
要了解有关使用systemd单元文件的更多信息,请参阅了解系统单元和单元文件 。
现在您已启动并运行应用程序,您可以设置Nginx反向代理。
第3步 – 使用Nginx设置反向代理
在此步骤中,您将创建一个Nginx服务器块并设置一个Nginx反向代理,以将您的应用程序公开到Internet。
首先,将您的工作目录更改为Nginx sites-available
目录:
cd /etc/nginx/sites-available
使用您希望公开应用程序的域的名称创建一个新文件。 本教程将使用your_domain
:
sudo nano your_domain
your_domain
添加到文件中以建立your_domain
的设置:
server { server_name your_domain www.your_domain; location / { proxy_pass http://localhost:9990; }}
此Nginx服务器块使用proxy_pass
在服务器的IP地址上为Go Web应用程序提供服务,该IP地址表示为localhost
以使其在端口9990
上运行。 server_name
表示映射到您的IP地址的域名,在本例中为your_domain
和www.your_domain
。
接下来,通过运行以下命令,在sites-enabled
文件夹中创建此Nginx配置的符号链接:
sudo ln -s /etc/nginx/sites-available/your_domain /etc/nginx/sites-enabled/your_domain
符号链接是另一个位置的文件的快捷方式。 新创建的快捷方式将始终引用原始文件,以便在对其进行编辑时调整为更新。 Nginx需要两个目录中的配置副本。
接下来,通过运行reload命令重新加载Nginx配置:
sudo nginx -s reload
要确保部署正常,请在浏览器中访问http:// your_domain
。 您将看到一个Hello World文本字符串。
注意:如前提条件部分所述,此时建议在服务器上启用SSL / TLS。 这将确保应用程序与其访问者之间的所有通信都将被加密,这在应用程序要求输入敏感信息(如登录名或密码)时尤其重要。 按照如何在Ubuntu 18.04上使用Let的加密来保护Nginx,以便在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
替换为您希望应用程序问候的名称:
应用程序将返回一个简单的问候语以及your-name
,该your-name
基于传递给URL的参数。
收到这些结果后,您已成功部署了Go Web应用程序。
结论
在本教程中,您使用Go创建了一个简单的Web应用程序,使用其标准库,使用Nginx设置反向代理,并在您的域上使用SSL证书来保护您的应用程序。 要了解有关Go的更多信息,请查看其官方文档 。 此外,您还可以查看我们的Go中的How To Code系列,了解有关使用这种高效语言进行编程的更多信息。