介绍
Node.js 是一个开源的 JavaScript 运行环境,用于轻松构建服务器侧和网络应用程序. 该平台运行在 Linux、OS X、FreeBSD 和 Windows 上。 Node.js 应用程序可以在命令行运行,但我们将专注于将其作为服务运行,以便在重新启动或故障时自动重新启动,并可以在生产环境中安全使用。
在本教程中,我们将涵盖在单一的 Debian 8 服务器上建立生产准备的 Node.js 环境,该服务器将运行由 PM2 管理的 Node.js 应用程序,并通过 Nginx 反向代理程序为用户提供安全访问。
前提条件
本指南假定您有一个 Debian 8 服务器,配置为具有sudo
特权的非根用户,如在 Debian 8 初始服务器安装指南中所述。
它还假定你有一个域名,指向服务器的公共IP地址。
让我们通过在您的服务器上安装 Node.js 运行时间来开始。
安装 Node.js
我们将使用 NodeSource包档案安装 Node.js 的最新 LTS 版本。
首先,您需要安装 NodeSource PPA 才能访问其内容. 请确保您位于您的主目录中,并使用 curl 获取 Node.js 6.x 档案的安装脚本:
1cd ~
2curl -sL https://deb.nodesource.com/setup_6.x -o nodesource_setup.sh
您可以使用 nano (或您喜爱的文本编辑器) 检查本脚本的内容:
1nano nodesource_setup.sh
然后在sudo
下运行脚本:
1sudo bash nodesource_setup.sh
PPA 将被添加到您的配置中,您的本地包缓存将自动更新。从 nodesource 运行安装脚本后,您可以以上面的方式安装 Node.js 包:
1sudo apt-get install nodejs
「nodejs」包包含「nodejs」二进制和「npm」,因此您不需要单独安装「npm」。
1sudo apt-get install build-essential
Node.js 运行时间已安装,并准备运行应用程序!让我们写一个 Node.js 应用程序。
创建 Node.js 应用
我们会写一个 Hello World 应用程序,它只会返回任何 HTTP 请求的Hello World
这个样本应用程序将帮助您设置您的 Node.js,您可以用自己的应用程序代替 - 只需确保您修改您的应用程序以倾听适当的 IP 地址和端口。
世界代码
首先,创建并打开您的 Node.js 应用程序进行编辑. 对于本教程,我们将使用nano
来编辑名为hello.js
的样本应用程序:
1cd ~
2nano hello.js
如果您想要,您可以在两个位置更换突出的端口,‘8080’(请确保使用非管理员端口,即1024或更大):
1[label hello.js]
2#!/usr/bin/env nodejs
3var http = require('http');
4http.createServer(function (req, res) {
5 res.writeHead(200, {'Content-Type': 'text/plain'});
6 res.end('Hello World\n');
7}).listen(8080, 'localhost');
8console.log('Server running at http://localhost:8080/');
现在保存和退出。
这个 Node.js 应用程序只是在指定的地址(‘localhost’)和端口(‘8080’)上收听,并以‘200’ HTTP 成功代码返回Hello World
。
测试应用
为了使我们能够测试应用程序,请选择hello.js
可执行:
1chmod +x ./hello.js
然后这样运行:
1./hello.js
1[secondary_label Output]
2Server running at http://localhost:8080/
<$>[注] 注: 以这种方式运行 Node.js 应用程序将阻止额外的命令,直到应用程序通过按压 Ctrl-C 被杀死。
要测试应用程序,请在您的服务器上打开另一个终端会话,并使用弯曲
连接到 localhost:
1curl http://localhost:8080
如果您看到以下输出,应用程序正在正常工作,并在正确的地址和端口上收听:
1[secondary_label Output]
2Hello World
如果您看不到正确的输出,请确保您的 Node.js 应用程序正在运行,并配置为听取正确的地址和端口。
一旦你确定它工作,杀死应用程序(如果你还没有)通过按 Ctrl+C。
安装 PM2
现在我们将安装 PM2,这是一种 Node.js 应用程序的流程管理器。
我們將使用「npm」,即與 Node.js 一起安裝的 Node 模組的包管理器,在我們的伺服器上安裝 PM2。
1sudo npm install -g pm2
-g
选项告诉npm
安装模块 globally,以便它在整个系统中可用。
使用PM2管理应用程序
PM2 简单易用,我们将涵盖 PM2 的几个基本用途。
启动应用
您要做的第一件事是使用pm2 start
命令在背景中运行您的应用程序hello.js
:
1pm2 start hello.js
这还会将您的应用程序添加到 PM2 的流程列表中,该列表每次启动应用程序时都会输出:
1[secondary_label Output]
2[PM2] Spawning PM2 daemon
3[PM2] PM2 Successfully daemonized
4[PM2] Starting hello.js in fork_mode (1 instance)
5[PM2] Done.
6┌──────────┬────┬──────┬──────┬────────┬─────────┬────────┬─────────────┬──────────┐
7│ App name │ id │ mode │ pid │ status │ restart │ uptime │ memory │ watching │
8├──────────┼────┼──────┼──────┼────────┼─────────┼────────┼─────────────┼──────────┤
9│ hello │ 0 │ fork │ 3524 │ online │ 0 │ 0s │ 21.566 MB │ disabled │
10└──────────┴────┴──────┴──────┴────────┴─────────┴────────┴─────────────┴──────────┘
11 Use `pm2 show <id|name>` to get more details about an app
正如您所看到的,PM2 会自动分配一个 App 名称(基于文件名称,不含.js
扩展)和一个 PM2 id。
如果应用程序故障或死亡,在PM2下运行的应用程序将自动重新启动,但需要采取额外的步骤来让应用程序在系统启动(启动或重新启动)上启动。
启动
子命令生成并配置一个启动脚本,以便在服务器机器人上启动PM2及其管理流程。
1pm2 startup systemd
结果输出的最后一行将包含一个命令,您必须使用超级用户权限运行:
1[secondary_label Output]
2[PM2] You have to run this command as root. Execute the following command:
3sudo env PATH=$PATH:/usr/bin /usr/local/lib/node_modules/pm2/bin/pm2 startup systemd -u sammy --hp /home/sammy
运行生成的命令(类似于上面的突出输出,但使用您的用户名而不是sammy
)以设置PM2开始启动(使用来自自己的输出的命令):
1sudo env PATH=$PATH:/usr/bin /usr/local/lib/node_modules/pm2/bin/pm2 startup systemd -u sammy --hp /home/sammy
这将创建一个 systemd unit,为您的启动用户运行pm2
。这个pm2
实例,反过来,运行hello.js
。
1systemctl status pm2
有关 systemd 的详细概述,请参阅 Systemd Essentials: Working with Services, Units, and the Journal。
其他 PM2 用途(可选)
PM2提供了许多子命令,允许您管理或搜索有关您的应用程序的信息。 请注意,运行pm2
没有任何论点会显示一个帮助页面,包括示例使用,该页面比本教程的本节更详细地涵盖了PM2的使用。
使用此命令停止应用程序(指定PM2应用程序名称
或id
):
1pm2 stop app_name_or_id
使用此命令重新啟動應用程式(指定 PM2「應用程式名稱」或「id」):
1pm2 restart app_name_or_id
目前由 PM2 管理的应用程序列表也可以通过列表
子命令查看:
1pm2 list
有关特定应用程序的更多信息可以通过使用info
子命令找到(指定 PM2 App name 或 id):
1pm2 info example
PM2 流程监视器可以通过monit
子命令拉上,显示应用程序状态、CPU 和内存使用量:
1pm2 monit
现在您的 Node.js 应用程序正在运行,并由 PM2 管理,让我们设置反向代理。
将 Nginx 设置为反向代理服务器
现在你的应用程序正在运行,并听到 localhost,你需要为你的用户设置一种方法来访问它. 我们将为此设置一个 Nginx 网页服务器作为反向代理程序。本教程将从头开始设置一个 Nginx 服务器。 如果你已经有一个 Nginx 服务器设置,你可以简单地将位置
块复制到你选择的服务器块(确保位置不会与你的网页服务器的任何现有内容相冲突)。
首先,使用 apt-get 安装 Nginx:
1sudo apt-get install nginx
现在打开默认服务器封锁配置文件进行编辑:
1sudo nano /etc/nginx/sites-available/default
删除文件中的所有内容,并插入以下配置: 请确保您将自己的域名替换为server_name
指令。 此外,如果您的应用程序设置为在不同的端口上收听,则更改端口(8080
):
1[label /etc/nginx/sites-available/default]
2server {
3 listen 80;
4
5 server_name example.com;
6
7 location / {
8 proxy_pass http://localhost:8080;
9 proxy_http_version 1.1;
10 proxy_set_header Upgrade $http_upgrade;
11 proxy_set_header Connection 'upgrade';
12 proxy_set_header Host $host;
13 proxy_cache_bypass $http_upgrade;
14 }
15}
假设我们的服务器在example.com
上可用,通过网页浏览器访问http://example.com/
将请求发送到hello.js
,在端口8080
上听到localhost**
。
您可以将额外的位置
块添加到相同的服务器块中,以便提供在相同的服务器上其他应用程序的访问。例如,如果您也在端口8081
上运行另一个 Node.js 应用程序,您可以添加此位置块来允许通过http://example.com/app2
访问:
1[label Nginx Configuration — Additional Locations]
2 location /app2 {
3 proxy_pass http://localhost:8081;
4 proxy_http_version 1.1;
5 proxy_set_header Upgrade $http_upgrade;
6 proxy_set_header Connection 'upgrade';
7 proxy_set_header Host $host;
8 proxy_cache_bypass $http_upgrade;
9 }
一旦您完成为您的应用程序添加位置块,保存和退出。
确保您没有输入任何语法错误,键入:
1sudo nginx -t
接下来,重新启动 Nginx:
1sudo systemctl restart nginx
接下来,允许流量到 Nginx 通过防火墙,如果你有它启用。
如果您正在使用 ufw,您可以使用以下命令:
1sudo ufw allow 'Nginx Full'
使用 ufw,您可以随时使用以下命令检查状态:
1sudo ufw status
如果您正在使用 IPTables,您可以使用以下命令允许流量到 Nginx:
1sudo iptables -I INPUT -p tcp -m tcp --dport 80 -j ACCEPT
您可以通过运行以下命令随时检查 IPTables 的状态:
1sudo iptables -S
假设您的 Node.js 应用程序正在运行,您的应用程序和 Nginx 配置是正确的,您现在应该能够通过 Nginx 反向代理程序访问您的应用程序。
从这里开始,您应该继续通过阅读 如何在Debian 8上使用Let’s Encrypt保护 Nginx来保护您的设置。
结论
恭喜您!您现在有 Node.js 应用程序在 Debian 8 服务器上运行 Nginx 反向代理程序后面。 这种反向代理程序的设置足够灵活,可以让您的用户访问您想要共享的其他应用程序或静态 Web 内容。