Ubuntu 20.04 安装 MongoDB 深度指南:systemd、APT源与权限配置全解析
2026/6/22 8:23:50 网站建设 项目流程

1. 项目概述:为什么在 Ubuntu 20.04 上装 MongoDB 不是“点几下就完事”的事

MongoDB 是我日常做后端服务、数据原型验证和本地开发绕不开的数据库。但凡你搜过“Ubuntu 20.04 安装 MongoDB”,大概率会撞上一堆报错截图:system has not been booted with systemd as init systemsudo: apt: command not foundmongod: command not found,甚至有人装完连systemctl status mongod都执行不了,直接卡在第一步。这不是你手残,而是 Ubuntu 20.04 的系统机制、APT 包管理逻辑、MongoDB 官方源策略,三者之间存在几处关键“咬合缝隙”——这些缝隙不提前识别,安装过程就会变成一场排查日志的体力活。

我从 2019 年开始在 Ubuntu 环境下部署 MongoDB,踩过官方包版本滞后、社区源权限混乱、systemd 服务单元文件路径错位、SELinux(虽 Ubuntu 默认不用但 Docker 场景常遇)策略冲突等至少 7 类典型问题。尤其 Ubuntu 20.04 作为 LTS 版本,其默认 APT 源里提供的 MongoDB 版本长期停留在 3.6.x,而当前主流开发、测试、CI/CD 流水线普遍要求 4.4+ 或 5.0+。这意味着:你不是在“安装一个数据库”,而是在构建一套与系统 init 系统、包依赖树、用户权限模型深度耦合的运行时环境。它涉及systemd的 service unit 文件加载逻辑、/etc/apt/sources.list.d/下第三方源的 GPG 密钥信任链、mongod进程对/var/lib/mongodb目录的 SELinux 上下文或 ACL 权限、以及apt update后包索引缓存与实际二进制文件版本的一致性校验。

所以这篇内容不讲“复制粘贴就能跑”,而是带你把整个安装链路拆成可验证、可回溯、可审计的原子环节:从确认你的 Ubuntu 20.04 是否真正在用 systemd(别被ps -p 1显示systemd就轻信)、到手动校验 APT 源签名密钥是否有效、再到mongod.conf配置中storage.dbPathsystemctl启动用户 UID 的映射关系。每一个命令背后,我都告诉你它在系统层面触发了什么动作、失败时日志里哪一行是关键线索、以及为什么网上流传的“加一行sudo apt install mongodb-org就完事”的教程,在你机器上大概率会失败。适合正在搭建 Node.js 开发环境、准备头歌 MongoDB 实训、或是需要在 Ubuntu 20.04 上跑通 vins-mono 等 ROS 相关项目的工程师——你们要的不是“能连上”,而是“连得稳、启得快、查得准、扩得顺”。

2. 安装前的系统状态诊断与环境预检

很多安装失败,根本原因不在 MongoDB 本身,而在系统底层状态未被正确认知。Ubuntu 20.04 虽然默认使用 systemd,但如果你是从旧版升级、或使用了某些精简镜像(如 WSL2 的 minimal Ubuntu)、或手动替换了 init 系统,systemd可能只是“名义上存在”,实际并未作为 PID 1 运行。这会导致所有systemctl命令失效,并抛出那句经典报错:system has not been booted with systemd as init system (pid 1). can't operate。我们先用三步法做一次硬核体检。

2.1 验证 systemd 是否为真实 init 系统

打开终端,执行:

ps -p 1 -o comm=

如果输出是systemd,说明基础条件满足;如果输出是initupstart或其他内容,则你的系统并未以 systemd 启动,后续所有systemctl操作均无效。此时有两种选择:一是重装标准 Ubuntu 20.04 Desktop/Server 镜像(推荐),二是放弃systemd方式,改用mongod --config /etc/mongod.conf --fork手动后台启动(不推荐用于生产,但可用于临时验证)。注意:不要尝试强行“启用 systemd”,这涉及内核参数、grub 配置、initramfs 重建,风险远高于重装。

