如何建立一个Node.js的应用生产在Ubuntu 14.04

如何建立一个Node.js的应用生产在Ubuntu 14.04

介绍

Node.js是一个开源的Javascript运行时环境,可以轻松构建服务器端和网络应用程序。该平台运行在Linux,OS X,FreeBSD和Windows上,其应用程序是用JavaScript编写的。Node.js应用程序可以在命令行上运行,但是我们将教你如何将它们作为一个服务来运行,所以它们会在重新启动或失败时自动重启,所以你可以在生产环境中使用它们。

在本教程中,我们将介绍如何设置由两个Ubuntu 14.04服务器组成的生产就绪Node.js环境;一个服务器将运行由PM2管理的Node.js应用程序,另一个将通过Nginx逆向代理向应用程序服务器提供用户访问应用程序的权限。

本教程的CentOS版本可以在这里找到。

必备条件

本指南使用两台带有专用网络的Ubuntu 14.04服务器(在同一个数据中心内)。 我们将以下列名称来提及它们:

  • app: 我们将安装Node.js运行时的服务器,Node.js应用程序和PM2
  • web: 我们将安装Nginx Web服务器的服务器,它将充当您的应用程序的反向代理。 用户将访问此服务器的公共IP地址,以获得您的Node.js应用程序。

在本教程中可以使用单个服务器,但是您必须在此过程中进行一些更改。只要使用本地主机IP地址,即127.0.0.1,无论使用应用服务器的私有IP地址。

以下是本教程后的设置示意图:

在开始本指南之前,您应该有一个在两台服务器上都配置了sudo权限的普通非root用户 - 这是您应该以您的身份登录到服务器的用户。您可以按照我们针对Ubuntu 14.04的初始服务器设置指南中的步骤1-4来了解如何配置常规用户帐户。

如果您希望能够通过域名(而不是公共IP地址)访问您的Web服务器,请购买域名,然后按照以下教程进行操作:

让我们开始在应用程序服务器上安装Node.js运行时。

安装Node.js

我们将在应用服务器上安装最新的LTS版本的Node.js。在应用程序服务器上,让我们使用以下命令更新apt-get软件包列表:

$ sudo apt-get update

然后使用apt-get来安装npm依赖于的git包:

$ sudo apt-get install git

转到Node.js下载页面,找到Linux Binaries(.tar.xz)下载链接。用鼠标右键单击它,并将其链接地址复制到剪贴板。在写这篇文章的时候,最新的LTS版本是4.2.3。如果您希望安装最新的稳定版本的Node.js,请转到相应的页面并复制该链接。

切换到您的主目录并使用wget下载Node.js源代码。粘贴下载链接来代替突出显示的部分:

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

现在使用以下命令将刚刚下载的tar归档文件解压缩到节点目录中:

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

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

$ cd ~
$ rm -rf node-v*

接下来,我们将配置npm的全局前缀,其中npm将创建到已安装的Node包的符号链接,并将其指向默认路径中的某个位置。我们将使用以下命令将其设置为/ usr / local:

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

我们将使用以下命令将其设置为/usr/local:

$ sudo mv node /opt/

在这一点上,你可能想要根文件的所有者:

$ sudo chown -R root: /opt/node

最后,让我们在默认路径中创建节点和npm二进制文件的符号链接。 我们将这些命令放在/ usr / local / bin中:

$ sudo ln -s /opt/node/bin/node /usr/local/bin/node
$ sudo ln -s /opt/node/bin/npm /usr/local/bin/npm

使用以下命令检查Node的安装版本:

$ node -v

现在已经安装了Node.js运行时,并准备运行一个应用程序! 我们来编写一个Node.js应用程序。

Create Node.js Application

现在我们将创建一个Hello World应用程序,该应用程序简单地向任何HTTP请求返回“Hello World”。 这是一个示例应用程序,它可以帮助您设置Node.js,您可以用自己的应用程序替换它 - 只要确保修改应用程序以侦听相应的IP地址和端口即可。

因为我们希望我们的Node.js应用程序能够处理来自我们的反向代理服务器,web的请求,我们将利用我们的应用程序服务器的专用网络接口进行服务器间通信。 查找您的应用程序服务器的专用网络地址。

如果您使用DigitalOcean液滴作为服务器,则可以通过元数据服务查找服务器的私有IP地址。 在应用程序服务器上,使用curl命令现在检索IP地址:

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

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

Hello World代码

接下来,创建并打开您的Node.js应用程序进行编辑。 在本教程中,我们将使用vi编辑一个名为hello.js的示例应用程序:

$ cd ~
$ vi hello.js

将以下代码插入到文件中,并确保将应用程序服务器的私有IP地址替换为突出显示的APP_PRIVATE_IP_ADDRESS项目。 如果需要,还可以在两个位置替换突出显示的端口8080(确保使用非管理端口,即1024或更大):

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

现在保存并退出。

这个Node.js应用程序仅监听指定的IP地址和端口,并返回“Hello World”,其中包含一个200 HTTP成功代码。 这意味着应用程序只能从同一个专用网络上的服务器(如我们的Web服务器)访问。

##测试应用程序(可选)

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

$ node hello.js

注意:以这种方式运行Node.js应用程序会阻止其他命令,直到通过按CTRL + C终止应用程序。

为了测试应用程序,打开另一个终端会话并连接到您的Web服务器。 由于Web服务器位于同一个专用网络上,因此应该能够使用curl来访问应用服务器的私有IP地址。 请务必在应用程序服务器的专用IP地址中替换APP_PRIVATE_IP_ADDRESS,如果您更改了端口,请将其替换为:

