天天看点

如何在Ubuntu 16.04上设置Node.js生产应用程序

介绍

Node.js是一个开源JavaScript运行时环境,用于轻松构建服务器端和网络应用程序。该平台可在Linux,OS X,FreeBSD和Windows上运行。Node.js应用程序可以在命令行运行,但我们将专注于将它们作为服务运行,以便它们在重新启动或失败时自动重启,并且可以安全地在生产环境中使用。

在本教程中,我们将介绍如何在单个Ubuntu 16.04服务器上设置生产就绪的Node.js环境。该服务器将运行由PM2管理的Node.js应用程序,并通过Nginx反向代理为用户提供对应用程序的安全访问。Nginx服务器将使用Let's Encrypt提供的免费证书提供HTTPS。

要完成本教程,您需要具备两台已经设置好可以使用

sudo

命令的非root账号的Ubuntu服务器,并且已开启防火墙。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器。

准备

本教程假设您具有以下内容:

  • Ubuntu 16.04服务器,配置了具有

    sudo

    权限的非root用户。
  • 设置主机名,即指向服务器的公共IP的域名。本教程将始终使用example.com。
  • 根据如何在Ubuntu 16.04上安装Nginx安装Nginx
  • Nginx使用Let的加密证书配置SSL。

完成准备后,您将有一台服务器在https:// example.com /上提供默认的Nginx占位符页面。

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

安装Node.js.

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

首先,您需要安装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地址和端口。

Hello World Code

首先,创建并打开Node.js应用程序进行编辑。在本教程中,我们将使用

nano

编辑一个名为

hello.js

的示例应用程序:

cd ~
nano hello.js           

复制

将以下代码插入文件中。如果您愿意,可以在两个位置替换突出显示的端口

8080

(确保使用非管理端口,即1024或更高):

#!/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           

复制

Server running at http://localhost:8080/           

复制

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

为了测试应用程序,您的服务器上打开另一个终端会话,并用

curl

连接到本地主机:

curl http://localhost:8080           

复制

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

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的进程列表中,每次启动应用程序时都会输出该列表:

[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

子命令。

startup

子命令生成并配置启动脚本启动PM2和管理流程上的服务器引导:

pm2 startup systemd           

复制

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

[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           

复制

其他PM2用法(可选)

PM2提供了许多子命令,允许您管理或查找有关应用程序的信息。请注意,不带任何参数的运行

pm2

将显示一个帮助页面,包括示例用法,它比本教程的这一部分更详细地介绍了PM2的使用。

使用此命令停止应用程序(指定PM2

App name

id

):

pm2 stop app_name_or_id           

复制

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

App name

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设置为反向代理服务器

既然您的应用程序正在运行,并且正在侦听localhost,那么您需要为用户设置一种访问它的方法。为此,我们将Nginx Web服务器设置为反向代理。

在准备教程中,我们在

/etc/nginx/sites-available/default

文件中设置了Nginx配置。打开文件进行编辑:

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

复制

server

块内,您应该有一个现有的

location /

块。使用以下配置替换该块的内容。如果您的应用程序设置为侦听其他端口,请将突出显示的部分更新为正确的端口号。

. . .
    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

可用,通过网络浏览器访问

https://example.com/

会发送请求到

hello.js

,侦听端口

8080

的本地主机。

您可以将其他

location

块添加到同一服务器块,以提供对同一服务器上其他应用程序的访问。例如,如果您还在端口

8081

上运行另一个Node.js应用程序,则可以添加此位置块以允许通过

http://example.com/app2

访问它:

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发展顺利!

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

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