如何使用PM2在UbuntuVPS上设置Node.js生产环境
介绍
本教程旨在帮助您设置 Ubuntu 服务器以运行 Node.js 应用程序,包括基于 Express、Geddy 或 Sails 的应用程序。 这些说明将帮助您避免一些安全错误,并提供一些令人惊讶的好处,例如:
- 您不会以 root 身份运行您的应用程序; 因此,您的应用程序将更加安全。
- 您将使用端口 80 来运行您的应用程序,通常只能由 root 用户访问。 (您将能够使用自定义 URL 运行您的应用程序,例如 http://mysite.com - 但您不必指定端口。)
- 如果您的应用程序崩溃,它将重新启动,并且它将保留未处理异常的日志。
- 当服务器启动时,您的应用程序将重新启动 - 即 它将作为服务运行。
这些说明假定读者只有 Linux 的基本知识。 您可以跳过不需要的信息,但密切遵循这些步骤可能会带来一些好处。
创建一个安全帐户来运行您的代码
首次设置 DigitalOcean droplet 时,您会收到使用 root 帐户登录的说明。 说明看起来像这样:
要登录到您的 Droplet,您需要打开一个终端窗口并复制并粘贴以下字符串:
ssh root@192.241.xxx.xxx
请注意,“192.241.xxx.xxx”对您来说会有所不同。 只需按照您在设置虚拟服务器时从 DigitalOcean 收到的说明进行操作,然后使用 ssh 登录。
正如我们大多数人所理解的那样,如果您使用 root 帐户运行您的代码,并且如果敌对方破坏了代码,则该方可以完全控制您的 VPS。
为了避免这种情况,让我们设置一个安全帐户,如果我们提供适当的密码,它仍然可以执行 root 操作。 出于本教程的目的,我们称我们的安全用户为“safeuser”——您可以随意命名。 现在,以 root 用户身份登录并按照以下步骤操作:
- 使用
/home/safeuser/
中的文件夹创建用户:
useradd -s /bin/bash -m -d /home/safeuser -c "safe user" safeuser
- 为
safeuser
创建一个密码 - 输入以下命令后,系统会要求您输入两次:
passwd safeuser
- 授予安全用户使用 root 级别命令的权限:
usermod -aG sudo username
以安全用户身份登录
按 ctrl-D 退出 DigitalOcean 根会话。
请注意,以安全用户身份登录的命令与您之前使用的命令相同,但用户名已更改。 以安全用户身份登录后,每次要运行具有 root 权限的命令时,都必须使用单词 sudo 继续执行该命令。 从您自己机器上的命令行,使用下面显示的命令登录。
ssh safeuser@192.241.xxx.xxx
安装 GIT
您已经登录,安装 GIT(我们将使用 GIT 来安装 Node.js。)。 如果出于任何原因,您对 GIT 不熟悉,那么它是一个美丽的工具,将成为您生活的重要组成部分。 如果您想了解更多信息,请阅读 GIT 书籍。 在 Ubuntu 上安装它很容易:
sudo apt-get install git
单词 sudo 表示您想以 root 身份运行此命令。 系统将提示您输入密码 - 即 安全的用户密码。 当您提供密码时,该命令将运行。
安装最新的 Node.JS
请注意,在撰写本文时,v0.10.24 是 Node 的最新版本。 如果有更新的版本,请改用该版本号。
键入以下命令,一次一行,并在您的 droplet 下载、编译和安装 Node.js 时观察魔术:
sudo apt-get install build-essential sudo apt-get install curl openssl libssl-dev git clone https://github.com/joyent/node.git cd node git checkout v0.10.24 ./configure make sudo make install
当您键入 sudo make 时,会发生很多事情。 耐心点。
当 make install 过程结束时,输入以下命令确保一切顺利:
node -v
如果一切顺利,您应该会看到:v0.10.24.
授予安全用户使用端口 80 的权限
请记住,我们不想以 root 用户身份运行您的应用程序,但有一个问题:您的安全用户没有使用默认 HTTP 端口 (80) 的权限。 您的目标是能够通过导航到易于使用的 URL(如 http://mysite.com)来发布访问者可以使用的网站。
不幸的是,除非您以 root 身份登录,否则您通常必须使用 http://mysite.com:3000 之类的 URL - 注意端口号。
很多人被困在这里,但解决方案很简单。 有几个选择,但这是我喜欢的一个。 键入以下命令:
sudo apt-get install libcap2-bin sudo setcap cap_net_bind_service=+ep /usr/local/bin/node
现在,当您告诉 Node 应用程序您希望它在端口 80 上运行时,它不会抱怨。
使用 NPM 安装一个名为 PM2 的包。
NPM 是一个包管理器,您将使用它来安装框架和库以与您的 Node.js 应用程序一起使用。 NPM 与 Node.js 一起安装。 PM2 是一个可爱的小工具,它将为您解决两个问题:
- 如果应用程序崩溃,它将通过重新启动应用程序来保持您的站点正常运行。 这些崩溃不应该发生,但很高兴知道 PM2 支持您。 (有些人可能知道 Forever.js,另一个用于保持基于节点的站点运行的工具——我想你会发现 PM2 有很多东西可以提供。)
- 每次重新启动服务器时,它都会通过将节点应用程序作为服务重新启动来帮助您。 一些用户知道其他方法可以做到这一点,但是 pm2 使它更容易,并且它具有一些额外的灵活性.
通过在命令行输入以下命令来安装 PM2:
sudo npm install pm2 -g
创建一个简单的节点应用程序
在这里您可以测试您的环境,以确保一切正常。 在本例中,我将使用 IP 地址,但您的目标应该是使用域名。 稍后查看这些说明:如何使用 DigitalOcean 设置主机名
首先,创建一个仅用于测试的简单节点应用程序。 在命令行类型:
nano app.js
然后在 nano 编辑器中输入以下代码行:
var http = require('http'); var server = http.createServer(function (request, response) { response.writeHead(200, {"Content-Type": "text/plain"}); response.end("Hello World\n"); }); server.listen(80); console.log("Server running at http://127.0.0.1:80/");
按 ctrl-X 退出 - 当 nano 询问您是否要保存时,回答是。
现在您有一个名为 app.js 的基于节点的应用程序,您可以使用它来测试您的环境。
您可以通过键入以下命令在命令行运行 app.js:node app.js
这样做,您应该能够通过使用浏览器并输入您的 IP 地址作为 URL 来查看您的 hello world 文本。 您可以通过按 crtl-C 来中断执行。 这不是我们想要运行我们的应用程序的方式。 有一个更好的方法。 我们将使用 PM2 来运行它,而不是直接使用 Node。
使用 PM2 运行您的应用程序,并确保您的 node.js 应用程序在您的服务器重新启动时自动启动
如果您使用 pm2 运行您的应用程序,您将获得一些巨大的好处。 不要像上面那样运行您的应用程序,而是使用以下命令运行它:pm2 start app.js
你应该看到这个报告:
以这种方式运行您的应用程序有什么好处?
- 如果 PM2 崩溃,它将自动重新启动您的应用程序。
- PM2 将记录您未处理的异常 - 在这种情况下,在 /home/safeuser/.pm2/logs/app-err.log 的文件中。
- 通过一个命令,PM2 可以确保它管理的任何应用程序在服务器重新启动时重新启动。 基本上,您的节点应用程序将作为服务启动。
通过键入以下命令运行此命令以将您的应用程序作为服务运行:
sudo env PATH=$PATH:/usr/local/bin pm2 startup -u safeuser
请注意,您可能没有使用 safeuser 作为用户名 - 请使用与您的设置相对应的名称。 您应该看到以下报告:
Adding system startup for /etc/init.d/pm2-init.sh ... /etc/rc0.d/K20pm2-init.sh -> ../init.d/pm2-init.sh /etc/rc1.d/K20pm2-init.sh -> ../init.d/pm2-init.sh /etc/rc6.d/K20pm2-init.sh -> ../init.d/pm2-init.sh /etc/rc2.d/S20pm2-init.sh -> ../init.d/pm2-init.sh /etc/rc3.d/S20pm2-init.sh -> ../init.d/pm2-init.sh /etc/rc4.d/S20pm2-init.sh -> ../init.d/pm2-init.sh /etc/rc5.d/S20pm2-init.sh -> ../init.d/pm2-init.sh
现在我们的既定目标已经实现!
- 您没有以 root 身份运行; 因此,您的应用程序更安全。
- 您正在使用端口 80,通常只能由 root 用户使用。
- 如果您的应用程序崩溃,它将重新启动,并且它将记录未处理的异常。
- 当服务器启动时,您的应用程序将重新启动。
玩得开心! 这是一个相当强大的设置。
- 经过深思熟虑:** 您可能会注意到 safeuser 目录中有一个名为 node 的文件夹。 它在安装过程中使用过,但您不再需要它。 您可以通过键入以下内容将其删除:
rm -rf /home/safuser/node
关于 node 的知识还有很多,但是本教程会让你走上正确的道路。 要了解有关 pm2 的更多信息,请访问 pm2 存储库
重要说明:有一个启动脚本可以启动您的 Node 应用程序,但是如果您了解它的工作原理,您将避免很多混乱。 该脚本称为“pm2-init.sh”。 它位于“etc/init.d/”目录中,但不会启动 app.js。 相反,它会启动上次服务器关闭时在 PM2 下运行的程序。
这个很重要。 如果当您键入 pm2 list, 时您的节点应用程序未显示在列表中,那么当服务器重新启动时您的应用程序将不会重新启动。 按照正确的说明使用 pm2 启动您的应用程序,以确保它们将重新启动:pm2 start app.js
吉姆·卡西迪