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

Node.js的是易于构建服务器端和网络应用程序的开源JavaScript运行环境。该平台在Linux,OS X,FreeBSD和Windows上运行,其应用程序用JavaScript编写的。 Node.js的应用程序可以在命令行中运行,但我们会...

介绍

Node.js是一个开源的Javascript运行时环境,用于轻松构建服务器端和网络应用程序。该平台在Linux,OS X,FreeBSD和Windows上运行,其应用程序使用JavaScript编写。 Node.js应用程序可以在命令行运行,但我们将教你如何作为服务运行他们,所以他们将在重新启动或故障时自动重新启动,以便您可以在生产环境中使用它们。 在本教程中,我们将介绍如何设置一个由两个Ubuntu 14.04服务器组成的生产就绪的Node.js环境;一个服务器将运行由PM2管理的Node.js应用程序,而另一个服务器将通过Nginx逆向代理向应用程序服务器提供用户对应用程序的访问。 本教程的CentOS的版本可以找到这里

先决条件

本指南使用与专用网络 2的Ubuntu 14.04服务器(在同一数据中心)。我们将通过以下名称提及它们:
  • 应用 :在这里我们将安装Node.js的运行时服务器,您的Node.js应用程序,PM2
  • 网址 :我们将安装Nginx的网络服务器,这将作为一个反向代理到应用程序服务器。用户将访问此服务器的公共IP地址以访问您的Node.js应用程序。
在本教程中可以使用单个服务器,但您必须在整个过程中进行一些更改。 只需使用本地主机IP地址,即127.0.0.1 ,无论使用应用程序服务器的私有IP地址。 这里是一个图表,你的设置将遵循本教程后: 反向代理到Node.js应用程序 在开始本指南之前,你应该有一个正规,非root用户sudo两个服务器的配置权限-这是你应登录到服务器的用户。 你可以学习如何按照1-4我们的步骤来配置一个普通用户帐户初始服务器设置指南的Ubuntu 14.04 。 如果你希望能够通过域名来访问,而不是它的公网IP地址,你的Web服务器,然后购买一个域名遵循这些教程: 让我们从应用服务器上安装的Node.js运行时启动。

安装Node.js

我们将安装Node.js的最新LTS版, 应用程序服务器上。 在应用服务器,让我们更新使用此命令apt-get的软件包列表:
sudo apt-get update
然后用apt-get安装git包, npm取决于:
sudo apt-get install git
转至Node.js的下载页面 ,找到Linux程序(.tar.xz)下载链接。 右键单击它,并将其链接地址复制到剪贴板。 在写这篇文章的时候,最新的LTS版本是4.2.3。 如果你喜欢安装的Node.js的最新的稳定版本,进入相应的页面 ,并复制该链接。 切换到你的主目录,并下载Node.js的源wget 。粘贴下载链接以替代突出显示的部分:
cd ~
wget https://nodejs.org/dist/v4.2.3/node-v4.2.3-linux-x64.tar.gz
现在提取tar归档您刚刚下载到node这些命令目录:
mkdir node
tar xvf node-v*.tar.?z --strip-components=1 -C ./node
如果您想删除已下载的存档的Node.js,因为我们不再需要它,切换到你的主目录,并使用此rm命令:
cd ~
rm -rf node-v*
接下来,我们将配置全局prefixnpm ,在npm将创建符号链接,安装节点程序包,到地方,它在你的默认路径。 我们将其设定为/usr/local用这个命令:
mkdir node/etc
echo 'prefix=/usr/local' > node/etc/npmrc
现在,我们已经准备好了移动nodenpm二进制文件到我们的安装位置。 我们将其移动到/opt/node用这个命令:
sudo mv node /opt/
在这一点上,你可能想使root文件的所有者:
sudo chown -R root: /opt/node
最后,让我们创建符号链接nodenpm在默认路径的二进制文件。 我们会把中的链接/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 -v
Node.js运行时现在已安装,并准备运行应用程序!让我们编写一个Node.js应用程序。

创建Node.js应用程序

