如何为生产准备NodeJS?

时间:2019-01-13 13:52:17

标签: node.js angular ubuntu mean-stack

我有一个MEAN Stack应用程序,需要在CPanel上托管,而且我以前从未部署过该应用程序。通过使用以下命令在dist文件夹中创建捆绑包,可以轻松部署应用程序的Angular部分:

{{1}}

但是我想知道如何将后端代码发布到服务器上。是否有任何命令可以像Angular一样创建缩小的包?

我还想知道是否需要安装一些npm软件包来确保我的应用程序在服务器上顺利运行?就像我在搜索有关部署Node.js时不断阅读有关PM2和Nginx的内容一样。那么他们有什么好处呢?

请提及任何可能有用的文章或视频。

Angular版本7

节点版本8.11.3

Ubuntu 16.04

2 个答案:

答案 0 :(得分:0)

您可以按原样部署代码,它将起作用!

您不需要缩小代码。 VM足够快地可以运行它。在将文件从服务器发送到客户端时,通常会进行缩小以减小文件的大小,并且由于您不发送任何文件,因此无需担心。

我建议PM2用于在达到生产状态后管理Node进程。它包括日志,自动重启和许多很酷的功能,可以帮助您。

如果您担心node_modules目录的大小,也许您可​​以确定仅在开发过程中使用了哪些软件包(例如,诸如Jest和Mocha的测试工具,Babel,Typescript等的编译器等。 )。将它们放在"devDependency"文件的package.json键中。然后,在生产环境中运行npm install --production,它将不会安装您列出的devDependency。那应该产生较小的node_modules

如果您遵循The Twelve Factors,则还要为仅生产凭据创建环境文件。

为了完整起见,如果您使用的是Babel / Typescript或类似的任何其他工具,那么您确实需要将项目转换为Node可以理解的Javascript代码。运行相应的命令以生成生产版本。

关于Nginx,有些人喜欢将Nginx用作反向代理,以使其服务于静态资产,而对于API请求,他们将其转发给Node API。这是“最佳做法”,因为可以轻松地调整Nginx以便更快地为静态资产提供服务,并且包括用于缓存,安全保护等的多个选项。

答案 1 :(得分:0)

安装Node.js 我们将使用NodeSource软件包档案安装最新的LTS版本的Node.js。

首先,您需要安装NodeSource PPA才能访问其内容。确保您位于主目录中,并使用curl来获取Node.js 6.x归档文件的安装脚本:

$ cd ~
$curl -sL https://deb.nodesource.com/setup_6.x -o nodesource_setup.sh

您可以使用nano(或您喜欢的文本编辑器)检查此脚本的内容:

$ nano nodesource_setup.sh

并在sudo下运行脚本:

$ sudo bash nodesource_setup.sh

PPA将添加到您的配置中,并且本地软件包缓存将自动更新。从nodesource运行安装脚本后,可以按照与上面相同的方式安装Node.js软件包:

$ sudo apt-get install nodejs

nodejs软件包包含nodejs二进制文件以及npm,因此您不需要单独安装npm。但是,为了使某些npm软件包(例如那些需要从源代码编译代码的软件包)起作用,您将需要安装build-essential软件包:

$ sudo apt-get install build-essential

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

注意:从NodeSource PPA安装时,Node.js可执行文件称为nodejs,而不是node。

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

您好世界代码 首先,创建并打开您的Node.js应用程序进行编辑。在本教程中,我们将使用nano编辑一个名为hello.js的示例应用程序:

$ cd ~
$ nano hello.js

将以下代码插入文件中。如果需要,可以在两个位置都替换突出显示的端口8080(请确保使用非管理员端口,即1024或更高):

hello.js

#!/usr/bin/env nodejs
var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
}).listen(8080, 'localhost');
console.log('Server running at http://localhost:8080/');

现在保存并退出。

此Node.js应用程序仅侦听指定的地址(localhost)和端口(8080),然后返回带有200 HTTP成功代码的“ Hello World”。由于我们正在监听localhost,因此远程客户端将无法连接到我们的应用程序。

测试申​​请 为了测试您的应用程序,请标记hello.js可执行文件:

$chmod +x ./hello.js

并像这样运行它:

$./hello.js

输出 服务器在http://localhost:8080/下运行 注意:以这种方式运行Node.js应用程序将阻止其他命令,直到按Ctrl-C将其终止。

为了测试应用程序,请在服务器上打开另一个终端会话,然后使用curl连接到localhost:

$curl http://localhost:8080

如果看到以下输出,则表明应用程序运行正常并且正在侦听正确的地址和端口:

Output
Hello World

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

确定运行后,请按Ctrl + C终止该应用程序(如果尚未安装)。

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