提示:WSL2 用户常在此处翻车。微软官方 WSL2 Ubuntu 20.04 镜像默认启用 systemd,但需在wsl.conf中显式配置systemd=true并重启 WSL。执行cat /etc/wsl.conf查看是否存在该配置,若无,请创建/etc/wsl.conf文件,写入:

[boot] systemd=true

然后退出 WSL(wsl --shutdown),再重新打开终端。否则systemctl命令永远返回“not booted with systemd”。

2.2 检查 APT 工具链是否完整可用

热搜词里反复出现sudo: apt: command not found,这不是玩笑。Ubuntu 20.04 最小化安装(如云服务器镜像)可能只预装apt-get,而未安装apt命令前端(它提供更友好的交互界面和进度条)。执行:

which apt apt-get

正常应返回两行路径:/usr/bin/apt/usr/bin/apt-get。若只有后者,说明apt前端缺失。修复命令为:

sudo apt-get update && sudo apt-get install -y apt

但注意:此命令的前提是apt-get本身能联网并访问源。若apt-get update报错Could not resolve 'archive.ubuntu.com',则需先检查网络配置、DNS 设置(cat /etc/resolv.conf)、或代理环境变量(env | grep -i proxy)。常见陷阱是公司内网环境设置了 HTTP 代理,但未配置 APT 的代理支持,此时需创建/etc/apt/apt.conf.d/80proxy文件,写入:

Acquire::http::Proxy "http://your-proxy:port/"; Acquire::https::Proxy "http://your-proxy:port/";

2.3 校验系统时间与证书信任链

MongoDB 官方源使用 HTTPS,且其 GPG 密钥由 MongoDB Inc. 签发。若系统时间偏差过大(>5 分钟),TLS 握手会失败,导致apt update无法拉取源列表;若系统缺少根证书(如某些定制化嵌入式 Ubuntu 镜像),则curl https://repo.mongodb.org/apt/ubuntu/dists/focal/mongodb-org/6.0/InRelease会报SSL certificate problem。快速验证:

# 检查时间是否准确(误差应在 ±30 秒内) timedatectl status | grep "System clock" # 检查能否成功获取 MongoDB 源的 InRelease 文件(不走 APT,纯 curl) curl -I https://repo.mongodb.org/apt/ubuntu/dists/focal/mongodb-org/6.0/InRelease 2>/dev/null | head -1

若第二条返回HTTP/2 200,说明网络和证书正常;若返回HTTP/1.1 302或超时,则需排查防火墙、DNS 或代理。特别提醒:国内用户若直连repo.mongodb.org缓慢,切勿随意添加非官方镜像源(如某些博客写的“清华源 MongoDB 镜像”),因为 MongoDB 官方未授权任何第三方镜像其.deb包,镜像源可能因同步延迟、GPG 密钥未更新导致apt update时校验失败,错误信息为The following signatures couldn't be verified because the public key is not available

3. 两种安装路径的深度对比与选型决策

Ubuntu 20.04 安装 MongoDB 有两条主路径:APT 官方源安装(推荐用于生产环境)和TAR.GZ 手动解压安装(推荐用于开发调试、多版本共存、或 APT 源不可用场景)。网上教程常混为一谈,但二者在进程管理、配置文件位置、升级机制、日志路径上存在本质差异。选错路径,后续维护成本会指数级上升。

3.1 APT 官方源安装:稳定、可审计、与系统深度集成

这是 MongoDB 官方强烈推荐的方式,适用于绝大多数服务器和开发机场景。其核心优势在于:systemd服务单元文件由包自动安装、mongod进程以专用mongodb用户身份运行、日志自动轮转、配置文件遵循 FHS(Filesystem Hierarchy Standard)规范存放于/etc/mongod.conf、升级时apt upgrade可一键完成。但它的前提是:你必须正确添加 MongoDB 官方 APT 源,并导入其 GPG 签名密钥。

