介绍
NATS是一个开源的高性能通讯系统,通常被描述为“为云中枢神经系统”。 它能够路由每秒百万次,这使得它非常适合连接微服务和 物联网 (物联网)设备的消息的。 NATS是 PubSub的邮件系统 。 在这种系统中,一个或多个 发布消息发送具有特定主题到 消息代理和消息中介传递这些消息到任何客户机,或者给定主题的 订户 。发布商不知道甚至不关心订阅者,反之亦然。这种架构可以轻松扩展系统并添加新功能,因为我们可以添加发布商和订阅者,而不会影响系统的其余部分。这种类型的系统非常适合监控服务器和设备;设备可以发送消息,我们可以订阅这些消息,通过电子邮件或其他方式发送通知。 在本教程中,我们将安装gnatsd
,官方NATS服务器,作为一个服务,使之成为一个安全的方式访问。 我们还将创建一个发送电子邮件时,服务器负载过高,使用基本服务器超载报警系统
gnatsd
作为其消息代理。
先决条件
要完成本教程,您需要:- 一个新的Ubuntu 16.04服务器。
- 以标准用户帐户
sudo
权限。 您可以按照设立一个标准帐户与Ubuntu 16.04初始服务器设置 。
第1步 - 下载NATS服务器
让我们通过下载启动gnatsd
服务器,并确保它在我们的系统运行没有任何问题。 最新的稳定
gnatsd
版本是0.9.4版本在本教程编写时。 您可以检查
的NATS下载页面的更新版本,适应以下必要的命令,如果你想使用一个新的版本。 首先,使用非root帐户登录到您的服务器:
ssh sammy@your_server_ip
然后,确保您位于用户的主目录中:
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
:
./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
你可以改变它监听的地址。 我们跑了
gnatsd
与
--addr 127.0.0.1
,因此它仅在我们的服务器,不能由外部客户端访问。 在稍后的教程中,我们将确保
gnatsd
并打开它向世界。 按
CTRL+C
关闭
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
服务器侦听端口
4222
上的地址
127.0.0.1
,就像以前一样,但这次我们不会有指定命令行上这些选项。 让我们再次运行服务器,以确保我们已正确配置的东西。执行以下命令来启动
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
OutputAdding 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
组。 让我们改变了所有者
/srv
目录到
nats
用户和组:
sudo chown -R nats:nats /srv
现在,我们已经创建了
nats
用户和组,让我们继续创造NATS服务。
第4步 - 运行gnatsd作为服务
我们希望gnatsd
时启动系统启动,如果它崩溃重启。 我们将使用
systemd来处理这个问题。
systemd是Linux系统的服务管理。它负责启动服务,必要时重新启动它们,并在系统关闭时以受控的方式停止它们。 我们需要以定义如何NATS服务应启动以及何时创建一个
服务配置 。 用户创建的服务文件住
/etc/systemd/system
,所以创建文件
/etc/systemd/system/nats.service
:
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
让我们确认
gnatsd
通过发送运行
PING
消息:
printf "PING\r\n" | nc 127.0.0.1 4222
我们只是用
nc
与沟通
gnatsd
,
nc
是一个命令行实用程序与TCP或UDP服务器进行通信。我们使用的命令打印输出类似于以下内容:
OutputINFO {"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
您将看到以下输出,确认已安装服务:
OutputCreated 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
和NAT客户。 首先,我们需要一个证书。你可以买一个商业证书,检索一个来自
咱们加密或生成自签名证书。我们将使用后一种方法,因为获取证书超出了本文的范围。 创建临时保存证书的目录:
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证书。请注意,我们使用了一个任意的域名,因为我们将不启用TLS验证的
gnatsd
这篇文章中的服务器。 你现在应该有文件
gnatsd.key
和
gnatsd.crt
在
~/priv
目录。 让我们将这些文件我们下
/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 localhost 4222
这一次,命令输出此消息:
OutputINFO {"server_id":"npkIPrCE5Kp8O3v1EfV8dz","version":"0.9.4","go":"go1.6.3","host":"127.0.0.1","port":4222,"auth_required":false,"ssl_required":true,"tls_required":true,"tls_verify":false,"max_payload":1048576}
-ERR 'Secure Connection - TLS Required'
服务器返回的消息
-ERR 'Secure Connection - TLS Required'
这证实了新的配置被拾起,并安全连接是必需的,而
nc
不知道该怎么办。 为了能够无需安装一个完全成熟的NATS客户与我们NATS的服务沟通,我们将使用一个名为
catnats工具。让我们先下载吧:
wget https://github.com/yuce/catnats/raw/0.1.2/catnats.py
并使其可执行:
chmod +x catnats.py
最后,移动
catnats.py
到
/srv/nats/bin
的文件夹,重命名为
catnats
:
sudo mv catnats.py /srv/nats/bin/catnats
让我们来看看,我们可以用我们的NATS使用服务进行通信
catnats
通过发送一样,
PING
我们之前发送的消息:
printf "PING\r\n" | /srv/nats/bin/catnats --addr 127.0.0.1:4222
您会看到此输出,表明我们的连接是安全的:
OutputINFO {"server_id":"npkIPrCE5Kp8O3v1EfV8dz","version":"0.9.4","go":"go1.6.3","host":"127.0.0.1","port":4222,"auth_required":false,"ssl_required":true,"tls_required":true,"tls_verify":false,"max_payload":1048576}
PONG
现在,我们已经确保了通信,让我们启用身份验证,以便需要用户名和密码连接到NATS。
第6步 - 需要身份验证
我们的NATS服务默认不需要身份验证。这是罚款时,该服务仅在专用网络上访问,但我们希望在互联网上我们NATS服务残障人士,所以我们应该启用身份验证。gnatsd
支持用户名和密码的认证,而且很容易使。 打开
/srv/nats/gnatsd.config
文件:
sudo nano /srv/nats/gnatsd.config
添加一个新
authorization
部分指定的凭据。 我们将使用
user1
的用户名和
pass1
作为密码本教程。您应该在生产环境中使用更长,更复杂的密码:
/srv/nats/gnatsd.config
. . .
authorization {
user: user1
password: pass1
}
保存文件,然后的所有者更改
/srv/nats/gnatsd.config
到
nats
为了保护从系统上的其他用户的用户名和密码,并使其可读由该用户:
sudo chown nats /srv/nats/gnatsd.config
sudo chmod 400 /srv/nats/gnatsd.config
然后重新启动服务以使更改生效:
sudo systemctl restart nats
让我们发送
PING
消息
gnatsd
检查是否一切正常。 再次,使用
catnats
发送消息:
printf "PING\r\n" | /srv/nats/bin/catnats --addr 127.0.0.1:4222
您将看到以下输出:
OutputNFO {"server_id":"sY0SSJBNbEw53HxzS9mH1t","version":"0.9.4","go":"go1.6.3","host":"127.0.0.1","port":4222,"auth_required":true,"ssl_required":true,"tls_required":true,"tls_verify":false,"max_payload":1048576}
-ERR 'Authorization Violation'
这告诉我们更改已成功应用,我们现在需要发送正确的用户名和密码才能连接到该服务。让我们再试一次,这次提供的用户名
user1
和密码
pass1
:
printf "PING\r\n" | /srv/nats/bin/catnats --addr 127.0.0.1:4222 --user user1 --pass pass1
这一次它的工作,你可以从以下输出看到:
OutputINFO {"server_id":"sY0SSJBNbEw53HxzS9mH1t","version":"0.9.4","go":"go1.6.3","host":"127.0.0.1","port":4222,"auth_required":true,"ssl_required":true,"tls_required":true,"tls_verify":false,"max_payload":1048576}
+OK
PONG
现在我们已将此服务限制为知道用户名和密码的客户端,我们可以重新配置服务,以便外部客户端可以连接。
第7步 - 向世界开放服务
我们已经配置好了NATS服务器侦听127.0.0.1
,这是本地接口。 如果我们让它侦听
0.0.0.0
,那么这将是提供给全世界。 让我们更新
/srv/nats/gnatsd.config
最后一次:
sudo nano /srv/nats/gnatsd.config
然后,更改与相关的IP地址
net
设置:
/srv/nats/gnatsd.config
. . .
net: '0.0.0.0'
. . .
保存文件并重新启动服务:
sudo systemctl restart nats
现在我们的NATS服务已准备好用于外部客户端连接。要了解如何使用它,让我们创建一个简单的监视服务,使用我们的NATS服务器作为消息代理。
第8步 - (可选)配置服务器过载的通知
在本节中,您将创建一个使用您的NATS服务的简单的过载监控系统。如果任何服务器过载,系统将接收服务器的负载平均值并向管理员发送电子邮件。 示例项目将包括以下组件:- 您刚刚配置的NATS服务。
- 显示器 ,其出版服务器的主机名,平均负载和处理器计数的
stats.loadaverage
每60秒课题。您需要在任何要监视负载的服务器上运行此组件。 - 一个通知 ,其中订阅了
stats.loadaverage
主题并接收服务器的主机名,平均负载和处理器计数。如果主机的负载平均值高于某个阈值,则通知程序通过SMTP服务器向预定义地址发送电子邮件。
设置显示器
您可以从Linux系统上读取的平均负载/proc/loadavg
。对于这个项目,我们只对最后一分钟的负载平均感兴趣,这是输出的第一个字段。使用此命令获取该值:
cat /proc/loadavg | cut -f1 -d" "
您将看到以下输出:
Output0.11
您通过阅读获得的平均负载
/proc/loadavg
取决于处理器的数量,所以你必须通过处理器的数量除以平均负荷正常化它。您可以使用以下命令获取服务器的处理器计数:
getconf _NPROCESSORS_ONLN
您将看到终端中显示的结果:
Output1
由于我们的服务器的默认shell不能处理浮点数运算,我们将发送负载平均值和处理器数量以及主机名作为我们的消息的有效载荷,并在稍后的通知器中进行除法。下面是我们将用来构造有效载荷的命令:
echo $(hostname) `cat /proc/loadavg | cut -f1 -d" "` `getconf _NPROCESSORS_ONLN`
该命令分别显示主机名,负载平均值和处理器数量:
Outputyour_hostname 0.28 1
让我们创建一个shell脚本,它出版的主机名,平均负载和处理器计数我们与主题NATS服务器
stats.loadaverage
。 我们将配置系统以定期运行此脚本。 创建一个名为新文件
~/publish_load_average.sh
:
nano ~/publish_load_average.sh
在文件中,添加以下脚本:
〜/ publish_load_average.sh
NATS_ADDR=127.0.0.1:4222
LOADAVG=$(cat /proc/loadavg | cut -f1 -d" ")
NPROC=$(getconf _NPROCESSORS_ONLN)
SUBJECT="stats.loadaverage"
PAYLOAD=$(echo $(hostname) $LOADAVG $NPROC)
MESSAGE="PUB $SUBJECT ${#PAYLOAD}\r\n${PAYLOAD}\r\n"
printf "$MESSAGE" | /srv/nats/bin/catnats -q --raw --addr $NATS_ADDR --user user1 --pass pass1
这个脚本创建消息,然后将其管道
catnats
,它出版的消息NATS服务。 我们运行
catnats
与
-q
开关来抑制任何输出,而我们使用
--raw
开关,使
catnats
不会尝试解释输入的内容。 您可以更改
$NATS_ADDR
如果NATS服务在不同的服务器变量的值。 让我们测试一下脚本向NATS发送负载平均值。 以下命令在
~/publish_load_average.sh
每5秒。 请注意,我们使用
&
字符的行结束在后台运行下面的命令:
while true; do sh ~/publish_load_average.sh; sleep 5; done &
您将看到显示命令正在后台运行并带有进程ID的输出:
Output[1] 14123
注 :某个地方记下进程ID,因为您将需要使用的ID后停止命令。 现在,连接到NAT和订阅主题
stats.loadaverage
检索的平均负载:
printf "SUB stats.loadaverage 0\r\n" | /srv/nats/bin/catnats --raw --no-exit --pong --user user1 --pass pass1
我们使用
--no-exit
标志,以禁用自动退出,
--pong
让我们NATS连接活着。如果一切正常,您应该得到一个类似于下面的输出,将每5秒更新一次:
OutputINFO {"server_id":"A8qJc7mdTy8AWBRhPWACzW","version":"0.8.1","go":"go1.6.2","host":"0.0.0.0","port":4222,"auth_required":true,"ssl_required":true,"tls_required":true,"tls_verify":false,"max_payload":1048576}
+OK
+OK
MSG stats.loadaverage 0 27
your_hostname 0.08 1
按
CTRL+C
键,可退出
catnats
。 让我们停止调用循环
publish_load_average.sh
太多,因为我们将有运行的更好方法
publish_load_average.sh
:
kill 14123
我们刚刚采用的方法非常适合测试,但这不是我们想永久使用的东西。我们希望系统运行
publish_load_average.sh
为每分钟运行。 为了实现这个目标,我们可以添加一个
crontab条目。 Linux系统使用
cron
,可以在我们指定的时间表运行命令,或者“工作”,一个系统。 该
crontab
命令让我们管理这些作业。 您可以了解所有的Cron教程
如何使用cron来自动执行任务在一个VPS 。 要创建新条目,请执行以下命令:
crontab -e
如果您从未运行过上述命令,您可能会看到以下提示,要求您选择文本编辑器来管理条目:
Outputno crontab for demo - using an empty one
Select an editor. To change later, run 'select-editor'.
1. /bin/ed
2. /bin/nano <---- easiest
3. /usr/bin/vim.basic
4. /usr/bin/vim.tiny
Choose 1-4 [2]:
键入与您最舒服,然后按编辑的数量
ENTER
。文件将显示在您选择的编辑器中。 在打开的文件的末尾,添加以下行,但替换您的用户名,如果你用过其他的东西比
sammy
:
*/1 * * * * bash /home/sammy/publish_load_average.sh
上面的条目表明
cron
来运行我们的
publish_load_average.sh
每分钟脚本。保存文件并关闭编辑器。 现在让我们测试一下负载平均值的定期发布是否正常:
printf "SUB stats.loadaverage 0\r\n" | /srv/nats/bin/catnats --raw --no-exit --pong --user user1 --pass pass1
等待几分钟,您看到的输出将类似于以下内容:
OutputINFO {"server_id":"A8qJc7mdTy8AWBRhPWACzW","version":"0.8.1","go":"go1.6.2","host":"0.0.0.0","port":4222,"auth_required":true,"ssl_required":true,"tls_required":true,"tls_verify":false,"max_payload":1048576}
+OK
+OK
MSG stats.loadaverage 0 27
your_hostname 0.01 1
MSG stats.loadaverage 0 27
your_hostname 0.00 1
按
CTRL+C
退出
catnats
。 我们已经成功设置了监视器,它正在向我们的NATS服务器发送消息。接下来,我们将设置使用此数据的通知程序。
创建通知程序
让我们创建一个连接到我们的NATS的服务和侦听通知stats.loadaverage
消息。每当我们的程序接收到消息时,它都会计算每个处理器的负载平均值。如果每个处理器的CPU利用率高于0.6或60%,则会为发布消息的主机设置警告标志,并向预定义地址发送电子邮件。如果每个处理器的负载平均值小于0.4,则清除主机的警告标志。为了防止洪水的收件箱,我们发送一个电子邮件,当警告标志设置。 我们将使用Node.JS创建通知程序,因为Node.js有一个伟大的NATS客户端。所以,首先安装Node.js:
sudo apt-get install -y npm
接下来,创建通知程序的目录并切换到它:
mkdir ~/overload_notifier && cd ~/overload_notifier
Node.js的项目中使用一个名为
package.json
其中包含有关项目及其相关性的信息。执行以下命令创建该文件:
npm init -y
然后安装的Node.js的NATS客户端,还有
nodemailer
我们将在这个项目中用来发送电子邮件警告模块:
npm install nodemailer@2.4.2 nats@0.6.4 --save-exact
现在我们可以创建通知程序。创建文件
notifier.js
:
nano notifier.js
然后将以下代码添加到文件中:
notifier.js
var NATS_URL = 'nats://127.0.0.1:4222';
var NATS_USER = 'user1';
var NATS_PASS = 'pass1';
var EMAIL_TO = 'admin@example.com';
请确保更改这些选项以匹配NATS服务的用户名和密码以及您的电子邮件地址。 接下来,添加以下代码导入Node.js的NATS客户端并连接到
gnatsd
服务:
notifier.js
var tlsOptions = {
rejectUnauthorized: false,
};
var nats = require('nats').connect({url: NATS_URL,
tls: tlsOptions,
user: NATS_USER,
pass: NATS_PASS});
然后添加此代码以设置邮件程序并连接到将发送电子邮件的SMTP服务器。我们会尽快设置此服务器:
notifier.js
var nodemailer = require('nodemailer');
var transport = nodemailer.createTransport('smtp://localhost:2525');
然后添加其余代码以计算负载平均值,并确定是否需要发送通知电子邮件:
notifier.js
// keep the state of warnings for each host
var warnings = {};
function sendEmail(subject, text) {
transport.sendMail({
to: EMAIL_TO,
subject: subject,
text: text
});
}
function processMessage(message) {
// message fields: host load processor_count
var fields = message.split(" ");
var host = fields[0];
var loadAverage = parseFloat(fields[1]) / parseInt(fields[2]);
if (loadAverage > 0.6) {
if (!warnings[host]) {
// send warning email if one wasn't already sent
var res = sendEmail('Warning! Server is Overloaded: ' + host,
'Load average: ' + loadAverage);
// set warning for the host
warnings[host] = true;
}
}
else if (loadAverage < 0.4) {
if (warnings[host]) {
// clear the warning
warnings[host] = false;
}
}
}
nats.subscribe('stats.loadaverage', processMessage);
我们订阅的消息,我们每次收到消息时,我们执行
processMessage
功能,解析我们发送的有效载荷,并确定平均负载。如果它太高,我们发送消息,我们跟踪,如果我们以前通过设置基于主机名的标志发送了一个。这样,我们可以在每个主机的基础上跟踪通知。如果负载平均值低于我们的阈值,我们清除该标志。 在监视器和通知器就位后,就可以测试我们的示例项目了。
测试项目
让我们用一个测试驱动器。我们将生成一些人为负载,并检查当负载太高时通知程序是否将发送警告电子邮件。 让我们安装了stress
工具到我们的服务器上生成CPU负载:
sudo apt-get install -y stress
接下来,我们需要设置一个SMTP服务器来从我们的通知器邮寄出来的邮件。安装和配置一个完整的SMTP服务器将是过度的测试,所以我们将使用一个简单的SMTP服务器,只显示发送给它的电子邮件,而不是实际发送它们。 Python编程语言有
DebuggingServer
模块,我们可以加载丢弃它接收到的电子邮件,但它们显示到屏幕上,所以我们可以保证工作的事情。 Python已经安装在我们的Ubuntu服务器上,因此这是一个完美的解决方案。 让我们在后台启动调试SMTP服务器。我们将使它监听
localhost
端口
2525
,它匹配我们在配置的SMTP地址
notifier.js
代码。执行此命令启动SMTP服务器:
python -m smtpd -n -c DebuggingServer localhost:2525 &
然后使用此命令在后台启动通知程序:
nodejs ~/overload_notifier/notifier.js &
最后,让我们在服务器的所有处理器上产生一些负载。执行
stress
与下列选项命令:
stress --cpu $(getconf _NPROCESSORS_ONLN)
几分钟后,您将看到类似于以下内容的输出,因为SMTP服务器开始显示通知程序发送的消息:
Output---------- MESSAGE FOLLOWS ----------
Content-Type: text/plain
To: admin@example.com
Subject: Warning! Server is Overloaded: your_hostname
Message-Id: <1466354822129-04c5d944-0d19670b-780eee12@localhost>
X-Mailer: nodemailer (2.4.2; +http://nodemailer.com/;
SMTP/2.5.0[client:2.5.0])
Content-Transfer-Encoding: 7bit
Date: Sun, 19 Jun 2016 16:47:02 +0000
MIME-Version: 1.0
X-Peer: 127.0.0.1
Load average: 0.88
------------ END MESSAGE ------------
这样,您就可以知道在服务器上的负载过高时,您已成功发送电子邮件。 按
CTRL+C
停止生成负载。您已完成示例项目,现在应该有一个好主意,如何使您的工作在您自己的环境中。