在Ubuntu 18.04上运行带有PM2和Apache 2.4的NodeJS

时间:2020-01-09 10:34:24  来源:igfitidea点击:

说明

在生产环境中运行NodeJS不仅仅是针对index.js运行节点。单个故障将关闭整个应用程序,并且没有进程将尝试重新启动它。在本教程中,我们将学习如何在PM2和Apache 2.4的生产环境中正确运行NodeJS。

PM2是用Java编写的流程管理器,其作用是确保NodeJS应用程序正在运行。它还提供对应用程序运行状况的可见性,并为其维护日志以简化故障排除。

为了进一步提高应用程序的可用性和性能,可以将Apache 2.4放在顶层。通过将Web服务器用作反向代理,我们可以更好地处理传入流量。

反向代理还提供了一种解决方案,可将负载分发到多个NodeJS后端,无论它们是Apache服务器本地的,容器中的还是专用主机上的。

安装NodeJS和NPM

安装NodeJS应该是首要任务。毕竟,应用程序需要是可执行的。以下说明将向我们展示如何在服务器上安装NodeJS。

使用PPA安装NodeJS

NodeJS为Ubuntu维护一个PPA。我们可以安装此PPA,以更原生地管理Ubuntu上的安装和补丁。

curl -sL https://deb.nodesource.com/setup_10.x -o nodesource_setup.sh
sudo bash nodesource_setup.sh
sudo apt install nodejs

对于那些喜欢稳定性和提高安全性的人来说,PPA可能是最好的方法。但是,使用PPA的时间很短。可用的版本是长期支持的稳定版本,我们可能需要在最新的NodeJS版本中添加的功能。

使用NVM安装NodeJS

节点版本管理器(NVM)授予我们对节点安装的更多控制权。它允许安装任何版本的NodeJS,而不仅仅是最新的LTS稳定版本。

要使用NVM在服务器上安装Node,必须先安装它。下面显示了如何下载安装脚本并运行它。

curl -sL https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh -o install_nvm.sh
bash install_nvm.sh

除了将NVM添加到当前会话的PATH外,上面运行的安装脚本可以执行所有操作。意思是,我们不能只简单地调用nvm。

我们可以注销用户会话,然后重新登录,但是更好的方法是运行source命令。这将立即将更新的环境设置应用于当前会话。

source ~/.profile

安装了NVM之后,就该安装NodeJS了。以下命令将安装最新版本的NodeJS。

nvm install default

但是,最好安装与应用程序一起编写的Node版本。我们可以通过运行nvm ls-remote命令列出可安装的Node版本。

nvm ls-remote

该命令的输出将类似于以下内容。我将结果截短以使查看不同版本更加容易,但是可用NodeJS版本的列表很长。

v10.15.1   (LTS: Dubnium)
    v10.15.2   (LTS: Dubnium)
    v10.15.3   (LTS: Dubnium)
    v10.16.0   (Latest LTS: Dubnium)
     v11.0.0
     v11.1.0
     v11.2.0
     v11.3.0
     v11.4.0
     v11.5.0
     v11.6.0
     v11.7.0
     v11.8.0
     v11.9.0
    v11.10.0
    v11.10.1
    v11.11.0
    v11.12.0
    v11.13.0
    v11.14.0
    v11.15.0
     v12.0.0
     v12.1.0
     v12.2.0
     v12.3.0
     v12.3.1

要安装列出的任何版本,请使用NVM install命令指定版本。例如,要安装版本12.3.0,请使用以下命令。

nvm install 12.3.1

安装PM2

PM2用Java语言编写,可以从npm存储库中安装。我们将在全局安装它,以确保整个系统都可以访问它。

sudo npm install -g pm2

使用PM2运行Node App

可以使用pm2 start命令启动NodeJS应用程序。

  • 导航到NodeJS应用程序所在的目录。
  • 针对它运行pm2 start命令。 PM2启动index.js
  • 运行pm2 list命令以查看正在运行的NodeJS应用程序的" pm2 list"。

在PM2中停止NodeJS应用

pm2 stop index

在PM2中为NodeJS应用命名