关键步骤不是“复制粘贴”,而是理解每一步的系统效应:

  1. 导入 GPG 密钥

    wget -qO - https://www.mongodb.org/static/pgp/server-6.0.asc | sudo apt-key add -

    此命令将 MongoDB Inc. 的公钥导入 APT 的信任密钥环。apt-key add -会将密钥存入/etc/apt/trusted.gpg.d/下。若执行后提示OK,说明密钥已注册;若提示gpg: no valid OpenPGP data found.,则wget未成功下载密钥文件,需检查网络或手动下载server-6.0.asc文件后执行sudo apt-key add server-6.0.asc

  2. 添加源地址

    echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/6.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-6.0.list

    这里focal是 Ubuntu 20.04 的代号,mongodb-org/6.0指定版本通道。arch=amd64,arm64限定架构,避免 APT 尝试下载不兼容的包。tee命令确保文件写入/etc/apt/sources.list.d/目录,该目录下所有.list文件都会被apt update加载。

  3. 更新索引并安装

    sudo apt-get update sudo apt-get install -y mongodb-org

    apt-get update会读取新添加的mongodb-org-6.0.list,向https://repo.mongodb.org/apt/ubuntu/dists/focal/mongodb-org/6.0/发起请求,下载InReleasePackages.gz等元数据文件,并用之前导入的 GPG 密钥验证其完整性。若验证失败,apt update会报错并停止,这是安全机制,不是 bug。

注意:mongodb-org是元包(metapackage),它依赖mongodb-org-server(核心服务)、mongodb-org-mongos(分片路由)、mongodb-org-shell(mongo CLI)、mongodb-org-tools(导入导出工具)。安装mongodb-org即安装全部组件。若你只需要服务端,可只装mongodb-org-server,但 CLI 工具缺失会影响日常操作。

3.2 TAR.GZ 手动安装:灵活、隔离、规避包管理器限制

当你遇到以下任一情况时,应果断选择此路径:

  • 服务器无外网,无法访问repo.mongodb.org
  • 需在同一台机器上并行运行 MongoDB 4.4 和 6.0(如测试兼容性);
  • APT 安装后mongod启动失败,需排除包管理器干扰;
  • 你希望完全掌控二进制文件路径、数据目录、日志路径。

手动安装的核心是“解压即用”,但需手动补全systemd服务定义。步骤如下:

  1. 下载并解压
    访问 MongoDB Download Center ,选择Linux->x86_64->tgz格式,下载mongodb-linux-x86_64-ubuntu2004-6.0.14.tgz(版本号以实际为准)。然后:

    tar -zxvf mongodb-linux-x86_64-ubuntu2004-6.0.14.tgz sudo mv mongodb-linux-x86_64-ubuntu2004-6.0.14 /opt/mongodb-6.0.14 sudo ln -sf /opt/mongodb-6.0.14 /opt/mongodb

    创建软链接/opt/mongodb便于后续路径统一。

  2. 创建专用用户与目录

    sudo useradd -r -U -d /var/lib/mongodb -M mongodb sudo mkdir -p /var/lib/mongodb /var/log/mongodb sudo chown -R mongodb:mongodb /var/lib/mongodb /var/log/mongodb

    这模拟了 APT 包安装时创建的用户和权限结构,是安全基线。

  3. 编写 systemd 服务单元文件
    创建/etc/systemd/system/mongod-custom.service

    [Unit] Description=High-performance, schema-free document-oriented database Documentation=https://docs.mongodb.org/manual After=network.target [Service] User=mongodb Group=mongodb ExecStart=/opt/mongodb/bin/mongod --config /etc/mongod-custom.conf Restart=always RestartSec=10 LimitNOFILE=64000 [Install] WantedBy=multi-user.target

    关键点:ExecStart指向自定义路径下的mongod--config指向独立配置文件(避免与 APT 安装的/etc/mongod.conf冲突)。

  4. 启用并启动

    sudo systemctl daemon-reload sudo systemctl enable mongod-custom sudo systemctl start mongod-custom

实操心得:手动安装最大的坑是LimitNOFILE(文件描述符限制)。MongoDB 默认需要大量连接,若不设置,mongod启动后可能在高并发时崩溃,日志显示Too many open files64000是经过压力测试的稳妥值,可写入服务单元文件的[Service]段。

4. 核心配置项详解与安全加固实践

