在 Ubuntu VPS 上安装 MongoDB — 初学者 NoSQL 数据库

如果您需要一个存储类 JSON 文档、支持水平扩展、适合 Node.js、实时服务或 IoT 等现代应用的数据库——MongoDB 是全球最受欢迎的 NoSQL 数据库,为 Discord、eBay 和 Adobe 提供支持。

本指南将带您完成在 Ubuntu 22.04 上安装 MongoDB Community Edition 7.0 的全过程,从添加官方仓库到启用身份验证、创建用户、允许远程连接,以及使用 mongodump 进行备份。

前提条件:Ubuntu 22.04 VPS,至少 2 GB 内存(MongoDB 比 MySQL/PostgreSQL 消耗更多内存),sudo 权限,以及 22 端口上的 SSH 访问。

什么是 MongoDB——文档数据库的工作原理

MongoDB 以 BSON(二进制 JSON)格式存储数据。每条记录称为"文档",文档存放在"集合"中(相当于 NoSQL 中的 SQL 表)。同一集合中的文档无需具有相同结构——您可以随时动态添加字段,无需执行 ALTER TABLE。

MongoDB 与 MySQL——如何选择?

对比项MongoDBMySQL
数据结构文档(BSON / JSON)表(行 / 列)
模式灵活——可随时添加字段固定——需要 ALTER TABLE
查询方式类 JSON(find、aggregate)标准 SQL
事务支持v4.0 起支持多文档事务InnoDB 完整 ACID 支持
最适合实时应用、CMS、IoT、移动后端通用网站、ERP、财务系统

第一步——添加 MongoDB 官方仓库

Ubuntu 默认仓库中的 MongoDB 版本较旧;官方仓库可提供 v7.0。首先导入 GPG 密钥:

sudo apt update && sudo apt install -y gnupg curl
curl -fsSL https://www.mongodb.org/static/pgp/server-7.0.asc | \
  sudo gpg -o /usr/share/keyrings/mongodb-server-7.0.gpg --dearmor

为 Ubuntu 22.04(Jammy)添加 MongoDB 7.0 源列表:

echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-7.0.gpg ] https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/7.0 multiverse" | \
  sudo tee /etc/apt/sources.list.d/mongodb-org-7.0.list

第二步——安装并启动 MongoDB

sudo apt update
sudo apt install -y mongodb-org
sudo systemctl start mongod
sudo systemctl enable mongod
sudo systemctl status mongod

若状态显示 active (running),则安装成功。打开 Shell:

mongosh

您应看到类似 test> 的提示符。列出现有数据库:

show dbs

第三步——启用身份验证(关键步骤)

MongoDB 默认不启用身份验证。在投入生产前必须启用。首先创建管理员用户:

mongosh
use admin
db.createUser({
  user: "adminUser",
  pwd: "StrongAdminPassword!",
  roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]
})
exit

编辑 MongoDB 配置文件:

sudo nano /etc/mongod.conf

添加(或修改)security 节:

security:
  authorization: enabled

重启以应用更改:

sudo systemctl restart mongod

使用管理员用户重新登录:

mongosh -u adminUser -p --authenticationDatabase admin

第四步——创建数据库与应用用户

切勿在应用中使用管理员用户。请为每个数据库单独创建用户:

use myapp_db
db.createUser({
  user: "myapp",
  pwd: "AppPassword123!",
  roles: [ { role: "readWrite", db: "myapp_db" } ]
})

测试登录:

mongosh -u myapp -p --authenticationDatabase myapp_db myapp_db

第五步——允许远程连接

MongoDB 默认仅绑定到 127.0.0.1。要接受外部客户端,请编辑 /etc/mongod.conf 中的 bindIp:

net:
  port: 27017
  bindIp: 0.0.0.0   # listen on every interface — pair with a firewall!

⚠️ 危险:bindIp: 0.0.0.0 会将 MongoDB 暴露给整个互联网。您必须启用防火墙并限制来源 IP,并且必须先完成第三步的身份验证配置。

通过 UFW 限制访问:

sudo ufw allow from YOUR_APP_IP to any port 27017

第六步——使用 mongodump 备份

MongoDB 内置 mongodump 用于备份:

mongodump --uri="mongodb://myapp:[email protected]:27017/myapp_db" \
  --out=/backup/mongo_$(date +%F)

从备份恢复:

mongorestore --uri="mongodb://myapp:[email protected]:27017/myapp_db" \
  --drop /backup/mongo_2026-05-15/myapp_db

提示:通过 cron 设置每晚定时运行 mongodump,并使用 rclone 将结果上传至 S3 或 Google Drive,实现异地安全备份。

为生产环境调优 Ubuntu VPS 上的 MongoDB

安装 MongoDB 并启用身份验证后,在真实流量到来之前还有几项配置值得关注——尤其是 WiredTiger 缓存、磁盘、交换空间和日志。MongoDB 比典型 SQL 数据库消耗更多内存,配置不当可能触发 OOM(内存溢出)事件,导致内核在运行中途杀死 mongod。