默认情况下,应用程序名称将基于应用程序的条目文件名。例如,以index.js开头的应用程序将被命名为index。可以将自定义名称分配给应用程序,以使其更容易识别它们。

pm2 start index.js --name "auth-api"

有关使用PM2的更多信息,请访问官方网站。

在继续安装和配置Apache之前,请确保NodeJS应用程序正在运行。

安装Apache Web服务器

安装Apache Web Server很简单。

sudo apt install apache2

Apache Web服务器将作为反向代理运行。对它的请求将被代理到由PM2管理的后端NodeJS应用程序。为了让Apache代理请求,必须安装并启用以下模块。

sudo en2mod proxy
sudo a2enmod proxy_http

要完全启用模块,必须重新启动Apache。使用以下命令重新启动Apache(如果已在运行)。

sudo systemctl restart apache2

配置Apache反向代理到PM2

使用Apache审核代理请求的最简单方法是使用ProxyPass和ProxyPassReverse指令。以下VirtualHost示例显示了如何将所有" /"请求代理到后端服务,该服务在本地主机的端口3000上运行。

<VirtualHost *:80>
    ProxyPreserveHost On

    ProxyPass / http://127.0.0.1:3000/
    ProxyPassReverse / http://127.0.0.1:3000/
</VirtualHost>

配置Apache以平衡NodeJS后端的负载

随着服务用户群开始增长,我们将需要研究如何在多个后端之间分配流量。这样做的添加价值在于提高了服务的可用性,因为这消除了单点故障。

在决定如何将负载分配给NodeJS应用程序时,必须考虑Apache中可用的可用算法。平衡的最简单形式是轮询,它将顺序地将每个请求转发到后端。

并非所有流量都是平等的,循环轮询并不总是一个好用例。我们可能需要更好的控制来对流量的分布进行建模,并且Apache提供了几种其他算法,例如按请求和按流量。

除其他算法外,权重还可以应用于单个后端服务器。

通过仅运行NodeJS应用程序的单个实例,我们已经创建了单点故障。释放对NodeJS微服务的新更新可能会导致中断。

要为微服务器增加高可用性,应至少运行一个实例。

为了平衡多个NodeJS应用程序,必须启用几个模块-proxy_balancer和lbmethod_byrequest。

sudo a2enmod proxy_balancer 
sudo a2enmod lbmethod_byrequests

proxy_balancer
启用创建后端服务器群集以进行平衡的功能。使用该模块创建的集群具有一个名称,该名称由ProxyPass和ProxyPassReverse指令引用。

平衡器成员
定义要包含在proxy_Balancer群集中的后端服务。

<VirtualHost *:80>
    <Proxy balancer://microservice-cluster>
        BalancerMember http://127.0.0.1:3000
        BalancerMember http://127.0.0.1:3001
        BalancerMember http://127.0.0.1:3002
    </Proxy>

    ProxyPreserveHost On

    ProxyPass / balancer://microservice-cluster/
    ProxyPassReverse / balancer://microservice-cluster/
</VirtualHost>

设置Apache负载均衡器算法和运行状况检查

简单的循环平衡可能会很好地工作,但是设置不同的算法来平衡流量通常更有利。我们还应确保流量不会被代理到已完成的NodeJS服务,因此不能处理请求。

运行状况检查用于定期验证后端服务的运行状况。检查是发送到NodeJS应用程序的简单请求。

sudo a2enmod lbmethod_bytraffic

仅启用lbmethod_bytraffic模块是不够的。我们将需要重新启动Apache,然后使用ProxySet设置平衡算法。

以下是设置平衡算法的Apache VirtualHost配置示例。

<VirtualHost *:80>
    <Proxy balancer://microservice-cluster>
        BalancerMember http://127.0.0.1:3000
        BalancerMember http://127.0.0.1:3001
        BalancerMember http://127.0.0.1:3002
        ProxySet lbmethod-bytraffic
    </Proxy>

    ProxyPreserveHost On

    ProxyPass / balancer://microservice-cluster/
    ProxyPassReverse / balancer://microservice-cluster/
</VirtualHost>