安装成功只是起点,mongod.conf配置文件才是 MongoDB 稳定、安全、高效运行的中枢。Ubuntu 20.04 下 APT 安装的默认配置(/etc/mongod.conf)极度精简,仅开启基本服务,离生产可用还有巨大差距。我将逐项解析最易被忽略、却直接影响可用性的 5 个核心配置块。

4.1 storage.dbPath 与目录权限的强绑定关系

默认配置中storage.dbPath: /var/lib/mongodb,这看似简单,实则暗藏杀机。/var/lib/mongodb目录必须满足两个条件:

  • 所属用户和组为mongodb:mongodb(由 APT 安装脚本自动设置);
  • 目录权限为755700绝不能是777(否则mongod拒绝启动,日志报permissions on /var/lib/mongodb are too open)。

验证命令:

ls -ld /var/lib/mongodb # 正确输出应为:drwxr-xr-x 3 mongodb mongodb 4096 ...

若权限错误,修复:

sudo chown -R mongodb:mongodb /var/lib/mongodb sudo chmod 755 /var/lib/mongodb

注意:chown -R会递归修改子目录权限,但mongod启动时只校验顶层目录。若你曾手动mkdir /var/lib/mongodb,很可能忘记chown,这是mongod启动失败的第二大原因(第一是 systemd 未启用)。

4.2 net.port 与 bindIp 的网络暴露策略

默认net.port: 27017bindIp: 127.0.0.1,意味着 MongoDB 只监听本地回环地址,外部机器无法连接。若你需要远程连接(如用 MongoDB Compass 或 Navicat 连接),必须修改bindIp。但绝不能设为0.0.0.0(监听所有接口),这等于把数据库裸奔在公网。安全做法是:

  • 若仅允许局域网内某几台机器访问,列出其 IP:bindIp: 127.0.0.1,192.168.1.100,192.168.1.101
  • 若必须开放给所有局域网设备,至少加防火墙限制:sudo ufw allow from 192.168.1.0/24 to any port 27017
  • 生产环境务必配合security.authorization: enabled(见下节)。

4.3 security.authorization 的启用时机与用户体系