我们将使用npm(用于与Node.js一起安装的Node模块的软件包管理器)在我们的服务器上安装PM2。使用此命令安装PM2:

$sudo npm install -g pm2

-g选项告诉npm全局安装该模块,以便在系统范围内可用。

使用PM2管理应用程序 PM2简单易用。我们将介绍PM2的一些基本用法。

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

$ pm2 start hello.js

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

Output
[PM2] Spawning PM2 daemon
[PM2] PM2 Successfully daemonized
[PM2] Starting hello.js in fork_mode (1 instance)
[PM2] Done.
┌──────────┬────┬──────┬──────┬────────┬─────────┬────────┬─────────────┬──────────┐
│ App name │ id │ mode │ pid  │ status │ restart │ uptime │ memory      │ watching │
├──────────┼────┼──────┼──────┼────────┼─────────┼────────┼─────────────┼──────────┤
│ hello    │ 0  │ fork │ 3524 │ online │ 0       │ 0s     │ 21.566 MB   │ disabled │
└──────────┴────┴──────┴──────┴────────┴─────────┴────────┴─────────────┴──────────┘
Use `pm2 show <id|name>` to get more details about an app

如您所见,PM2自动分配一个应用程序名称(基于文件名,不带.js扩展名)和一个PM2 ID。 PM2还维护其他信息,例如进程的PID,其当前状态和内存使用情况。

如果PM2下运行的应用程序崩溃或被杀死,它将自动重新启动,但是还需要采取其他步骤来使应用程序在系统启动(启动或重新启动)时启动。幸运的是,启动子命令PM2提供了一种简单的方法。

startup子命令生成并配置一个启动脚本,以在服务器启动时启动PM2及其托管进程:

$ pm2 startup systemd

结果输出的最后一行将包含您必须以超级用户特权运行的命令:

Output
[PM2] Init System found: systemd
[PM2] You have to run this command as root. Execute the following command:
sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u sammy --hp /home/sammy

运行生成的命令(类似于上面突出显示的输出,但是使用您的用户名而不是sammy)来设置PM2以在启动时启动(使用您自己的输出中的命令):

$ sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u sammy --hp /home/sammy

这将创建一个systemd单元,该单元在引导时为您的用户运行pm2。该pm2实例依次运行hello.js。您可以使用systemctl检查systemd单元的状态:

$ systemctl status pm2-sammy

有关systemd的详细概述,请参阅Systemd Essentials:使用服务,单元和日记。

其他PM2用法(可选) PM2提供了许多子命令,这些子命令使您可以管理或查找有关应用程序的信息。请注意,不带任何参数运行pm2将显示帮助页面,其中包括示例用法,该页面比本教程的本节更详细地介绍了PM2的用法。

使用此命令停止应用程序(指定PM2应用程序名称或ID):

$ pm2 stop app_name_or_id

使用此命令重新启动应用程序(指定PM2应用程序名称或ID):

$ pm2 restart app_name_or_id

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

$ pm2 list

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

$ pm2 info example

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

$ pm2 monit

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

将Nginx设置为反向代理服务器 现在您的应用程序正在运行,并且正在本地主机上侦听,您需要设置一种让用户访问它的方法。为此,我们将Nginx Web服务器设置为反向代理。

在先决条件教程中,我们在/ etc / nginx / sites-available / default文件中设置Nginx配置。打开文件进行编辑:

$ sudo nano /etc/nginx/sites-available/default

在服务器块内,您应该已有一个位置/块。用以下配置替换该块的内容。如果您的应用程序设置为在其他端口上侦听,则将突出显示的部分更新为正确的端口号。

/etc/nginx/sites-available/default
. . .
  location / {
    proxy_pass http://localhost: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;
  }
}

这将服务器配置为响应其根目录下的请求。假设我们的服务器在example.com上可用,则通过Web浏览器访问https://example.com/会将请求发送到hello.js,侦听本地主机的端口8080。

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

/etc/nginx/sites-available/default — Optional
   location /app2 {
     proxy_pass http://localhost: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;
 }

完成为应用程序添加位置块后,保存并退出。

请确保您没有键入以下任何语法错误:

$ sudo nginx -t

接下来,重新启动Nginx:

$ sudo systemctl restart nginx

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

结论 恭喜你!现在,您的Node.js应用程序在Ubuntu 16.04服务器上的Nginx反向代理后面运行。这种反向代理设置足够灵活,可以为您的用户提供对您要共享的其他应用程序或静态Web内容的访问权限。祝您开发Node.js好运!

我还找到了以下帮助视频:https://www.youtube.com/watch?v=Jsmeh7q9Qv4