未加星标

如何在 Ubuntu 16.04 上安装和配置 NATS

字体大小 | |
[系统(linux) 所属分类 系统(linux) | 发布者 店小二04 | 时间 2016 | 作者 红领巾 ] 0人收藏点击收藏
介绍

NATS是一个开源且高性能的消息系统,它常常被认为是"一个为云服务的中央神经系统".它每秒钟可以传送百万条消息,所以非常适合用来连接微服务和IOT设备。

NATS是一个发布订阅方式的消息系统。在这类系统中,一个或多个消息发布者将特定的主题发送给一个消息中介者,然后消息中介者再将消息分发给任意客户端(或者这个主题的订阅者)。消息发布者不知道也不关心消息订阅者是谁,反之依然。由于我们可以在不影响系统其它部分的情况下增加新的消息发布者和订阅者,这样的架构使得系统的伸缩性变得很好并且可以比较容易地增加系统的容量。这种类型的系统非常适合用来监测服务器和终端设备;终端设备可以发送消息,我们可以订阅这些消息,然后通过邮件或者其他的方式发送消息通知。

在本教程中,我们会安装官方的NATS服务器gnatsd,gnatsd可以提供服务,而且可以以相对安全的方式被访问。我们也会创建一个基本的服务端过载警告系统,它使用gnatsd作为消息中介者,在服务器负载过大时向外部发送邮件。

先决条件

要完整地学习本篇教程,你需要:

一个新的Ubuntu 16.04服务器。

一个具有sudo权限的标准用户账号。你可以参考 初始化 Ubuntu 16.04服务器设置 进行标准账号的设置。

第一步 ― 下载NATS服务器

首先,我们要下载gnatsd服务器,并确保能正确无误地在我们的系统上运行。

编写本教程时,最新的gnatsd稳定版本是0.9.4。你可以查看 NATS download page 以获取最新版,根据你的需要,如果你想使用更新的版本的话,可以键入下面的命令。

首先,使用非root账号登录到你的服务器:

ssh [email protected]_server_ip

然后,确保当前目录为自己的用户home目录:

cd

接着,使用wget命令将gnatsd下载到你的服务器:

wget https://github.com/nats-io/gnatsd/releases/download/v0.9.4/gnatsd-v0.9.4-linux-amd64.zip

刚刚下载的文件是一个压缩文件,所以还需要安装unzip工具来解压文件。可以使用apt命令进行安装:

sudo apt-get install -y unzip

然后使用unzip工具解压gnatsd:

unzip -p gnatsd-v0.9.4-linux-amd64.zip gnatsd-v0.9.4-linux-amd64/gnatsd > gnatsd

接下来,改变gnatsd的权限为可执行,以便可以运行它:

chmod +x gnatsd

我们开始测试,在当前目录中执行gnatsd命令运行它:

./gnatsd --addr 127.0.0.1 --port 4222

你会看到其输出就像例子给出的这样:

Output [1851] 2016/09/23 05:20:02.247420 [INF] Starting nats-server version 0.9.4 [1851] 2016/09/23 05:20:02.248182 [INF] Listening for client connections on 127.0.0.1:4222 [1851] 2016/09/23 05:20:02.248626 [INF] Server is ready

默认情况下,gnatsd监听的端口是4222,监听的地址是0.0.0.0(即所有接口)。使用--port参数,你可以改变端口,使用--addr可以改变监听的地址。我们使用--addr 127.0.0.1参数运行gnatsd,意思是仅仅在我们自己的服务器上可用,而外部的客户端无法访问。在后面的教程中,我们将提高gnatsd的安全性,使得全世界都可以访问它。

键入CTRL+C关闭gnatsd。

既然你已经知道了gnatsd的使用方法,那么我们就来用更正式的方式对其进行设置。

第2步 ― 创建目录结构和配置文件

在Linux中,第三方的和服务器相关的软件通常放置在/srv目录。我们打算遵循这种约定,将NATS相关的文件放在/srv/nats目录。将gnatsd可执行文件放在/srv/nats/bin目录。

