前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何在CentOS 7上设置Node.js生产应用程序

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

原创
作者头像
不会飞的蝴蝶
修改2018-10-22 11:51:39
2K0
修改2018-10-22 11:51:39
举报

介绍

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的依赖项:

代码语言:javascript
复制
sudo yum install git

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

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

代码语言:javascript
复制
cd ~
wget https://nodejs.org/dist/v4.2.3/node-v4.2.3-linux-x64.tar.gz

现在使用以下命令将刚刚下载的tar存档解压缩到node目录中:

代码语言:javascript
复制
mkdir node
tar xvf node-v*.tar.gz --strip-components=1 -C ./node

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

代码语言:javascript
复制
cd ~
rm -rf node-v*

接下来,我们将配置npm的全局prefix,在这里npm将创建符号链接到安装节点包,到某处,它在你的默认路径。我们将使用此命令将其设置为/usr/local

代码语言:javascript
复制
mkdir node/etc
echo 'prefix=/usr/local' > node/etc/npmrc

现在,我们已经准备好移动nodenpm二进制文件的安装位置。我们将使用此命令将其移至/opt/node

代码语言:javascript
复制
sudo mv node /opt/

此时,您可能想要创建root文件的所有者:

代码语言:javascript
复制
sudo chown -R root: /opt/node

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

代码语言:javascript
复制
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文件:

代码语言:javascript
复制
sudo visudo

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

代码语言:javascript
复制
Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin

保存并退出。

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

代码语言:javascript
复制
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地址:

代码语言:javascript
复制
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的示例应用程序:

代码语言:javascript
复制
vi hello.js

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

代码语言:javascript
复制
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命令:

代码语言:javascript
复制
node hello.js

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

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

代码语言:javascript
复制
curl http://APP_PRIVATE_IP_ADDRESS:8080

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

代码语言:javascript
复制
Hello World

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

应用服务器上,请务必按下CTRL+C以终止应用程序(如果您还没有的话)。

安装PM2

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

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

代码语言:javascript
复制
sudo npm install pm2@latest -g

使用PM2管理应用程序

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

运行应用程序

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

代码语言:javascript
复制
pm2 start hello.js

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

代码语言:javascript
复制
┌──────────┬────┬──────┬───────┬────────┬─────────┬────────┬─────────────┬──────────┐
│ 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,在我们的示例中:

代码语言:javascript
复制
sudo pm2 startup systemd

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

代码语言:javascript
复制
[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):

代码语言:javascript
复制
pm2 stop example

使用此命令重新启动应用程序(指定PM2 App nameid):

代码语言:javascript
复制
pm2 restart example

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

代码语言:javascript
复制
pm2 list

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

代码语言:javascript
复制
pm2 info example

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

代码语言:javascript
复制
pm2 monit

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

设置反向代理服务器

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

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

代码语言:javascript
复制
sudo yum install epel-release

然后安装Nginx:

代码语言:javascript
复制
sudo yum install nginx

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

代码语言:javascript
复制
sudo vi /etc/nginx/nginx.conf

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

代码语言:javascript
复制
        location / {
        }

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

代码语言:javascript
复制
    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访问它:

代码语言:javascript
复制
    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并使其在启动时启动:

代码语言:javascript
复制
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》

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 介绍
  • 准备
  • 安装Node.js.
  • 创建Node.js应用程序
    • Hello World 代码
    • 测试应用(可选)
    • 安装PM2
    • 使用PM2管理应用程序
      • 运行应用程序
        • 其他PM2用法(可选)
        • 设置反向代理服务器
        • 结论
        相关产品与服务
        云开发 CloudBase
        云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档