如何在 Ubuntu 中配置 Node.js 和 MongoDB 以用于生产环境





5.00/5 (6投票s)
设置 Node.js 和 MongoDB 后端,然后让应用程序启动并运行可能具有挑战性。本教程将帮助您使整个过程更轻松。
开发人员在使用 Node 环境时面临的最大挑战之一是生产阶段。经过数天甚至数周的开发,您希望生产和部署尽可能简单,只需运行几个命令即可启动并运行。但在现实生活中,事情比这更困难。在本教程中,我们将涵盖您在 Ubuntu 上设置 Node.js 和 MongoDB 所需了解的一切。同时还会讨论一些生产的最佳实践。
引言
多年来,JavaScript 已发展成为一种不仅仅在浏览器中运行的语言。它现在被积极用于运行服务器、渲染服务器端代码、支持数据库等。使用 Node.js 和 Express 的 JavaScript 服务器是开始使用全栈 JavaScript 解决方案的流行选择。一些流行的 JavaScript 堆栈包括 MEAN(包括 MongoDB、Express.js、Angular 和 Node.js)以及与之密切相关的 MERN 堆栈(用 React 替换 Angular)。
无论您的堆栈是什么,在生产环境中设置 Node.js/Express 和 MongoDB 最初可能会很困难。因此,我们将尝试在 Ubuntu 16.04 LTS 上配置 Node.js 和 MongoDB,以便您可以在 AWS 或 DigitalOcean 上运行的服务器上复制这些步骤。但是,在开始之前,请确保您已安装、更新并配置了一个非 root sudo
用户。
设置 Node.js
我们应该安装 Node.js 的长期支持版本,在撰写本教程时,它是 v8.x.x。我们将从 NodeSource 下载 node 包存档和设置脚本。确保您位于主目录中,然后按以下方式下载脚本
curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
PPA 将使用 nodejs 存储库进行更新。您现在可以通过运行以下命令来安装 nodejs
sudo apt-get install -y nodejs
nodejs 包包含 node.js 和 npm。但是,您可能需要为某些 npm 包安装额外的开发工具。
sudo apt-get install build-essential
创建 MongoDB 后端
虽然您可以直接从 Ubuntu 存储库安装 MongoDB,但其中提供的 mongodb
包不是由 MongoDB 团队正式维护的。相反,您应该按照以下步骤安装 mongodb-org
社区版。
以下是安装 MongoDB 后端需要遵循的步骤
- 导入 Ubuntu 的包管理系统使用的 MongoDB 的 GPG 密钥。
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10
- 创建一个 /etc/apt/sources.list.d/mongodb.list 文件。
echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' | sudo tee /etc/apt/sources.list.d/mongodb.list
- 更新存储库,然后安装最新版本的 MongoDB。
sudo apt-get update sudo apt-get install mongodb-10gen
如果您使用的是 AWS,EC2 实例可以配置 EBS 进行存储。为了获得最佳性能,官方文档建议为数据、日志和日志使用单独的卷。建议使用 EBS 来维护 mongodb 备份,然后您可以随时恢复它们。
配置 MongoDB
我列出了使用 EBS 卷需要遵循的步骤。
# Create an EBS filesystem
sudo mkfs -t ext4 /dev/xvdb
# Create a directory for the mountpoint.
# mkdir <mount point>
mkdir /database
# To make the volume mount on boot, add a fstab entry
echo '/dev/xvdb /database ext4 defaults,auto,noatime,noexec 0 0' | sudo tee -a /etc/fstab
# Mount the database
sudo mount /dev/xvdb /database
# Create directories for data, journal and logs.
# I am going to place them under a single volumen
cd /database
mkdir data journal log
# Set the ownership of these directories to mongodb
sudo chown -R mongodb:mongodb /database
接下来,您需要配置 MongoDB 以使用 dbpath
和 logpath
。为此,您需要编辑 /etc/mongodb.conf 文件并添加以下内容
dbpath = /database/data
logpath = /database/log/mongodb.log
通过运行以下命令来启动 mongod 服务
sudo service mongod start
创建 Node.js 应用程序
要创建新应用程序,首先创建一个新目录,然后运行 npm init
为您的应用程序创建 package.json。
mkdir demo_app && cd demo_app
npm init
将入口点设置为 index.js。
您需要安装 Express.js 作为服务器,以及 mongoose 驱动程序用于节点。使用 npm
安装依赖项。
npm install express mongoose --save
您可以通过将其设置为可执行文件然后运行它来验证应用程序是否正常工作。
现在像这样编辑 index.js 文件
const express = require('express')
const app = express()
app.get('/', (req, res) => res.send('App is running successfully on port 3000'))
app.listen(3000, () => console.log('Example app listening on port 3000!'))
var db = Mongoose.connect('mongodb://:27017/dbname', function(error){
if(error) console.log(error);
console.log("connection successful");
});
您可以通过将其设置为可执行文件然后运行它来验证应用程序是否正常工作。
chmod +x ./index.js./index.js
您应该会看到以下输出
App is running successfully on port 3000.
使用 PM2 管理应用程序
当您在生产环境中运行应用程序时,应用程序可能会失败、遇到错误然后崩溃。拥有一个进程管理器可以帮助您避免这种情况。尽管还有许多其他进程管理器,如 foreverjs、systemd 和 Strongloop,但 PM2 脱颖而出。它提供了关于运行时性能和资源消耗的额外见解。
如果您还没有安装 PM2,请全局安装它。
sudo npm install -g pm2
pm2 start index.js 命令应该会启动应用程序并将其添加到 PM2 的进程列表中。您应该会在命令行中看到类似这样的内容
Output:
┌──────────┬────┬──────┬──────┬────────┬───────────┬────────┬────────────┬──────────┐
│ App name │ id │ mode │ PID │ status │ restarted │ uptime │ memory │ watching │
├──────────┼────┼──────┼──────┼────────┼───────────┼────────┼────────────┼──────────┤
│ index │ 0 │ fork │ 5871 │ online │ 0 │ 0s │ 9.012 MB │ disabled │
└──────────┴────┴──────┴──────┴────────┴───────────┴────────┴────────────┴──────────┘
PM2 为我们的应用程序分配了一个名称、一个 ID 和一个专用线程。如果应用程序在某个阶段崩溃,PM2 会保证应用程序重新启动。但是,要在系统启动时使应用程序正常工作,您需要执行其他步骤。
您可以使用 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 mjm --hp /home/mjm
替换最后一行中所有 mjm 实例为您的用户名并运行命令。
sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2
startup systemd -u <username> --hp /home/<username>
该命令将创建一个 systemd
配置文件,该文件将在启动时执行 pm2
。您可以通过运行以下命令来检查您用户 pm2
配置文件的状态
systemctl status pm2-mjm
使用 NGINX 作为反向代理服务器
我们目前在 localhost 上运行。要使应用程序能够被外部访问,我们将需要使用一个服务器作为反向代理。Nginx 是最流行的 Web 服务器应用程序之一,绝对适合此目的。我将假设您已经安装了 nginx。如果没有,请访问 nginx 文档获取指导。
完成之后,打开您的 nginx 配置文件。根据您的设置,该文件可能位于 /usr/local/nginx/conf、/etc/nginx 或 /usr/local/etc/nginx。
打开文件,然后在 server 块中找到一个 location 块。将其内容替换为以下代码
location / {
proxy_pass https://:3000;
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 服务器,一切应该都可以正常工作。
验证配置文件是否在语法上正确。
sudo nginx -t
现在,重新启动 nginx。
sudo systemctl restart nginx
为 nginx 添加加密
您可以使用 Let's Encrypt 免费加密您的网站,它提供免费的 SSL/TLS 证书。James Johnes 在 “如何在 Nginx 中安装 Let's Encrypt 并自动化续订” 的另一篇教程中已经涵盖了这一点。
如果您严格按照这些步骤进行操作,那么我们的示例 node.js 应用程序应该已经启动并运行。
结论
在本教程中,我们介绍了使用 Ubuntu 部署 Node 和 MongoDB 后端的步骤。我们创建了一个 Express 服务器,然后使用 Nginx 对其进行反向代理。我们还介绍了一些最佳实践,以避免常见陷阱。
如果您对为生产环境设置 Node.js 有任何想法,请通过评论告诉我们。