如何在Ubuntu 18.04上使用Nginx部署Go Web应用程序

在本教程中,您将在Go中构建一个“Hello World”Web应用程序,并使用Nginx作为反向代理将其部署在Ubuntu 18.04服务器上。 Go是一种通用编程语言,逐渐成为最流行的Web后端编程语言之一。 Nginx是世界上使用最多的Web服务器之一,因为它具有轻量级的资源使用和负载下的可靠性。

作者选择技术教育基金作为Write for DOnations计划的一部分接受捐赠。

介绍

Go是一种通用编程语言,逐渐成为最流行的Web后端编程语言之一。 通过专注于简单性,Go的设计人员创建了一种易于学习且比Web应用程序的许多其他语言更快的语言,利用了高效的功能,例如由于其并发性,它能够一次处理多个请求。 因此,在Go中部署Web应用程序对许多后端开发人员都很有用。

Nginx是世界上最受欢迎的Web服务器之一,因为它具有轻量级的资源使用和负载下的可靠性。 互联网上许多规模最大,交易量最大的网站依赖于Nginx来提供内容。 在部署中,Nginx通常用作负载平衡器或反向代理,以提高安全性并使应用程序更加健壮。 结合Go网络后端,Nginx可以提供强大而快速的Web应用程序。

在本教程中,您将在Go中构建一个Hello World Web应用程序,并使用Nginx作为反向代理将其部署在Ubuntu 18.04服务器上。

先决条件

要学习本教程,您需要具备以下条件:

此外,为了实现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文件中:

〜/走/去的Web / main.go
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)
}

现在让我们从第一行开始查看前面的代码片段。

首先,您在应用程序中编写了入口点:

〜/走/去的Web / main.go
package main
...

package main告诉Go编译器将此文件编译为可执行程序而不是共享库。

接下来,您有import语句:

〜/走/去的Web / main.go
...

import (
    "fmt"
    "net/http"
)
...

此代码段导入此代码工作所需的必要模块,其中包括标准fmt软件包和Web服务器的net/http软件包。

下一个代码片段在main函数中创建第一个路径,这是任何Go应用程序的入口点:

〜/走/去的Web / main.go
...
func main () {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, "Hello World")
    })
  ...
}
...

父路由/func main创建,它将在请求时返回文本Hello World

下面的代码段中显示的第二个路径接受一个URL参数,在这种情况下是一个名称,以显示伴随问候语。

〜/走/去的Web / main.go
...
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参数中的名称传递。

最后,您实例化您的服务器:

〜/走/去的Web / main.go
...
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

要设置服务的参数,请将以下代码段添加到文件中。

/lib/systemd/system/goweb.service
[Unit]
Description=goweb

[Service]
Type=simple
Restart=always
RestartSec=5s
ExecStart=/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的设置:

在/ etc / nginx的/网站可用/您的网域
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_domainwww.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 Page Display

您将收到一条简单的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系列,了解有关使用这种高效语言进行编程的更多信息。