如何在 Ubuntu 14.04 上设置用于生产的 Node.js 应用程序

介绍

Node.js 是一个开源的 JavaScript 运行环境,可轻松构建服务器侧和网络应用程序. 该平台运行在 Linux、OS X、FreeBSD 和 Windows 上,其应用程序是用 JavaScript 编写的。

在本教程中,我们将涵盖构建一个生产准备的Node.js环境,该环境由两个Ubuntu 14.04服务器组成;一个服务器将运行由PM2管理的Node.js应用程序,而另一个服务器将通过Nginx反向代理向应用程序服务器提供用户访问该应用程序。

本教程的 CentOS 版本可在此(https://andsky.com/tech/tutorials/how-to-set-up-a-node-js-application-for-production-on-centos-7)找到。

前提条件

本指南使用两个Ubuntu 14.04服务器 具有私人网络(在同一个数据中心)。

  • app:我们将安装 Node.js 运行时的服务器,您的 Node.js 应用程序和 PM2
  • web:我们将安装 Nginx Web 服务器的服务器,该服务器将作为您的应用程序的反向代理。

您可以为本教程使用单个服务器,但您必须在途中进行一些更改. 只需使用 localhost IP 地址,即 127.0.0.1,无论使用 app 服务器的私人 IP 地址。

以下是您在遵循本教程后设置的图表:

Reverse Proxy to Node.js Application

在您开始本指南之前,您应该有一个正常的非根用户,在您的两个服务器上都配置了sudo权限 - 这是您应该登录您的服务器的用户。

如果您想通过域名访问您的 web服务器,而不是其公共IP地址,请购买域名,然后按照以下教程:

让我们通过在 app服务器上安装 Node.js 运行时间来开始。

安装 Node.js

我们将在 app服务器上安装最新版本的 Node.js LTS。

app服务器上,让我们用这个命令更新 apt-get 包列表:

1sudo apt-get update

然后使用apt-get来安装git包,其中npm取决于:

1sudo apt-get install git

转到 Node.js 下载页面并找到 **Linux Binaries (.tar.xz)**下载链接. 右键单击它,并将其链接地址复制到您的剪辑板上。 在此写作时,最新的LTS版本是 4.2.3. 如果您更喜欢安装Node.js的最新稳定版本,请前往 适当的页面并复制该链接。

转到您的主目录并下载 Node.js 源代码wget。贴上下载链接代替突出的部分:

1cd ~
2wget https://nodejs.org/dist/v4.2.3/node-v4.2.3-linux-x64.tar.gz

现在用这些命令将您刚刚下载的 tar 档案提取到节点目录中:

1mkdir node
2tar xvf node-v*.tar.?z --strip-components=1 -C ./node

如果您想删除您下载的 Node.js 档案,因为我们不再需要它,请转到您的主目录并使用以下rm命令:

1cd ~
2rm -rf node-v*

接下来,我们将配置npm的全球前缀,其中npm将创建对已安装的 Node 包的象征链接,到它在默认路径中的某个地方。

1mkdir node/etc
2echo 'prefix=/usr/local' > node/etc/npmrc

现在我们已经准备好将节点npm二进制移动到我们的安装位置,我们会用这个命令将其移动到/opt/node:

1sudo mv node /opt/

在此时刻,您可能想要使文件的所有者:

1sudo chown -R root: /opt/node

最后,让我们在默认路径中创建节点npm二进制的象征链接,我们将链接放在/usr/local/bin中,使用这些命令:

1sudo ln -s /opt/node/bin/node /usr/local/bin/node
2sudo ln -s /opt/node/bin/npm /usr/local/bin/npm

要验证 Node 是否已安装,请使用此命令检查其版本:

1node -v

Node.js 运行时间已安装,并准备运行应用程序!让我们写一个 Node.js 应用程序。

创建 Node.js 应用

现在我们将创建一个 Hello World 应用程序,它只会返回任何 HTTP 请求的Hello World。这是一种样本应用程序,可以帮助您设置 Node.js,您可以用自己的应用程序代替它,只需确保您修改您的应用程序以倾听适当的 IP 地址和端口。

由于我们希望我们的 Node.js 应用程序能够服务于来自我们的反向代理服务器 web的请求,我们将利用我们的 app服务器的私人网络接口进行服务器间的通信。

如果您正在使用 DigitalOcean 滴滴作为您的服务器,您可以通过 Metadata 服务搜索服务器的私人 IP 地址。

1curl -w "\n" http://169.254.169.254/metadata/v1/interfaces/private/0/ipv4/address

您将希望复制输出(私人IP地址),因为它将用于配置我们的Node.js应用程序。

世界代码

接下来,创建并打开您的 Node.js 应用程序进行编辑. 对于本教程,我们将使用vi来编辑名为hello.js的样本应用程序:

1cd ~
2vi hello.js

将下列代码插入文件中,并确保将 app服务器的私有 IP 地址替换为两个突出标注的APP_PRIVATE_IP_ADDRESS项目,如果您想要,您也可以在两个位置更换突出标注的端口,即8080 (请确保使用非管理员端口,即1024或更大):

1[label hello.js]
2var http = require('http');
3http.createServer(function (req, res) {
4  res.writeHead(200, {'Content-Type': 'text/plain'});
5  res.end('Hello World\n');
6}).listen(8080, 'APP_PRIVATE_IP_ADDRESS');
7console.log('Server running at http://APP_PRIVATE_IP_ADDRESS:8080/');

现在保存和退出。

这个 Node.js 应用程序只是在指定的 IP 地址和端口上收听,并以 200 HTTP 成功代码返回Hello World,这意味着该应用程序只能从同一私人网络上的服务器访问,例如我们的 web 服务器。

测试应用程序(可选)

如果您想测试您的应用程序是否工作,请在 app服务器上运行此节点命令:

1node hello.js

** 注意:** 以这种方式运行 Node.js 应用程序将阻止额外的命令,直到应用程序通过按CTRL+C来杀死。

为了测试应用程序,请打开另一个终端会话并连接到您的 web服务器. 由于 Web 服务器位于相同的私人网络上,它应该能够使用curl访问 app服务器的私人 IP 地址。

1curl http://APP_PRIVATE_IP_ADDRESS:8080

如果您看到以下输出,应用程序正在正常工作,并在正确的 IP 地址和端口上收听:

1[secondary_label Output:]
2Hello World

如果您看不到正确的输出,请确保您的 Node.js 应用程序正在运行,并配置为听取正确的 IP 地址和端口。

app服务器上,请确保通过按CTRL+C来杀死应用程序(如果您还没有)。

安装 PM2

现在我们将安装 PM2,这是一种 Node.js 应用程序的流程管理器。

我们将使用 Node Packaged Modules (NPM),这基本上是与 Node.js 一起安装的 Node 模块的包管理器,在我们的 app 服务器上安装 PM2。

1sudo npm install pm2 -g

使用PM2管理应用程序

PM2 简单易用,我们将涵盖 PM2 的几个基本用途。

启动应用

您要做的第一件事是使用pm2 start命令在背景中运行您的应用程序hello.js:

1pm2 start hello.js

这还会将您的应用程序添加到 PM2 的流程列表中,该列表每次启动应用程序时都会输出:

1[secondary_label Output:]
2┌──────────┬────┬──────┬──────┬────────┬───────────┬────────┬────────────┬──────────┐
3│ App name │ id │ mode │ PID  │ status │ restarted │ uptime │     memory │ watching │
4├──────────┼────┼──────┼──────┼────────┼───────────┼────────┼────────────┼──────────┤
5│ hello    │ 0  │ fork │ 5871 │ online │         0 │ 0s     │ 9.012 MB   │ disabled │
6└──────────┴────┴──────┴──────┴────────┴───────────┴────────┴────────────┴──────────┘

正如您所看到的,PM2 会自动分配一个 App name(基于文件名,不含 .js 扩展)和一个 PM2 id

如果应用程序故障或死亡,在PM2下运行的应用程序将自动重新启动,但需要采取额外的步骤来让应用程序在系统启动(启动或重新启动)上启动。

启动子命令生成并配置一个启动脚本,以便在服务器机器人上启动PM2及其管理流程。

1pm2 startup ubuntu

结果输出的最后一行将包含一个命令(必须使用超级用户权限运行):

1[secondary_label Output:]
2[PM2] You have to run this command as root
3[PM2] Execute the following command :
4[PM2] sudo su -c "env PATH=$PATH:/opt/node/bin pm2 startup ubuntu -u sammy --hp /home/sammy"

运行生成的命令(类似于上面的突出输出),以设置PM2开始启动(使用来自自己的输出的命令):

1sudo su -c "env PATH=$PATH:/opt/node/bin pm2 startup ubuntu -u sammy --hp /home/sammy"

其他 PM2 用途(可选)

PM2提供了许多子命令,允许您管理或搜索有关您的应用程序的信息。 请注意,运行pm2没有任何论点会显示一个帮助页面,包括示例使用,该页面比本教程的本节更详细地涵盖了PM2的使用。

使用此命令停止应用程序(指定PM2应用程序名称id):

1pm2 stop example

使用此命令重新啟動應用程式(指定 PM2「應用程式名稱」或「id」):

1pm2 restart example

目前由 PM2 管理的应用程序列表也可以通过列表子命令查看:

1pm2 list

有关特定应用程序的更多信息可以通过使用info子命令找到(指定 PM2 App nameid):

1pm2 info example

PM2 流程监视器可以通过monit子命令拉上,显示应用程序状态、CPU 和内存使用量:

1pm2 monit

现在您的 Node.js 应用程序正在运行,并由 PM2 管理,让我们设置反向代理。

设置反向代理服务器

现在你的应用程序正在运行,并在私人IP地址上倾听,你需要为你的用户设置一种访问方式. 我们将为此设置一个Nginx网络服务器作为反向代理程序。本教程将从头开始设置一个Nginx服务器。如果你已经有了一个Nginx服务器设置,你可以简单地将位置块复制到你选择的服务器块(确保位置不会与你的Web服务器的任何现有内容相冲突)。

web 服务器上,让我们用以下命令更新 apt-get 包列表:

1sudo apt-get update

然后使用 apt-get 安装 Nginx:

1sudo apt-get install nginx

现在打开默认服务器封锁配置文件进行编辑:

1sudo vi /etc/nginx/sites-available/default

删除文件中的所有内容并插入以下配置: 请确保替换您自己的域名为server_name指令(或如果您没有域设置的IP地址),以及服务器私人IP地址为APP_PRIVATE_IP_ADDRESS

 1[label /etc/nginx/sites-available/default]
 2server {
 3    listen 80;
 4
 5    server_name example.com;
 6
 7    location / {
 8        proxy_pass http://APP_PRIVATE_IP_ADDRESS:8080;
 9        proxy_http_version 1.1;
10        proxy_set_header Upgrade $http_upgrade;
11        proxy_set_header Connection 'upgrade';
12        proxy_set_header Host $host;
13        proxy_cache_bypass $http_upgrade;
14    }
15}

假设我们的服务器在example.com提供,通过网页浏览器访问http://example.com/将请求发送到应用程序服务器在端口80上的私人IP地址,该请求将被接收并由Node.js应用程序响应。

您可以向相同的服务器块添加额外的位置块,以便在相同的 web服务器上提供访问其他应用程序,例如,如果您在端口 8081'上的 **app**服务器上运行了另一个 Node.js 应用程序,您可以添加这个位置块,以便通过 http://example.com/app2` 访问它:

1[label Nginx Configuration — Additional Locations]
2    location /app2 {
3        proxy_pass http://APP_PRIVATE_IP_ADDRESS:8081;
4        proxy_http_version 1.1;
5        proxy_set_header Upgrade $http_upgrade;
6        proxy_set_header Connection 'upgrade';
7        proxy_set_header Host $host;
8        proxy_cache_bypass $http_upgrade;
9    }

一旦您完成为您的应用程序添加位置块,保存和退出。

在 Web 服务器上,重新启动 Nginx:

1sudo service nginx restart

假设您的 Node.js 应用程序正在运行,您的应用程序和 Nginx 配置是正确的,您应该能够通过 web 服务器的反向代理程序访问您的应用程序。

结论

恭喜您! 您现在有 Node.js 应用程序在 Ubuntu 14.04 服务器上运行 Nginx 反向代理程序后面。 此反向代理程序设置足够灵活,可为用户提供您想要共享的其他应用程序或静态 Web 内容的访问。

此外,如果您正在寻求加密您的网页服务器和用户之间的传输, 这里是一个教程,可以帮助您设置HTTPS(TLS/SSL)支持

Published At
Categories with 技术
comments powered by Disqus