现在,我们将创建一个Hello World应用程序,它只是返回的“Hello World”的任何HTTP请求。这是一个示例应用程序,将帮助您获取您的Node.js设置,您可以用您自己的应用程序替换它 - 只是确保您修改您的应用程序以侦听适当的IP地址和端口。 因为我们希望我们的Node.js应用服务是来自于我们的反向代理服务器,Web请求,我们将利用服务器间通信的我们的应用程序服务器的专用网络接口。 查一查你的应用服务器的私网地址。 如果您使用的是DigitalOceanDroplet为您的服务器,您可以通过元数据服务查找服务器的私有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应用程序服务器上的命令:
node hello.js
注:以这种方式运行的Node.js应用程序会阻止其他命令,直到应用程序被打死按CTRL+C 。 为了测试应用程序,打开另一个终端会话,并连接到Web服务器。 由于Web服务器是同一个专用网络上,它应该能够达到使用的应用程序服务器的私有IP地址curl 。 一定要在应用程序服务器的专用IP地址替代APP_PRIVATE_IP_ADDRESS ,如果你改变了它的端口:
curl http://APP_PRIVATE_IP_ADDRESS:8080
如果看到以下输出,应用程序正常工作并侦听正确的IP地址和端口:
Hello World
如果没有看到正确的输出,请确保您的Node.js应用程序正在运行,并配置为监听正确的IP地址和端口。 在应用服务器,一定要杀死应用程序(如果您还没有),按CTRL+C

安装PM2

现在我们将安装PM2,它是Node.js应用程序的进程管理器。 PM2提供了一种简单的方法来管理和守护应用程序(作为服务运行它们)。 我们将使用节点打包模块(NPM),它基本上是对节点模块的软件包管理与Node.js的安装,到我们的应用程序服务器上安装PM2。使用此命令安装PM2:
sudo npm install pm2 -g

使用PM2管理应用程序

PM2简单易用。我们将介绍PM2的几个基本用途。

启动应用程序

你会想要做的第一件事就是使用pm2 start命令来运行你的应用程序, hello.js ,在后台:
pm2 start hello.js
这也将您的应用程序添加到PM2的进程列表,这是每次启动应用程序时输出的:
┌──────────┬────┬──────┬──────┬────────┬───────────┬────────┬────────────┬──────────┐
│ App name │ id │ mode │ PID  │ status │ restarted │ uptime │     memory │ watching │
├──────────┼────┼──────┼──────┼────────┼───────────┼────────┼────────────┼──────────┤
│ hello    │ 0  │ fork │ 5871 │ online │         0 │ 0s     │ 9.012 MB   │ disabled │
└──────────┴────┴──────┴──────┴────────┴───────────┴────────┴────────────┴──────────┘
正如你所看到的,PM2自动分配一个应用程序名称 (基于文件名,没有.js扩展名)和PM2 ID。 PM2还维护的其它信息,如进程的PID,其当前状态,和存储器使用率。 在PM2下运行的应用程序将在应用程序崩溃或被终止时自动重新启动,但需要执行额外的步骤才能在系统启动(启动或重新引导)时启动应用程序。幸运的是,PM2提供了一种简单的方法来做到这一点, startup子命令。 该startup子产生并配置启动脚本启动PM2和管理流程上的服务器引导。 你还必须指定要运行的平台,这是ubuntu ,在我们的例子:
pm2 startup ubuntu
结果输出的最后一行将包含必须运行的命令(必须以超级用户权限运行):
[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的应用程序App nameid ):
pm2 stop example
重新启动使用此命令(指定PM2的应用程序App nameid ):
pm2 restart example
目前由PM2管理的应用程序列表也可以抬头与list子命令:
pm2 list
有关特定应用程序的更多信息,可以通过使用发现info子(指定PM2 应用程序名称ID)::
pm2 info example
该PM2进程监视器可以与拉升monit子命令。这将显示应用程序状态,CPU和内存使用情况:
pm2 monit
现在你的Node.js应用程序正在运行,并由PM2管理,让我们设置反向代理。

设置反向代理服务器

现在您的应用程序正在运行,并且正在侦听私有IP地址,您需要为用户设置一种方式来访问它。我们将为此设置一个Nginx Web服务器作为反向代理。本教程将从头开始设置一个Nginx服务器。如果你已经有一个Nginx的服务器设置,您可以将刚才复制location块到您选择的服务器模块(确保位置不与任何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地址,如果你没有一个域设立这样做),并为应用程序服务器的私有IP地址APP_PRIVATE_IP_ADDRESS 。 此外,更改端口( 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 ,访问http://example.com/通过Web浏览器将请求发送到端口上的应用程序服务器的私有IP地址8080 ,将由Node.js的接收和回复应用。 您可以添加其他location的块到同一服务器模块能提供访问其他应用程序相同的Web服务器上。 例如,如果您还运行在端口应用服务器上的其他应用程序的Node.js 8081 ,您可以通过添加此位置区块允许访问它http://example.com/app2
Nginx配置 - 其他位置
    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开发! 另外,如果你正在寻找加密您的Web服务器和用户之间的传输, 这里是一个教程,这将有助于你得到HTTPS(TLS / SSL)支持设立