如何使用nginx、forever和crontab在单个VPS上托管多个Node.js应用程序
遵循本教程的要求
您需要安装 nginx 和 Node.js,并且在 DigitalOcean 上已经有关于这些主题的编写良好的教程:
此外,您应该已经拥有一个域,以便将正在运行的 Node.js 服务映射到一个域名,而不是导航到 http://[your-vps-ip]:[port]。
使用 Forever 运行您的 Node.js 应用程序
Forever 是一个简单的命令行工具,用于确保 Node.js 应用程序连续运行(即 永远)。 这意味着如果您的应用程序遇到错误并崩溃,永远会处理此问题并为您重新启动它。
只需在全球范围内永久安装,并且可以在几秒钟内永久使用:
npm install forever -g
要永久启动脚本,您需要执行以下步骤:
导航到您的 Node.js 应用程序:
cd /path/to/your/node/app/
并永远运行服务器/主 JavaScript 文件:
forever start --spinSleepTime 10000 main.js
其中 --spinSleepTime 10000
是指启动崩溃脚本之间的最短正常运行时间(以毫秒为单位)。 该命令几乎适用于所有情况。
现在将您的浏览器指向 http://[your-vps-ip]:[port] 并查看您的应用程序正在运行。
将域映射到您的 Node.js 应用程序
现在您需要在 DigitalOcean 控制面板中添加 DNS 记录,以将您的域名映射到您的 Droplet (VPS)。
要遵循的步骤是:
- 登录 DigitalOcean.com
- 点击左侧边栏中的“DNS”部分
- 通过单击“添加域”按钮添加域,选择您选择的 VPS 并在“名称”字段中输入您注册的域名
- 复制 DigitalOcean 提供的域名服务器(例如 NS1.DIGITALOCEAN.COM .) 并将每一项添加到域名注册商控制面板中的 DNS 记录中。
注意:更改不会立即生效,因为 DNS 最多可能需要 24 小时才能传播。
使用 nginx 将域映射到在您的 VPS 上运行的服务
在本节中,您将学习如何通过几个简单的步骤使用 nginx 设置 反向代理 。
首先,使用您喜欢的编辑器(我将使用 nano)在 /etc/nginx/conf.d/ 中为您想要的域创建一个文件。 出于一致性原因,该文件应以域名命名。
nano /etc/nginx/conf.d/example.com.conf
注意:您可以随意调用文件,重要的部分是 .conf
扩展名。
在此文件中,您需要复制以下代码片段并将其粘贴到之前创建的文件中:
server { listen 80; server_name your-domain.com; location / { proxy_pass http://localhost:{YOUR_PORT}; 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; } }
现在只需将 your-domain.com
替换为您注册的域,将 YOUR_PORT
替换为您的 Node.js 应用程序在您的 VPS 上监听的端口。
注意:为了能够为一个 Node.js 应用程序引用多个域(如 www.example.com 和 example.com),您需要将以下代码添加到文件 [ http
部分中的 X171X]:
server_names_hash_bucket_size 64;
如果 DNS 更改被传播,您可以将 Web 浏览器指向您的域,您应该会看到您的应用程序正在运行,可以从 Internet 访问。
在重启时重启你的 Node.js 应用
Forever 在崩溃时保持应用程序运行等方面非常有用。 但是当 VPS 重新启动时会发生什么?
这是一个简单的 cronjob 可以防止您的应用程序和用户意外停机的地方。
在应用程序的主文件夹中创建一个名为 starter.sh
的文件并复制以下代码:
#!/bin/sh if [ $(ps -e -o uid,cmd | grep $UID | grep node | grep -v grep | wc -l | tr -s "\n") -eq 0 ] then export PATH=/usr/local/bin:$PATH forever start --sourceDir /path/to/your/node/app main.js >> /path/to/log.txt 2>&1 fi
其中 main.js
应替换为应用程序的主脚本。
这个有用的片段取自here
要在每次重新启动时启动此脚本,您需要使用以下命令编辑 crontab:
crontab -e
并将以下代码附加到此文件
@reboot /path/to/starter.sh
现在设置 starter.sh 文件的绝对路径。
提示:导航到 starter.sh 文件所在的位置,并使用 pwd
打印当前目录。
对您的每个域/服务重复上述步骤。