默认情况下,MongoDB 将 WiredTiger 缓存设置为 50% 内存减去 1 GB。在与 Nginx、PHP-FPM 或 Node.js 共享内存的小型 VPS 上,应手动限制缓存大小,防止 MongoDB 耗尽其他服务的内存。打开 /etc/mongod.conf,在 storage 节下添加:

storage:
  wiredTiger:
    engineConfig:
      cacheSizeGB: 1.0   # cap cache at 1GB on a 2GB-RAM VPS

对于低内存 VPS,添加交换空间以应对高负载查询,并禁用透明大页(THP)——MongoDB 建议关闭此功能,因为它会导致延迟峰值:

sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

提示:在 mongosh 中使用 db.serverStatus().wiredTiger.cache 查看 MongoDB 实际内存使用量,或使用 htop 监控整个系统。若缓存持续满载,考虑升级 VPS 内存。

创建索引以加速查询

与 SQL 一样,拥有大量文档但没有索引的集合会迫使 find() 执行全集合扫描,读取每一个文档,随着数据增长速度越来越慢。使用 explain() 找出慢查询:

db.users.find({ email: "[email protected]" }).explain("executionStats")

若看到 COLLSCAN,说明该字段尚无索引。添加索引:

db.users.createIndex({ email: 1 }, { unique: true })
db.orders.createIndex({ userId: 1, createdAt: -1 })   # compound index
db.users.getIndexes()                                 # list all indexes

经验法则:仅为频繁查询或排序的字段创建索引。每个索引都会占用磁盘空间,并略微降低插入和更新速度,因此不要为每个字段都预先创建索引。

MongoDB 与 SQL 的选择时机

MongoDB 并非在所有场景下都优于 MySQL/PostgreSQL——各自适合不同类型的工作负载。一开始选错方向会导致日后出现尴尬的变通方案或痛苦的迁移。应根据数据结构和应用的查询模式来决定。

选择 MongoDB 的场景

选择 SQL(MySQL / PostgreSQL)的场景

实际应用:许多系统同时使用两者——SQL 处理核心事务数据(用户、订单、财务),MongoDB 处理日志、动态流或灵活模式内容。只要内存足够,单台 VPS 可同时运行两者。

mongosh 常用命令

安装后检查清单

  1. 从官方仓库安装(而非 Ubuntu 默认仓库)以获取最新版本
  2. 立即启用 authorization: enabled——生产环境绝不可无身份验证运行
  3. 为每个数据库创建独立用户——应用中绝不使用管理员用户
  4. 若开放远程访问,必须通过 UFW 限制来源 IP
  5. 设置每日定时 mongodump 并将备份传至异地
  6. 监控磁盘使用量——MongoDB 比 MySQL 消耗更多磁盘空间

常见问题解答

MongoDB 在 VPS 上需要多少内存?

测试或小型网站从 2 GB 开始即可,但 MongoDB 比 MySQL 消耗更多内存,因为 WiredTiger 缓存会尽力将工作数据集保存在内存中。随着数据增长或并发查询增加,建议使用 4 GB 或更多——并在配置中限制 cacheSizeGB,防止 MongoDB 耗尽 VPS 上其他服务的内存。AsiaGB VPS 每月起价 500 泰铢,SSD 存储,内存规格自由选择。

MongoDB 和 MySQL 能在同一台 VPS 上运行吗?

可以,而且非常常见。许多系统将 MySQL 用于核心事务数据,将 MongoDB 用于日志或灵活模式内容。它们运行在不同端口(MySQL 3306,MongoDB 27017),互不冲突,但需确保 VPS 内存足够两者使用,并合理设置 MongoDB 的 cacheSizeGB,避免相互争抢内存。

忘记 MongoDB 管理员密码怎么办?

停止 mongod,编辑 /etc/mongod.conf 临时禁用 authorization: enabled,重启后无密码进入 mongosh。然后运行 db.changeUserPassword("adminUser","NewPassword") 设置新密码,重新启用身份验证并再次重启。在禁用身份验证期间,请先将 bindIp 改回 127.0.0.1 或通过防火墙关闭远程访问。

在数据库使用中可以用 mongodump 备份吗?

可以——mongodump 在不停止服务的情况下在线读取数据。不过对于大型高写入量数据库,快照可能不完全一致;如需精确的时间点备份,请使用带 --oplog 的副本集或文件系统快照。对于普通网站,每晚定时 mongodump 并传至异地已完全足够。

需要可靠的 VPS 运行 MongoDB?

AsiaGB Linux VPS,SSD 存储,每月起价 500 泰铢。充足内存支持 MongoDB,完整 Root 权限,提供泰国 / 新加坡数据中心。

查看 VPS 套餐

查看泰国VPS主机全部套餐 →