专栏首页云计算教程系列如何在CentOS 7上设置Node.js生产应用程序
原创

如何在CentOS 7上设置Node.js生产应用程序

介绍

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

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

要完成本教程,您需要具备两台已经设置好可以使用sudo命令的非root账号的CentOS服务器,并且已开启防火墙。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器

准备

本教程使用两台带有专用网络的 CentOS 7服务器(在同一数据中心内)。我们将通过以下名称来引用它们:

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

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

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

在开始本教程之前,您应该有一个在两台服务器上都配置了sudo权限的常规非root用户- 这是您应该登录到服务器的用户。

如果您希望能够通过域名而不是公共IP地址访问您的Web服务器,请先注册域名

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

安装Node.js.

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

应用服务器上,让我们使用yum安装git包,这是npm的依赖项:

sudo yum install git

转到Node.js下载页面,找到Linux Binaries(.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 node
tar xvf node-v*.tar.gz --strip-components=1 -C ./node

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

cd ~
rm -rf node-v*

接下来,我们将配置npm的全局prefix,在这里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

请注意,默认情况下,在使用sudo时将/usr/local/binPATH排除。要更改它,请打开sudoers文件:

sudo visudo

找到指定Defaults secure_path并添加:/usr/local/bin到其末尾的行。当你完成时它应该是这样的:

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin

保存并退出。

通过使用以下命令检查其版本来验证是否已安装Node:

node -v

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

创建Node.js应用程序

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

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

如果您使用DigitalOcean Droplet作为服务器,则可以通过Metadata服务查找服务器的专用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或更高):

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地址和端口,并返回带有200HTTP成功代码的“Hello World” 。这意味着只能从同一专用网络上的服务器访问应用程序,例如我们的Web服务器。

测试应用(可选)

如果要测试应用程序是否有效,请在应用服务器上运行此node命令:

node hello.js

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

要测试应用程序,请打开另一个终端会话并连接到您的Web服务器。由于Web服务器位于同一专用网络上,因此应该能够使用curl使该服务器访问应用服务器的专用IP地址。请务必在AppServer的私有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提供了一种管理和守护应用程序的简便方法(将它们作为服务运行)。

我们将使用Node Packaged Modules(NPM),它基本上是与Node.js一起安装的Node模块的包管理器,用于在我们的app服务器上安装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和管理流程上的服务器引导。您还必须指定正在运行的init系统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

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

pm2 list

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

pm2 info example

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

pm2 monit

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

设置反向代理服务器

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

Web服务器上,让我们使用yum 安装epel-release包:

sudo yum install epel-release

然后安装Nginx:

sudo yum install nginx

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

sudo vi /etc/nginx/nginx.conf

在默认服务器块中查找定义的行location /。它应该看起来像这样:

        location / {
        }

将其替换为以下代码块,并确保使用您自己的域名替换该server_name指令(如果您没有设置域,则使用IP地址),以及APP_PRIVATE_IP_ADDRESS应用服务器专用IP地址。此外,如果您的应用程序设置为侦听其他端口,请更改端口(8080):

    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应用程序将接收并回复该请求。

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

    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 nginx
sudo systemctl enable nginx

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

结论

恭喜!您现在在Nginx反向代理后面运行Node.js应用程序。此反向代理设置足够灵活,可让您的用户访问您要共享的其他应用程序或静态Web内容。祝你的Node.js发展顺利!

想要了解更多关于设置Node.js生产应用程序的相关教程,请前往腾讯云+社区学习更多知识。


参考文献:《How To Set Up a Node.js Application for Production on CentOS 7》

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 如何在CentOS 7上用mod_proxy将Apache设置为反向代理

    反向代理是一种代理服务器,它接受HTTP(S)的请求后,把它们发送到一个或多个后端服务器。反向代理非常有用,因为许多现代网络应用使用后端应用程序服务器处理传入的...

    不会飞的蝴蝶
  • 如何在服务器上安装OpenLDAP

    轻量级目录访问协议(LDAP)是一种标准协议,旨在通过网络管理和访问分层目录信息。目录服务在开发内部网和与互联网程序共享用户、系统、网络、服务和应用的过程中占据...

    不会飞的蝴蝶
  • 如何在Debian 8上安装Nginx

    Nginx是Apache2的流行HTTP服务器替代品。它可以用作反向代理,邮件服务器或Web服务器。根据截至2015年7月的Netcraft调查,Nginx目前...

    不会飞的蝴蝶
  • 如何建立一个Node.js的应用生产在Ubuntu 14.04

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

    程序员的自我修养
  • python, my first cod

    print "guess the right number ,so please input a number:"

    用户2398817
  • 数据结构C#版笔记--树与二叉树

                    图1 上图描述的数据结构就是“树”,其中最上面那个圈圈A称之为根节点(root),其它圈圈称为节点(node),当然root可以...

    菩提树下的杨过
  • 当Vert.x符合Reactive eXtensions(Vert.x简介的第5部分)

    这篇文章是我介绍Eclipse Vert.x系列的第五篇文章。在上一篇文章中,我们看到了Vert.x如何与数据库交互。我们使用Future对象来驯服Vert.x...

    evildickman
  • 双非菜鸟的Java实习面试经历..

    牛客网
  • silverlight 背景透明

    silverlight小技巧 silverlight 背景透明 aspx page 添加PluginBackground="Transparent" ...

    用户1172164
  • Linux下如何简单快速搭建FTP服务器

    遥想多年前,我们还在玩虚拟主机的时候,一个小小的FTP账号我们就可以玩半天,那会使用的是flashfxp。 后来,有了VPS(那时用的还是win系列服务器系统)...

    小柒2012

扫码关注云+社区

领取腾讯云代金券