首先,创建/srv/nats/bin目录

sudo mkdir -p /srv/nats/bin

然后将gnatsd移动到/srv/nats/bin目录:

sudo mv ~/gnatsd /srv/nats/bin

服务器可以从一个文件加载配置,因为后面的教程需要修改服务器设置,所以我们手工建立这个文件。创建文件/srv/nats/gnatsd.config:

sudo nano /srv/nats/gnatsd.config

并在文件中增加下面的内容:

/srv/nats/gnatsd.config port: 4222 net: '127.0.0.1'

这个配置文件讲的是gnatsd的监听地址为127.0.0.1,监听端口为4222,就像前面讲的一样,但这次我们就不需要在命令行中指定那些选项了。

我们再来运行一次服务器以确保我们的配置正确。执行下面的命令,将使用新的配置文件启动gnatsd:

/srv/nats/bin/gnatsd -c /srv/nats/gnatsd.config

输出的内容和前面看到的类似:

Output [1869] 2016/06/18 05:30:55.988856 [INF] Starting nats-server version 0.9.4 [1869] 2016/06/18 05:30:55.989190 [INF] Listening for client connections on 127.0.0.1:4222 [1869] 2016/06/18 05:30:55.989562 [INF] Server is ready

再一次按CTRL+C关闭gnatsd,并返回到提示符。现在我们来创建一个运行该服务器的用户:

第3步-创建服务使用者

为了在其中某个服务发生异常时减少对整个系统造成的损害,在运行每个服务上使用各自的用户账号是比较好的,较安全的实践。现在我们来创建一个具有NATS服务和NATS的相关文件的用户和组。

首先,创建一个叫做nats的系统用户和组:

sudo adduser --system --group --no-create-home --shell /bin/false nats Output Adding system user `nats' (UID 106) ... Adding new group `nats' (GID 114) ... Adding new user `nats' (UID 106) with group `nats' ... Not creating home directory `/home/nats'.

我们把/bin/false赋值给nats系统用户。这样的话系统用户就不能登录和创建根文件夹。同时我们创建了一个nats组。

我们现在让nats用户和组拥有/srv文件夹:

sudo chown -R nats:nats /srv

我们已经创建好了nats用户和组,下面继续创建NATS服务。

第4步 ― 使gnatsd作为一个服务来运行

我们希望gnatsd能在系统启动时以及系统崩溃重启时自动运行。可以使用 systemd 来处理这个问题。

systemd 是Linux系统中的服务管理器。它负责在系统启动时开启服务,根据需要重启服务以及在系统关闭时以一种可控的方式关闭服务。

为了定义如何以及何时启动NATS服务,我们需要创建一个 服务配置文件。 用户创建的服务文件位于/etc/systemd/system,因此创建文件:

sudo nano /etc/systemd/system/nats.service

在文件中,放置这些脚本以指定gnatsd如何启动:

/etc/systemd/system/nats.service [Unit] Description=NATS messaging server [Service] ExecStart=/srv/nats/bin/gnatsd -c /srv/nats/gnatsd.config User=nats Restart=on-failure [Install] WantedBy=multi-user.target [Unit]部分包括有关服务的普通信息,例如Description(描述),它对这个服务进行了描述。 [Service]部分包括与服务相关的配置。ExecStart是运行服务器的命令。这里我们使用的是gnatsd可执行文件的绝对路径。Restart=on-failure意思是如果服务崩溃掉或因故障而停止时必须重启。如果是被systemd停止掉的将不会重启。 [Install]部分包括与服务相关的安装信息。WantedBy=multi-user.target告诉systemd当启动multi-user.target时开启服务。 这是一种系统启动时开启服务的常见方式。

既然服务描述正确无误了,我们就可以使用下面的命令启动它:

sudo systemctl start nats

发送PING消息以确认gnatsd正在运行:

printf "PING\r\n" | nc 127.0.0.1 4222

我们刚刚使用了nc来和gnatsd通信。nc是一个命令行工具,它可以和TCP或UDP服务器通信。我们使用的命令会打印类似下面这样的输出:

Output INFO {"server_id":"Os7xI5uGlYFJfLlfo1vHox","version":"0.9.4","go":"go1.6.3","host":"127.0.0.1","port":4222,"auth_required":false,"ssl_required":false,"tls_required":false,"tls_verify":false,"max_payload":1048576} PONG

这个PONG响应让我们知道了服务器正在监听并且工作正常。我们还需要运行最后一个命令以使NATS服务在系统启动时开启:

sudo systemctl enable nats

你会看到下面的输出,这就确保了服务已被安装:

Output Created symlink from /etc/systemd/system/multi-user.target.wants/nats.service to /etc/systemd/system/nats.service.

我们成功地配置了gnatsd作为一个服务来运行。现在我们配置其安全性,使它可以被外部客户端访问。

第5步 ― 到 NATS 服务的安全连接

如果gnatsd 运行时使用的所有发布者和订阅者都在同一台服务器上,那么就可以认为已经完成了并继续下面的工作,但是这是极少数的情况。于是需要让外部客户端以安全的方式连接并发布消息到gnatsd。

gnatsd 支持 TLS 传输,所以可以用它来在gnatsd 和NATS 客户端之间进行安全通信。

首先,需要一个证书。可以购买商业证书、从 Let's Encrypt 获取一个证书或者生成一个自签名的证书。这里采用后一种方法,因为获取证书已经超出了本文讨论的范围。

创建一个目录来临时保存证书:

mkdir ~/priv

然后使用下面的命令来创建一个自签名证书:

openssl req -x509 -nodes -days 3650 -newkey rsa:2048 \ -keyout priv/gnatsd.key -out priv/gnatsd.crt \ -subj "/C=US/ST=Texas/L=Austin/O=AwesomeThings/CN=www.example.com"

这条命令创建了一个2048位且有效期为10年的 RSA 证书。注意,这里使用了任意域名,因为在本文中不会为 gnatsd 服务器启用 TLS 验证。

现在~/priv目录中存在gnatsd.key 和 gnatsd.crt 文件。将这些文件移动到 /srv/nats/ 目录结构下,这样一切都在一个地方了。执行下面的命令:

sudo mv ~/priv /srv/nats

现在,让 /srv/nats/priv 只能被 nats 用户和组访问:

sudo chmod 440 /srv/nats/priv/* sudo chmod 550 /srv/nats/priv sudo chown -R nats:nats /srv/nats/priv

现在将刚才创建的证书和密钥路径写入 /srv/nats/gnatsd.config 配置文件。 再次打开配置文件:

sudo nano /srv/nats/gnatsd.config

并添加下面的内容以告知 gnatsd 使用证书和密钥:

/srv/nats/gnatsd.config . . . tls { cert_file: "/srv/nats/priv/gnatsd.crt" key_file: "/srv/nats/priv/gnatsd.key" timeout: 1

保存文件并退出编辑器。然后重启服务以获取更改的配置。

sudo systemctl restart nats

测试一下证书是否能正常工作。执行下面的命令:

printf "PING\r\n" | nc loca

本文系统(linux)相关术语:linux系统 鸟哥的linux私房菜 linux命令大全 linux操作系统

分页:12
转载请注明
本文标题:如何在 Ubuntu 16.04 上安装和配置 NATS
本站链接:http://www.codesec.net/view/482799.html
分享请点击:


1.凡CodeSecTeam转载的文章,均出自其它媒体或其他官网介绍,目的在于传递更多的信息,并不代表本站赞同其观点和其真实性负责;
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性,不作出任何保证或承若;
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。
登录后可拥有收藏文章、关注作者等权限...
技术大类 技术大类 | 系统(linux) | 评论(0) | 阅读(42)