在Ubuntu 18.04上运行带有PM2和Apache 2.4的NodeJS
说明
在生产环境中运行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>