欢迎光临
我们一直在努力

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

介绍

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

先决条件

本指南使用两个CentOS 7服务器与专用网络 (在同一数据中心)。我们将通过以下名称提及它们:

  • 应用 :在这里我们将安装Node.js的运行时服务器,您的Node.js应用程序,PM2
  • 网址 :我们将安装Nginx的网络服务器,这将作为一个反向代理到应用程序服务器。用户将访问此服务器的公共IP地址以访问您的Node.js应用程序。

在本教程中可以使用单个服务器,但您必须在整个过程中进行一些更改。 只需使用本地主机IP地址,即127.0.0.1 ,无论使用应用程序服务器的私有IP地址。这里是一个图表,你的设置将遵循本教程后:反向代理到Node.js应用程序在开始本指南之前,你应该有一个正规,非root用户sudo两个您的配置权限的服务器,这是你应登录到服务器的用户。 你可以学习如何按照我们的配置普通用户帐户为CentOS 7初始服务器设置指南 。如果你希望能够通过域名来访问,而不是它的公网IP地址,你的Web服务器,然后购买一个域名遵循这些教程:

让我们从应用服务器上安装的Node.js运行时启动。

安装Node.js

我们将安装Node.js的最新LTS版, 应用程序服务器上。在应用服务器,让我们使用yum安装git包, npm取决于:

sudo yum install git

转至Node.js的下载页面 ,找到Linux程序(.tar.gz)方式提供下载链接。 右键单击它,并将其链接地址复制到剪贴板。 在写这篇文章的时候,最新的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 nodetar xvf node-v*.tar.gz --strip-components=1 -C ./node

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

cd ~rm -rf node-v*

接下来,我们将配置全局prefixnpm ,在npm将创建符号链接,安装节点程序包,到地方,它在你的默认路径。 我们将其设定为/usr/local用这个命令:

mkdir node/etcecho '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/nodesudo ln -s /opt/node/bin/npm /usr/local/bin/npm

需要注意的是,默认情况下, /usr/local/bin被排除PATHsudo使用。 要改变这种状况,打开sudoers文件中:

sudo visudo

查找指定的行Defaults secure_path ,并添加:/usr/local/bin到它的结束。完成后应该看起来像这样:

sudoers摘录
Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin

保存并退出。通过使用此命令检查节点的版本来验证节点是否已安装:

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

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@latest -g

使用PM2管理应用程序

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

启动应用程序

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

pm2 start hello.js

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

┌──────────┬────┬──────┬───────┬────────┬─────────┬────────┬─────────────┬──────────┐ App name  id  mode  pid    status  restart  uptime  memory       watching ├──────────┼────┼──────┼───────┼────────┼─────────┼────────┼─────────────┼──────────┤ hello     0   fork  30099  online  0        0s      14.227 MB    disabled └──────────┴────┴──────┴───────┴────────┴─────────┴────────┴─────────────┴──────────┘

正如你所看到的,PM2自动分配一个应用程序名称 (基于文件名,没有.js扩展名)和PM2 ID。 PM2还维护的其它信息,如进程的PID,其当前状态,和存储器使用率。在PM2下运行的应用程序将在应用程序崩溃或被终止时自动重新启动,但需要执行额外的步骤才能在系统启动(启动或重新引导)时启动应用程序。幸运的是,PM2提供了一种简单的方法来做到这一点, startup子命令。该startup子产生并配置启动脚本启动PM2和管理流程上的服务器引导。 你还必须指定要运行的初始化系统,这是systemd ,在我们的例子:

sudo pm2 startup systemd

您应该看到如下所示的输出,表示已安装pm2服务。

[PM2] Generating system init script in /etc/systemd/system/pm2.service[PM2] Making script booting at startup...[PM2] -systemd- Using the command:      su root -c "pm2 dump && pm2 kill" && su root -c "systemctl daemon-reload && systemctl enable pm2 && systemctl start pm2"[PM2] Dumping processes[PM2] Stopping PM2...[PM2] All processes have been stopped and deleted[PM2] PM2 stopped[PM2] Done.

现在,您的pm2管理的应用程序应该在启动时自动启动。

其他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服务器上,让我们安装epel-release使用yum包:

sudo yum install epel-release

然后安装Nginx:

sudo yum install nginx

现在打开Nginx配置文件进行编辑:

sudo vi /etc/nginx/nginx.conf

寻找到线location /定义,默认的服务器块内。它应该看起来像这样:

nginx.conf excerpt – location /(before)
        location / {        }

用下面的代码块替换它,一定要代替你自己的域名为server_name指令(或IP地址,如果你没有一个域设立这样做),并为应用程序服务器的私有IP地址APP_PRIVATE_IP_ADDRESS 。 此外,更改端口( 8080 ),如果你的应用程序设置为监听在不同的端口:

/etc/nginx/nginx.conf excerpt – location /(after)
    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 systemctl restart nginxsudo systemctl enable nginx

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

结论

恭喜!现在,您的Node.js应用程序运行在Nginx逆向代理之后。这种逆向代理设置足够灵活,可以让您的用户访问您想要共享的其他应用程序或静态Web内容。祝你运行你的Node.js开发!另外,如果你正在寻找加密您的Web服务器和用户之间的传输, 这里是一个教程,这将有助于你得到HTTPS(TLS / SSL)支持设立

赞(0) 打赏
未经允许不得转载:老赵部落 » 如何建立一个应用程序的Node.js生产在CentOS 7

评论 抢沙发