$ curl http://APP_PRIVATE_IP_ADDRESS:8080

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

Output:
Hello World

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

在应用程序服务器上,确保通过按CTRL + C来终止应用程序(如果还没有的话)。

安装PM2

现在我们将安装PM2,它是Node.js应用程序的进程管理器。 PM2提供了一种简单的方式来管理和守护应用程序(将它们作为服务运行)。

我们将使用Node Packaged Modules(NPM),它基本上是Node.js安装的Node模块的包管理器,用于在我们的应用服务器上安装PM2。 使用此命令安装PM2:

$ sudo npm install pm2 -g

使用PM2管理应用程序

PM2简单易用。 我们将介绍PM2的一些基本用途。

开始申请

你要做的第一件事是使用pm2 start命令在后台运行你的应用程序hello.js:

$ pm2 start hello.js

这也将您的应用程序添加到每次启动应用程序时输出的PM2进程列表中:

Output:
┌──────────┬────┬──────┬──────┬────────┬───────────┬────────┬────────────┬──────────┐
│ App name │ id │ mode │ PID  │ status │ restarted │ uptime │     memory │ watching │
├──────────┼────┼──────┼──────┼────────┼───────────┼────────┼────────────┼──────────┤
│ hello    │ 0  │ fork │ 5871 │ online │         0 │ 0s     │ 9.012 MB   │ disabled │
└──────────┴────┴──────┴──────┴────────┴───────────┴────────┴────────────┴──────────┘

正如你所看到的,PM2会自动分配一个App名称(基于文件名,不带.js扩展名)和一个PM2 ID。 PM2还维护其他信息,例如进程的PID,当前状态和内存使用情况。

在PM2下运行的应用程序将在应用程序崩溃或被终止的情况下自动重新启动,但需要额外执行一个步骤才能在系统启动(启动或重启)时启动应用程序。 幸运的是,PM2提供了一个简单的方法来完成这个启动子命令。

startup子命令将生成并配置启动脚本,以在服务器启动时启动PM2及其管理的进程。 在我们的例子中,您还必须指定您正在运行的平台,即ubuntu:

$ pm2 startup ubuntu

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

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

运行生成的命令(与上面突出显示的输出类似),将PM2设置为在启动时启动(使用您自己的输出中的命令):

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

###其他PM2使用(可选)

PM2提供了许多子命令,允许您管理或查找关于您的应用程序的信息。 请注意,在没有任何参数的情况下运行pm2会显示一个帮助页面,其中包括示例用法,其中涵盖了PM2的使用情况,比本教程的这一节更详细。

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

$ pm2 stop example

使用此命令重新启动应用程序(指定PM2应用程序名称或ID):

$ pm2 restart example

也可以使用list子命令查找当前由PM2管理的应用程序的列表:

$ pm2 list

有关特定应用程序的更多信息可以使用info子命令找到(指定PM2应用程序名称或ID):

$ pm2 info example

可以使用monit子命令提升PM2进程监视器。 这将显示应用程序状态,CPU和内存使用情况:

$ pm2 monit

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

设置反向代理服务器

现在,您的应用程序正在运行,并侦听私有IP地址,您需要为您的用户设置一个访问它的方法。 为此,我们将设置一个Nginx Web服务器作为反向代理。 本教程将从头开始设置一个Nginx服务器。 如果您已经有Nginx服务器设置,您可以将位置块复制到您选择的服务器块中(确保该位置与您的任何Web服务器的现有内容不冲突)。

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

$ sudo apt-get update

然后使用apt-get安装Nginx:

$ sudo apt-get install nginx

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

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

删除文件中的所有内容并插入以下配置。 请确保将您自己的域名替换为server_name指令(如果没有设置域,则为IP地址),以及APP_PRIVATE_IP_ADDRESS的应用程序服务器私有IP地址。 此外,如果您的应用程序设置为侦听不同的端口,请更改端口(8080):

									/etc/nginx/sites-available/default
server {
    listen 80;

    server_name example.com;

    location / {
        proxy_pass http://APP_PRIVATE_IP_ADDRESS:8080;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
}

这将Web服务器配置为响应其根目录中的请求。 假设我们的服务器在example.com可用,通过Web浏览器访问http://example.com/会将请求发送到端口8080上的应用程序服务器的私有IP地址,这将由Node.js接收和回复 应用。

您可以将附加的位置块添加到同一个服务器块,以提供对同一Web服务器上的其他应用程序的访问。 例如,如果您还在端口8081上的应用程序服务器上运行另一个Node.js应用程序,则可以添加此位置块以允许通过http://example.com/app2访问它:

									Nginx Configuration — Additional Locations
    location /app2 {
        proxy_pass http://APP_PRIVATE_IP_ADDRESS:8081;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }

完成添加应用程序的位置块后,保存并退出。

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

$ sudo service nginx restart

假设您的Node.js应用程序正在运行,并且您的应用程序和Nginx配置是正确的,您应该能够通过Web服务器的反向代理来访问您的应用程序。 通过访问您的Web服务器的URL(其公共IP地址或域名)来试用它。

结论

恭喜! 现在,您的Node.js应用程序运行在Ubuntu 14.04服务器上的Nginx反向代理之后。 此反向代理设置足够灵活,可让您的用户访问您要共享的其他应用程序或静态Web内容。 祝你的Node.js开发成功!

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

原文链接:https://www.digitalocean.com/community/tutorials/how-to-set-up-a-node-js-application-for-production-on-ubuntu-14-04

原文作者:Mitchell Anicas

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

扫码关注云+社区