如何在 Ubuntu 上使用 Martini 在 Nginx 服务器后服务 Go 应用程序

金钱(警告)

** 状态:** 被贬值

如果您目前正在运行运行 Ubuntu 12.04 的服务器,我们强烈建议升级或迁移到支持的 Ubuntu 版本:

** 原因:** Ubuntu 12.04 已于 2017 年 4 月 28 日到期(EOL)并且不再收到安全补丁或更新。

** 相反,请参阅:** 此指南可能仍然有用作为参考,但可能不会在其他Ubuntu版本上工作. 如果可用,我们强烈建议使用为您正在使用的Ubuntu版本撰写的指南。

介绍


Web 框架是消除开发 Web 应用程序的一些痛苦的绝佳工具,它们通常会处理一些较低级别的配置,以便您专注于应用程序的功能和演示。

Martini 是 Go 编程语言的包,可执行这些功能,提供路由、静态文件服务、错误处理和中间件,并将其连接到现有的 Go Web 功能中,这样您就可以轻松连接到现有的 Go 代码并简化工作量。

在本指南中,我们将讨论如何使用 Martini 快速在 Ubuntu 12.04 服务器上构建 Go Web 应用程序。

安装 Go 与 GVM


虽然 Ubuntu 12.04 有 Go 包可在其默认存储库中安装,但 Martini 需要 Go 1.1 或更高版本才能正常运行。

而不是从库存中安装Go,我们会使用gvm(Go Version Manager)来安装最新版本的Go。

1sudo apt-get update
2sudo apt-get install curl git mercurial make binutils bison gcc

安装 gvm 依赖之后,我们可以从项目的 GitHub 页面下载并运行 gvm 安装脚本:

1bash < <(curl -s https://raw.github.com/moovweb/gvm/master/binscripts/gvm-installer)

这将将 gvm 脚本和文件安装到您的主文件夹中一个隐藏的目录中,名为 .gvm. 要使用 gvm 来安装 Go 版本,我们首先需要源代码脚本,以便我们的当前壳会话具有可用的脚本:

1source ~/.gvm/scripts/gvm

现在 gvm 命令在我们当前的壳中可用,我们可以通过发出以下命令来安装 Go 版本 1.2:

1gvm install go1.2

这将安装与 Martini 兼容的 Go 版本。通过键入将此设置为默认:

1gvm use go1.2 --default

创建一个Go环境


现在我们已经安装了Go,我们应该设置一个Go环境。Go期望事情以一定的方式进行组织,以正确构建。它期望一个项目目录与bin、src和pkg子目录。

我们将在我们的家庭目录中创建此结构:

1cd ~
2mkdir -p go/{bin,pkg,src}

现在我们必须设置我们的Go路径以反映这个项目目录,并将Go / Bin目录添加到我们的常规路径中,以便我们可以轻松运行我们的Go程序:

1export GOPATH=$HOME/go
2export PATH=$PATH:$GOPATH/bin

您可以将这些添加到您的 .bashrc,以便每次登录时执行:

1echo "export GOPATH=$HOME/go" >> ~/.bashrc
2echo "export PATH=$PATH:$GOPATH/bin" >> ~/.bashrc

您现在应该准备好为您的第一个 Martini 应用程序工作。

创建您的第一个 Martini 应用程序


您可以轻松地创建一个Hello world示例程序,它将展示马丁尼应用程序的一些品质。

我们将我们的程序命名为hello.go,并将其放入~/go/src目录中的同名应用程序目录:

1cd ~/go/src
2mkdir hello
3nano hello/hello.go

在此文件中,我们将从主要程序的通用Go包声明开始,然后我们将通过列出可以购买的位置来导入Martini包:

1package main
2
3import "github.com/codegangsta/martini"

接下来,我们将创建我们的主要功能,其中将包含我们的大部分程序:

 1package main
 2
 3import "github.com/codegangsta/martini"
 4
 5func main() {
 6
 7    server := martini.Classic()
 8    server.Get("/", func() string {
 9
10        return "<h1>Hello, world!</h1>"
11
12    })
13
14    server.Run()
15
16}

让我们看看我们插入到‘main()’函数中的代码是什么。

1server := martini.Classic()

该行初始化了一个名为服务器的变量,并将经典对象的实例分配给它。

1server.Get("/", func() string {
2
3    return "<h1>Hello, world!</h1>"
4
5})

代码的这个部分设置了一个 URL 处理器,它响应了对资源/的 HTTP 获取请求,这是根 URL 位置,换句话说,当用户请求服务器的基本 IP 地址或域名时,代码的一部分将被执行。

函数返回一个字符串,然后作为响应体返回,并在用户的浏览器窗口中渲染。

1server.Run()

此行是实际启动Martini服务器以聆听请求和路由流量的行。

保存并关闭文件,当你完成。

接下来,我们需要获得 Martini 包,这样 Go 就可以运行我们刚刚输入的程序:

1go get github.com/codegangsta/martini

这将下载包到我们的路径,以便Go可以找到和使用此资源。

最后,我们可以通过键入来运行我们的程序:

1go run hello.go

Martini 在端口 3000 上提供应用程序,因此您可以通过访问您的 IP 地址,然后在您的 Web 浏览器中使用端口号:

http://your_ip:3000

DigitalOcean Martini hello world

添加路由和参数


我们的第一个Hello World程序已经完成,但我们可以通过利用Martini的路由功能来改进它。

我们已经创建了一条路线,它为基础URL提供请求,这作为一般的默认功能很好,但如果我们想个性化它,我们需要能够从用户那里获取输入。

获取用户输入的一种方式是通过URL本身,我们可以将URL的一部分设置为参数,我们可以在为我们的函数设计返回值时调用。

在基础URL路线下方,让我们添加另一个路线:

 1. . .
 2server.Get("/", func() string {
 3
 4    return "<h1>Hello, world!</h1>"
 5
 6})
 7
 8server.Get("/:who", func(args martini.Params) string {
 9
10    return "<h1>Hello " + args["who"] + "</h1>"
11
12})
13. . .

我们的新处理器会响应任何跟随基于 URL 的请求,直到另一个 slash. 而不是匹配特定 URL 字符串,它使用一个名为 :who 的位数。

您还应该注意到,函数声明现在采用一种名为args的参数,类型为martini.Params

在处理器内部,我们基本上有相同的返回字符串,但我们通过使用语法args[who]来访问参数。

如果我们保存并再次运行它,我们可以访问上次访问基于 URL 的相同页面,但如果他们跟随基于 URL 的/your_name``:

http://your_ip:3000/Peter

DigitalOcean Martini routing example

我们可以通过将URL中的间隙替换为%20来连接多个单词:

http://your_ip:3000/is%20a%20rather%20fine%20greeting

DigitalOcean Martini multi word

如何通过 Nginx 代理您的应用程序


虽然Martini服务器是服务应用程序的绝佳方法,但允许它作为主服务器界面曝光可能不是最好的做法,我们可以使用Nginx作为反向代理来传递适当的参数给我们的应用程序。

从 Ubuntu 存储库中安装 Nginx,以便我们可以开始:

1sudo apt-get install nginx

我们的配置将是相对基本的,它只会将我们的请求直接传送到我们的Martini服务器。

编辑默认的 Nginx 配置文件:

1sudo nano /etc/nginx/sites-enabled/default

内部,更改server_name声明以匹配您的 IP 地址或域名. 如果您正在使用域名,请确保在您的 DigitalOcean 控制面板中设置主机名(https://www.digitalocean.com/community/articles/how-to-set-up-a-host-name-with-digitalocean)。

server_name your_ip_or_domain;

接下来,我们将更改位置/声明以将请求信息传递给我们的Martini应用程序。删除或评论默认的位置/部分,并添加一个新的,处理此通道:

1location / {
2    proxy_set_header X-Real-IP $remote_addr;
3    proxy_set_header X-Forwarded-For $remote_addr;
4    proxy_set_header Host $host;
5    proxy_pass http://127.0.0.1:3000;
6}

保存并关闭文件,当你做这些更改。

现在,我们将重新启动服务器来实施我们的更改:

1sudo service nginx restart

现在,我们已经配置了前端服务器,并准备将连接传递给我们的应用程序,我们需要启动我们的程序来接受这些连接。

目前,我们正在使用以下语法运行我们的程序:

go run program_name

相反,我们应该安装我们的程序,以便我们可以按名称运行它. 我们已经设置了我们的系统路径,以找到我们将与Go安装的程序。

通过键入来安装您的程序:

1go install hello

这将编译并将我们的程序保存到~/go/bin目录中。

现在,我们可以通过键入简单地开始我们的程序:

1hello

这将启动我们的Martini服务器,它会听取3000端口的请求,就像它总是这样。

如果我们想能够访问命令行,我们应该在背景中启动它,而不是通过键入CTRL-C来停止程序,然后这样开始:

1hello &

这将使我们能够在我们的应用程序工作时继续键入命令。

如果您访问您的服务器通过访问其 IP 地址或域名,您应该被路由到您的应用程序. 如果您跟随域名与一个 slash 和一个名字,您将被欢迎:

http://your_ip_or_domain/John

DigitalOcean Martini Nginx proxy

结论


Martini 使得在 Go 程序中轻松处理 Web 请求,而不是从头开始重写一切,它试图创建功能,在核心 Web 包中逻辑上扩展现有的服务器功能。

虽然我们的示例在本文中相当简单,但Martini可以处理更复杂的配置,它实现了一个中间件系统,用于将其他功能注入服务流程,并可以通过使用社区贡献来扩展。

By Justin Ellingwood
Published At
Categories with 技术
Tagged with
comments powered by Disqus