Wait the light to fall

第十三天 - 使用 Cro 和 Debian 从头构建 Web 服务

焉知非鱼

我和圣诞老人​​谈过,他说他不知道如何在 Debian 上安装 Cro,所以我对自己说:我要帮助他。

如果您对 Apache 等 Web 服务器有一些经验,并且您已经听说过 Raku 强大的并发/响应方面,那么您肯定有兴趣了解 Cro 服务。这篇文章的受众是具有 Debian 基本经验的人,或者在 Raku 新手…就像圣诞老人一样。

Cro 是一个 Raku 模块,它提供了轻松构建反应式和并发服务所需的一切,例如:Web 服务器。

在这篇文章中,我们将看到如何在 Debian 中安装 Cro,这是最受欢迎的 Linux 发行版之一。然后,我将解释 Cro 的演示示例。

我们将使用 Debian 9,64 位(Stretch),我们将在安装后启动它。

安装 Rakudo Raku 编译器 #

RakudoCro 模块运行的当前 Raku 编译器。安装 Rakudo 的常规方法是安装 Rakudo Star,但我更喜欢快速的方式:rakudo-pkg ……怎么样?只需从此 repo 下载并安装相应的 Debian 软件包。在我们的例子中,是来自 Debian 9, 64位.deb 文件。

使用 Debian 中的 root 用户,我们可以在 root home 中为 Rakudo 创建一个包文件夹,进入这个目录,下载 Debian 9, 64 位的当前 Rakudo 包,并安装它。就我而言:

mkdir ~/rakudo-packages && cd $_
wget https://github.com/nxadm/rakudo-pkg/releases/download/v2018.10-02/rakudo-pkg-Debian9_2018.10-02_amd64.deb
dpkg -i rakudo-pkg-Debian9_2018.10-02_amd64.deb

Rakudo 运行时编译器和相关工具现在安装在 /opt/rakudo-pkg 文件夹中。在 export PATH 行之前,让所有用户在 /etc/profile 文件中插入以下行:

PATH=$PATH:/opt/rakudo-pkg/bin

最后运行:

source /etc/profile

为所有用户重新加载 Debian 配置文件。

输入 raku -v:

raku -v
This is Rakudo version 2018.10 built on MoarVM version 2018.10
implementing Raku.c.

欢迎来到 Rakudo Raku!

安装 Cro 服务 #

Cro 是 Raku 模块,Zef 是已经安装的当前 Raku 模块管理器。我们来安装 Cro 吧!

首先,我们将安装一些 Cro 包依赖项,例如 git 来连接和下载来自 Cro 相关存储库的文件,libssl-dev 以提供对安全套接字层的支持,build-essential 用于构建在安装期间 Cro 所使用的一些依赖项:

apt-get install git libssl-dev build-essential

如果您位于仅允许 Web 流量(端口80和443)的防火墙下,它将阻止 git 协议使用的端口,并且 Cro 安装将失败。要避免这种情况,请键入:

git config --global url."https://".insteadOf git://

这告诉 git 使用 https 而不是 git 协议来连接 git 远程仓库。

现在我们准备用 Zef(及其所有依赖项)安装 Cro

zef install cro

如果在测试阶段安装失败,请尝试:

zef install --/test cro

如果 Cro 安装正确完成,Cro 就准备好了。

Cro 实战 #

让我们继续演示脚本。创建一个工作区文件夹,输入它并将下面的代码粘贴到名为 server.p6 的新文件中:

use Cro::HTTP::Router;
use Cro::HTTP::Server;

my $application = route {
  get -> 'greet', $name {
  content 'text/plain', "Hello, $name!";
  }
}

my Cro::Service $hello = Cro::HTTP::Server.new(:host<0.0.0.0>, :port<10000>, :$application);

$hello.start;

react whenever signal(SIGINT) { $hello.stop; exit; }

这个脚本有 4个部分

“use”使路由服务类可用于下面。

$application 是包含我们的 Web 应用程序的路由逻辑的对象,接收数据并将数据从客户端分发到我们的服务器。在这种情况下,get ->‘greet’,$name 映射来自客户端 Web 浏览器的传入 URL /greet/Ramiro,在对象 $name 中推送 Ramiro。然后将代码转换为花括号 {},返回响应 HTTP 请求头 content ’text/plain’ 和 HTTP 请求体 Hello, Ramiro! 到客户端 Web 浏览器。在一个严肃的应用程序中,在这部分中将会调用应用程序本身,并且它将等待响应,如示例所示。

$hello 是一个服务对象,它使传入的数据通过新的侦听套接字传递给我们的 $application。它有3个参数,:host<0.0.0.0> 是服务启动的 localhost, :port<10000> 是用于监听传入数据的端口,$application 是我们的Web 应用程序。 下面的行 $hello.start 开始侦听。

react whenever 等待按下 CTRL-C 时停止 Web 服务。

现在是从 shell 运行 Web 服务的时刻:

raku server.p6

现在您需要知道服务器主机的当前 IP 地址,尝试使用 ip addr。我的 Ip 地址是: 192.168.1.48

然后,从同一网络中的其他主机,打开 Web 浏览器并键入(在我这儿):

http://192.168.1.48:10000/greet/Ramiro

答案应该是 Hello, Ramiro!

总结 #

Debian 的新安装开始,我们已经了解了如何安装 Cro 并运行演示脚本。现在,您已准备好继续使用 Cro 文档,并发现 Raku 可提供的最有前途的并发/异步服务平台。

我希望在阅读这篇文章并查看 Cro 文档后,圣诞老人可以将他的网站迁移到 Cro Services。