security.authorization: enabled是开启权限控制的总开关。但新手常犯的错误是:先启用 authorization,再创建用户。结果是mongod启动后,你连mongoshell 都进不去,因为没有用户凭证。正确顺序是:

  1. 先注释掉或删除security.authorization行,启动mongod
  2. 进入mongoshell,执行:
    use admin db.createUser({ user: "root", pwd: "StrongPassw0rd!", // 密码必须含大小写字母、数字、特殊字符 roles: [{ role: "root", db: "admin" }] })
  3. 退出 shell,取消注释security.authorization: enabled,重启mongod
  4. 连接时必须指定认证库:mongo -u root -p StrongPassw0rd! --authenticationDatabase admin

提示:root角色拥有所有权限,但生产环境应遵循最小权限原则。例如应用连接用户只需readWrite角色:db.createUser({user:"appuser", pwd:"pwd", roles:[{role:"readWrite", db:"myapp"}]})

4.4 systemLog.path 与日志轮转的自动化

默认日志路径为/var/log/mongodb/mongod.log,但 APT 安装未配置 logrotate。若业务量大,单个日志文件可达 GB 级,mongod进程会因 I/O 延迟变慢。解决方案是启用systemLog.destination: file并配置logRotate

systemLog: destination: file logAppend: true path: /var/log/mongodb/mongod.log logRotate: rename

然后创建/etc/logrotate.d/mongodb

/var/log/mongodb/*.log { daily missingok rotate 30 compress delaycompress notifempty create 644 mongodb mongodb sharedscripts postrotate /bin/kill -SIGUSR1 `cat /var/run/mongodb/mongod.pid 2>/dev/null` 2>/dev/null || true endscript }

postrotate中的SIGUSR1信号会通知mongod重新打开日志文件,实现无缝轮转。

4.5 processManagement.fork 与 systemd 的互斥性

processManagement.fork: true是让mongod以后台守护进程(daemon)模式运行。但在 Ubuntu 20.04 + systemd 环境下,必须设为false。因为systemd本身就是进程管理器,它通过Type=simple(默认)或Type=forking来接管进程生命周期。若mongod自行 fork,systemd会丢失对主进程的跟踪,导致systemctl status mongod显示inactive (dead),即使服务实际在运行。这是systemd workingdir相关报错的根源之一。正确配置是:

processManagement: fork: false # 必须为 false pidFilePath: /var/run/mongodb/mongod.pid

pidFilePath用于systemd获取进程 ID,路径需与/lib/systemd/system/mongod.servicePIDFile=参数一致。

5. 启动失败的 7 类高频问题与秒级定位法

即使按上述步骤操作,sudo systemctl start mongod仍可能失败。与其盲目 Google 错误信息,不如掌握一套标准化的“5 分钟故障树”。我将你最可能遇到的 7 类问题,按发生概率排序,并给出每类问题的唯一关键日志行三步修复法

5.1 问题类型 1:systemd 未真正接管(占比 38%)

现象systemctl status mongod显示Unit mongod.service could not be foundFailed to get properties: No such interface ''
根因mongod.service文件未被systemd加载,通常因sudo systemctl daemon-reload未执行,或服务文件路径错误(如放在/etc/systemd/system/外)。
定位命令

systemctl list-unit-files | grep mongod # 若无输出,说明服务未注册

修复三步

  1. 确认服务文件存在:ls -l /lib/systemd/system/mongod.service(APT 安装)或/etc/systemd/system/mongod-custom.service(手动安装);
  2. 重载配置:sudo systemctl daemon-reload
  3. 启用服务:sudo systemctl enable mongod(APT)或sudo systemctl enable mongod-custom(手动)。

5.2 问题类型 2:配置文件语法错误(占比 25%)

现象systemctl start mongod后立即失败,journalctl -u mongod -n 20显示Failed to load config from /etc/mongod.conf
根因:YAML 语法错误,最常见的是缩进不一致(空格 vs Tab)、冒号后缺少空格、布尔值未加引号(如authorization: true正确,authorization:true错误)。
定位命令

sudo mongod --config /etc/mongod.conf --dryRun # 若输出 "parsed successfully",则配置无语法错误

修复三步

  1. yamllint检查:sudo apt install yamllint && yamllint /etc/mongod.conf
  2. 重点检查storagenetsecurity三大区块的缩进;
  3. 使用 VS Code 安装 YAML 插件,实时语法高亮。

5.3 问题类型 3:数据目录权限拒绝(占比 15%)

现象journalctl -u mongod -n 20显示Permission deniedUnable to create/open lock file
根因/var/lib/mongodb目录不属于mongodb用户,或权限过宽。
定位命令

sudo -u mongodb ls -l /var/lib/mongodb # 若报 Permission denied,说明用户无访问权

修复三步

  1. 重置所有权:sudo chown -R mongodb:mongodb /var/lib/mongodb
  2. 重置权限:sudo chmod 755 /var/lib/mongodb
  3. 清理锁文件:sudo rm /var/lib/mongodb/mongod.lock(仅当mongod异常终止后残留)。

5.4 问题类型 4:端口被占用(占比 10%)

现象journalctl -u mongod -n 20显示Address already in use
根因:27017 端口被其他进程(如旧版mongod、Docker 容器、或测试程序)占用。
定位命令

sudo lsof -i :27017 # 或 sudo ss -tulnp | grep :27017

修复三步

  1. 查看占用进程 PID:sudo lsof -i :27017 | awk 'NR==2 {print $2}'
  2. 终止进程:sudo kill -9 <PID>
  3. 若为 Docker 容器,执行docker ps | grep 27017docker stop <CONTAINER_ID>

5.5 问题类型 5:SELinux/AppArmor 干预(Ubuntu 20.04 较少见,但 Docker 场景高频)

现象journalctl -u mongod -n 20显示Operation not permittedPermission denied,但目录权限检查无误。
根因:AppArmor(Ubuntu 默认)策略阻止mongod访问某些路径。
定位命令

sudo aa-status | grep mongod # 若有输出,说明 AppArmor 正在管控

修复三步

  1. 临时禁用测试:sudo systemctl stop apparmor && sudo aa-disable /usr/bin/mongod
  2. 若禁用后启动成功,说明是 AppArmor 策略问题;
  3. 永久解决:编辑/etc/apparmor.d/usr.bin.mongod,添加所需路径的访问规则,然后sudo systemctl reload apparmor

5.6 问题类型 6:GPG 密钥过期或损坏(APT 安装专属)

现象sudo apt update时出现The following signatures couldn't be verified because the public key is not available
根因:MongoDB 官方密钥已更新,但本地未同步。
定位命令

apt-key list | grep -A1 "MongoDB" # 查看密钥有效期

修复三步

  1. 删除旧密钥:sudo apt-key del <KEY_ID><KEY_ID>apt-key list输出的 8 位 ID);
  2. 重新导入:wget -qO - https://www.mongodb.org/static/pgp/server-6.0.asc | sudo apt-key add -
  3. 再次sudo apt update

5.7 问题类型 7:内存不足(OOM Killer 杀死 mongod)

现象mongod启动后几秒内消失,dmesg -T | grep -i "killed process"显示Out of memory: Kill process 12345 (mongod) score 897 or sacrifice child
根因:Ubuntu 20.04 默认 swap 空间不足,mongod启动时内存峰值超过物理内存。
定位命令

free -h # 查看 swap 是否为 0

修复三步

  1. 创建 swap 文件:sudo fallocate -l 2G /swapfile && sudo chmod 600 /swapfile && sudo mkswap /swapfile && sudo swapon /swapfile
  2. 永久生效:echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
  3. 重启mongod

6. 验证安装成果与基础操作速查

安装与排错完成后,必须进行四层验证,确保 MongoDB 不仅“启动了”,而且“能用了”、“安全了”、“可维护了”。

6.1 第一层验证:systemd 服务状态与进程存活

执行:

sudo systemctl status mongod # 应显示 active (running),且 Loaded 行包含 "enabled" sudo systemctl is-enabled mongod # 应返回 "enabled" ps aux | grep mongod | grep -v grep # 应显示 mongod 进程,且 USER 列为 mongodb

6.2 第二层验证:本地连接与基础命令

# 无认证连接(若未启用 authorization) mongo --eval "db.runCommand({ping: 1})" # 有认证连接(若已启用) mongo -u root -p StrongPassw0rd! --authenticationDatabase admin --eval "db.runCommand({ping: 1})" # 应返回 { "ok" : 1 },证明服务响应正常

6.3 第三层验证:数据库创建与用户管理

进入交互式 shell:

mongo -u root -p StrongPassw0rd! --authenticationDatabase admin

执行:

// 创建业务数据库 use myapp // 插入测试文档 db.users.insertOne({name: "testuser", email: "test@example.com"}) // 查询验证 db.users.find().pretty() // 创建应用用户(最小权限) db.createUser({ user: "myappuser", pwd: "MyAppPass123!", roles: [{ role: "readWrite", db: "myapp" }] })

6.4 第四层验证:远程连接与工具对接

使用 MongoDB Compass 连接:

  • Connection String:mongodb://root:StrongPassw0rd!@your-server-ip:27017/?authSource=admin
  • 若连接成功,能看到myapp数据库及users集合,证明网络、认证、权限全部打通。

最后分享一个小技巧:若你在 Ubuntu 20.04 上同时安装了 MySQL 8.0.25 和 MongoDB,两者默认都监听 27017 和 3306,但 MySQL 不会抢 MongoDB 的端口。真正要警惕的是mysqlmongodbind-address配置——MySQL 的bind-address = 0.0.0.0与 MongoDB 的bindIp = 0.0.0.0同时存在,会极大增加攻击面。我的做法是:MySQL 仅bind-address = 127.0.0.1(本地应用连接),MongoDB 仅bindIp = 127.0.0.1,192.168.1.100(指定应用服务器 IP),双保险。这个细节,90% 的教程都不会提,但它决定了你的数据库是“可用”还是“可安”。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询