如何在 Debian 10 上安装 Node.js 并将 Nginx 配置为前端代理服务器
在此页
- 先决条件
- 开始
- 安装 Node.js
- 创建 Node.js 应用程序
- 安装和配置 PM2
- 将 Nginx 配置为 Node.js 的反向代理
- 访问您的 Node.js 应用程序
- 结论
Node.js 是一个免费的开源 JavaScript 平台,可用于提供动态和响应式服务器端内容。它建立在 Chrome 的 V8 JavaScript 引擎之上,能够在网络浏览器之外执行 JavaScript 代码。它可以在多种操作系统上运行,包括 Linux、FreeBSD、Windows 和 macOS。 Node.js 也适用于其他网络服务器,如 Apache 和 Nginx。
在本教程中,我们将学习如何在 Debian 10 上安装和配置 Node.js 来处理后端请求,以及如何配置 Nginx 来处理前端请求。
先决条件
- 运行 Debian 10 的服务器。
- 在您的服务器上配置了根密码。
入门
首先,建议将您的系统更新到最新版本。您可以使用以下命令执行此操作:
apt-get update -y
apt-get upgrade -y
服务器更新后,重新启动它以应用更改。
安装 Node.js
默认情况下,最新版本的 Node.js 在 Debian 10 默认存储库中不可用。所以你需要从脚本中安装它。
首先,使用以下命令安装 curl:
apt-get install curl -y
接下来,使用以下命令下载并安装 Node.js 安装脚本:
curl -sL https://deb.nodesource.com/setup_12.x | bash -
安装完成后,您可以使用以下命令安装 Node.js:
apt-get install nodejs -y
安装成功完成后,您可以使用以下命令验证 Node.js 版本:
nodejs --version
您应该在以下输出中看到 Node.js 版本:
v12.16.1
您还可以通过运行以下命令来检查 NPM 版本:
npm --version
您应该会在以下输出中看到 NPM 版本:
6.13.4
创建 Node.js 应用程序
首先,您需要为您的应用程序创建一个目录。您可以通过运行以下命令来创建它:
mkdir nodeapp
接下来,将目录更改为 nodeapp 并使用以下命令安装 express:
cd nodeapp
npm install express
接下来,使用 nano 编辑器通过 express 创建一个示例 Node.js 应用程序:
nano app.js
添加以下内容:
var express = require('express');
var app = express();
app.get('/', function(req, res){
res.send("Nginx as Frontend Server for Node.js!");
});
app.listen(8000, '127.0.0.1');
完成后保存并关闭文件。
接下来,使用以下命令运行您的应用程序:
node app.js
接下来,打开其他终端并使用以下命令验证应用程序:
netstat -antup | grep 8000
您应该看到您的 Node.js 应用程序正在侦听端口 8000:
tcp 0 0 127.0.0.1:8000 0.0.0.0:* LISTEN 26193/node
您还可以使用 curl 命令验证应用程序,如下所示:
curl http://127.0.0.1:8000
如果一切正常,您应该得到以下输出:
Nginx as Frontend Server for Node.js!
安装和配置 PM2
PM2 是一个管理 Node.js 应用程序的进程管理器。您可以使用 PM2 轻松启动、停止和启用 Node.js 应用程序以在启动时启动。
首先,使用 NPM 安装最新版本的 PM2,如下所示:
npm install pm2 -g
安装后,使用以下命令将目录更改为 nodeapp 和您的应用程序:
cd nodeapp
pm2 start app.js
应用程序启动后,您应该获得以下输出:
-------------
__/""""\____/"\____________/"\____/"""_____
_\/"/////////"_\/""________/""__/"///////"___
_\/"_______\/"_\/"//"____/"//"_\///______\//"__
_\/""""\/__\/"\///"/"/_\/"___________/"/___
_\/"/////////____\/"__\///"/___\/"________/"//_____
_\/"_____________\/"____\///_____\/"_____/"//________
_\/"_____________\/"_____________\/"___/"/___________
_\/"_____________\/"_____________\/"__/"""""_
_\///______________\///______________\///__\///////////////__
Runtime Edition
PM2 is a Production Process Manager for Node.js applications
with a built-in Load Balancer.
Start and Daemonize any application:
$ pm2 start app.js
Load Balance 4 instances of api.js:
$ pm2 start api.js -i 4
Monitor in production:
$ pm2 monitor
Make pm2 auto-boot at server restart:
$ pm2 startup
To go further checkout:
http://pm2.io/
-------------
[PM2] Spawning PM2 daemon with pm2_home=/root/.pm2
[PM2] PM2 Successfully daemonized
[PM2] Starting /root/nodeapp/app.js in fork_mode (1 instance)
[PM2] Done.
?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
? id ? name ? namespace ? version ? mode ? pid ? uptime ? ? ? status ? cpu ? mem ? user ? watching ?
?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
? 0 ? app ? default ? N/A ? fork ? 13202 ? 0s ? 0 ? online ? 0% ? 27.2mb ? root ? disabled ?
?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
在上面的输出中,您可以看到非常有用的信息,例如应用程序 PID、正常运行时间、状态、CPU 和内存使用情况。
接下来,运行以下命令为 Node.js 应用程序创建和配置启动脚本,以便您的 Node.js 应用程序将在启动时自动启动。
pm2 startup
您应该得到以下输出:
[PM2] Init System found: systemd
Platform systemd
Template
[Unit]
Description=PM2 process manager
Documentation=https://pm2.keymetrics.io/
After=network.target
[Service]
Type=forking
User=root
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
Environment=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
Environment=PM2_HOME=/root/.pm2
PIDFile=/root/.pm2/pm2.pid
Restart=on-failure
ExecStart=/usr/lib/node_modules/pm2/bin/pm2 resurrect
ExecReload=/usr/lib/node_modules/pm2/bin/pm2 reload all
ExecStop=/usr/lib/node_modules/pm2/bin/pm2 kill
[Install]
WantedBy=multi-user.target
Target path
/etc/systemd/system/pm2-root.service
Command list
[ 'systemctl enable pm2-root' ]
[PM2] Writing init configuration in /etc/systemd/system/pm2-root.service
[PM2] Making script booting at startup...
[PM2] [-] Executing: systemctl enable pm2-root...
Created symlink /etc/systemd/system/multi-user.target.wants/pm2-root.service → /etc/systemd/system/pm2-root.service.
[PM2] [v] Command successfully executed.
+---------------------------------------+
[PM2] Freeze a process list on reboot via:
$ pm2 save
[PM2] Remove init script via:
$ pm2 unstartup systemd
接下来,使用以下命令启动 PM2 服务:
systemctl start pm2-root
接下来,使用以下命令验证 PM2 服务的状态:
systemctl status pm2-root
您应该得到以下输出:
? pm2-root.service - PM2 process manager
Loaded: loaded (/etc/systemd/system/pm2-root.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2020-03-26 06:04:28 UTC; 2s ago
Docs: https://pm2.keymetrics.io/
Process: 13387 ExecStart=/usr/lib/node_modules/pm2/bin/pm2 resurrect (code=exited, status=0/SUCCESS)
Main PID: 13191 (PM2 v4.2.3: God)
Tasks: 0 (limit: 4915)
CGroup: /system.slice/pm2-root.service
? 13191 PM2 v4.2.3: God Daemon (/root/.pm2)
Mar 26 06:04:28 kolab.linuxbuz.com pm2[13387]: [PM2] Restoring processes located in /root/.pm2/dump.pm2.bak
Mar 26 06:04:28 kolab.linuxbuz.com pm2[13387]: [PM2][ERROR] Failed to read dump file in /root/.pm2/dump.pm2.bak
Mar 26 06:04:28 kolab.linuxbuz.com pm2[13387]: [PM2][ERROR] No processes saved; DUMP file doesn't exist
Mar 26 06:04:28 kolab.linuxbuz.com pm2[13387]: ? PM2+ activated | Instance Name: node.myserver.tld-109e | Dash: https://app.pm2.io/#/r/7p66twg
Mar 26 06:04:28 kolab.linuxbuz.com pm2[13387]: ????????????????????????????????????????????????????????????????????????????????????????????????
Mar 26 06:04:28 kolab.linuxbuz.com pm2[13387]: ? id ? name ? namespace ? version ? mode ? pid ? uptime ? ? ? status ? cpu
Mar 26 06:04:28 kolab.linuxbuz.com pm2[13387]: ????????????????????????????????????????????????????????????????????????????????????????????????
Mar 26 06:04:28 kolab.linuxbuz.com pm2[13387]: ? 0 ? app ? default ? N/A ? fork ? 13202 ? 8m ? 0 ? online ? 0%
Mar 26 06:04:28 kolab.linuxbuz.com pm2[13387]: ????????????????????????????????????????????????????????????????????????????????????????????????
Mar 26 06:04:28 kolab.linuxbuz.com systemd[1]: Started PM2 process manager.
配置 Nginx 作为 Node.js 的反向代理
此时,您的 Node.js 应用程序正在运行并在本地主机上侦听。接下来,您需要将 Nginx 配置为 Node.js 应用程序的前端代理服务器,以便任何用户都可以通过互联网访问您的应用程序。
首先,使用以下命令安装 Nginx Web 服务器:
apt-get install nginx -y
安装后,为 Node.js 应用程序创建一个 Nginx 虚拟主机配置文件:
nano /etc/nginx/sites-enabled/myapp.conf
添加以下内容:
server {
listen 80;
server_name node.myserver.tld;
location / {
proxy_pass http://127.0.0.1:8000;
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;
}
}
完成后保存并关闭文件。然后,重新启动 Nginx 服务器以应用更改:
systemctl restart nginx
您可以使用以下命令验证 Nginx 服务的状态:
systemctl status nginx
您应该看到以下输出:
? nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2020-03-25 12:42:49 UTC; 5min ago
Docs: man:nginx(8)
Process: 26180 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
Process: 26182 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
Main PID: 26183 (nginx)
Tasks: 3 (limit: 2359)
Memory: 5.5M
CGroup: /system.slice/nginx.service
??26183 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
??26184 nginx: worker process
??26185 nginx: worker process
Mar 25 12:42:49 debian10 systemd[1]: Starting A high performance web server and a reverse proxy server...
Mar 25 12:42:49 debian10 systemd[1]: Started A high performance web server and a reverse proxy server.
完成后,您可以继续下一步。
访问您的 Node.js 应用程序
此时,Nginx 已配置为为您的 Node.js 应用程序提供服务。
现在,打开您的 Web 浏览器并输入 URL http://node.myserver.tld。您应该会在以下屏幕中看到您的 Node.js 应用程序:

结论
在上面的文章中,您学习了如何在 Debian 10 上设置 Node.js 应用程序。您还学习了如何将 Node.js 应用程序作为守护进程运行,并将 Nginx 配置为反向代理来为应用程序提供服务。我希望您现在可以轻松地在生产环境中托管您的 Node.js 应用程序。