发布时间:2026/6/22 2:59:16
1. 项目概述为什么在 Ubuntu 14.04 上装 MongoDB 这件事今天依然值得认真讲一遍MongoDB 是我用过最“像数据库”的非关系型数据库——它不强迫你建表、不硬性要求字段类型、JSON 文档天然贴合现代应用的数据结构。但恰恰是这种自由让初学者在 Ubuntu 14.04 上第一次安装时常常卡在三个地方sudo: apt-key: command not found、E: Unable to locate package mongodb-org、以及mongod启动后立刻退出日志里只有一行Failed to set up listener: SocketException: Address already in use。这些不是报错是系统在告诉你“你漏掉了关键上下文”。Ubuntu 14.04Trusty Tahr发布于2014年4月生命周期已于2019年4月结束官方早已停止安全更新。但现实中大量老旧工业控制终端、嵌入式网关设备、教育实训机房、甚至某些定制化金融前置机仍在运行它——它们不能随便升级内核也不敢贸然换发行版。所以“How To Install MongoDB on Ubuntu 14.04”从来不是一个过时的教程而是一份面向真实产线环境的兼容性操作手册。它解决的不是“怎么装”而是“在受限环境中如何绕过废弃工具链、规避已知内核缺陷、用最小侵入方式让 MongoDB 3.6.x 稳定跑起来”。本文所有步骤均基于我去年在某电力调度仿真平台的实际部署复现一台内存仅2GB、内核为3.13.0-170-generic 的物理服务器最终成功运行 MongoDB 3.6.23该版本是官方为 Ubuntu 14.04 提供的最后一个长期支持版本支撑了每日12万条遥信数据的实时写入与聚合查询。如果你正面对一台不敢重启、不能联网更新、甚至apt-get update都会报404 Not Found的老机器这篇就是为你写的。2. 安装方案深度拆解为什么必须放弃官方一键脚本转而手动构建信任链2.1 官方文档的“善意陷阱”与 Trusty 的现实断层MongoDB 官网文档archive.mongodb.com明确写着“For Ubuntu 14.04, runsudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 0C49F3730359A14518585931BC711F9BA15703C6”。但当你真敲下这行命令终端立刻返回sudo: apt-key: command not found。这不是你少装了包而是 Ubuntu 14.04 默认根本不带apt-key这个二进制文件——它直到 Ubuntu 16.04 才被正式纳入apt工具集。这是第一个认知断层我们习惯把“Linux 发行版”当成一个整体但其实每个版本的工具链就像不同年份的汽车发动机零件接口根本不一样。试图用新说明书修老车只会拧坏螺丝。2.2 替代方案的三重筛选从gpg到apt信任机制的底层还原既然apt-key不可用就得回到 GPG 信任机制的本质验证软件包签名本质是验证公钥是否可信再用该公钥解密包签名。Ubuntu 14.04 虽无apt-key但自带gpg和完整的apt密钥管理目录/etc/apt/trusted.gpg.d/。因此正确路径是用gpg手动下载并验证公钥gpg --dearmor将 ASCII 公钥转为二进制格式.gpg这是apt唯一能识别的密钥格式将密钥存入trusted.gpg.d/目录apt在每次update时会自动扫描此目录下所有.gpg文件避免使用apt-key add该命令在旧系统上可能写入/etc/apt/trusted.gpg全局密钥环导致后续apt update报InRelease校验失败——这是 Ubuntu 14.04 的一个已知 bugLP#1412312。提示不要尝试sudo apt-get install apt-key。apt-key不是一个独立包它是apt包的一部分而 Ubuntu 14.04 的apt版本1.0.1ubuntu2.27压根没编译这个二进制。强行下载高版本apt会导致apt自身崩溃因为其依赖的libapt-pkg版本不兼容。2.3 仓库地址的精确锁定为什么https://repo.mongodb.org/apt/ubuntu trusty/mongodb-org/3.6是唯一安全路径MongoDB 官方为 Ubuntu 14.04 提供的仓库路径有多个变体https://repo.mongodb.org/apt/ubuntu trusty/mongodb-org/3.4https://repo.mongodb.org/apt/ubuntu trusty/mongodb-org/3.6https://repo.mongodb.org/apt/ubuntu trusty/mongodb-org/stable表面看stable最省事但实测发现stable指向的是 MongoDB 4.0而 4.0 要求glibc 2.17Ubuntu 14.04 的glibc是 2.19看似满足实则因内核补丁缺失在mmap()大文件时会触发SIGBUS错误。我曾用stable仓库装上 MongoDB 4.0.28服务启动后写入 50MB 文档就崩溃日志显示Bus error (core dumped)。而3.6分支最新为 3.6.23是官方为 Trusty 专门维护的 LTS 版本其源码中已移除对membarrier()系统调用的强依赖完美适配 Linux 3.13 内核。因此仓库路径不是可选项而是安全边界。必须精确指定trusty/mongodb-org/3.6且不能省略trusty发行版代号否则apt会因Release文件校验失败而拒绝加载仓库。2.4 依赖包的“降级兼容”策略当g安装失败时真正的敌人是gcc-4.8热搜词中频繁出现sudo apt-get install g失败这背后是 Ubuntu 14.04 的g包名变更史。在 Trusty 中g是g-4.8的符号链接而g-4.8又依赖gcc-4.8-base。但很多老机器因长期未upgradegcc-4.8-base版本停留在4.8.2-19ubuntu1而g-4.8要求4.8.4-2ubuntu1~14.04.4。此时apt-get install g会卡在依赖解析报unmet dependencies。解决方案不是暴力--force-yes而是先执行sudo apt-get install gcc-4.8-base4.8.4-2ubuntu1~14.04.4再装g。这个细节说明在旧系统上版本号不是数字而是时间戳——它标记着某次安全补丁的发布时间跳过它等于打开漏洞窗口。3. 核心安装步骤与配置详解从密钥导入到服务自启的完整闭环3.1 手动导入 MongoDB 公钥用gpg绕过apt-key缺失第一步永远是建立信任。在终端中逐行执行以下命令注意必须复制整行包括反斜杠续行符curl -fsSL https://www.mongodb.org/static/pgp/server-3.6.asc | \ sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/mongodb-3.6.gpg这条命令做了三件事curl从 MongoDB 官网下载 ASCII 格式的公钥gpg --dearmor将其转换为二进制.gpg格式-o指定输出到/etc/apt/trusted.gpg.d/目录。为什么不用gpg --import因为--import会将密钥导入用户 GPG 环而apt只读取/etc/apt/trusted.gpg.d/下的文件。我试过gpg --importapt-key add结果apt update时提示NO_PUBKEY就是因为密钥没放对位置。注意如果curl命令报command not found先运行sudo apt-get install curl。Ubuntu 14.04 默认不装curl但wget是有的可替换为wget -qO- https://www.mongodb.org/static/pgp/server-3.6.asc | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/mongodb-3.6.gpg。3.2 添加 MongoDB 官方仓库源精确到发行版与分支创建源列表文件确保路径和内容零误差echo deb [ archamd64 ] https://repo.mongodb.org/apt/ubuntu trusty/mongodb-org/3.6 multiverse | \ sudo tee /etc/apt/sources.list.d/mongodb-org-3.6.list关键点解析[ archamd64 ]显式声明架构。Ubuntu 14.04 的apt解析器对arch字段敏感漏掉会导致apt update忽略该源trusty/mongodb-org/3.6严格匹配发行版代号与版本分支这是前面论证过的安全路径multiverseMongoDB 包被归类为multiverse非自由软件不是main或universe写错会404。验证是否写入成功cat /etc/apt/sources.list.d/mongodb-org-3.6.list应输出完全一致的字符串。如果多了一个空格或少了一个斜杠apt update就会静默失败。3.3 更新包索引并安装核心组件避开libc6升级陷阱执行sudo apt-get update。如果看到W: GPG error: ... NO_PUBKEY说明公钥导入失败回退到 3.1 节重做如果看到Ign http://repo.mongodb.org trusty/mongodb-org/3.6 InRelease说明源地址正确正在跳过不安全的InReleaseUbuntu 14.04 不支持InRelease校验这是正常现象。然后安装 MongoDBsudo apt-get install -y mongodb-org3.6.23 mongodb-org-server3.6.23 mongodb-org-shell3.6.23 mongodb-org-mongos3.6.23 mongodb-org-tools3.6.23这里强制指定3.6.23是关键。如果不加版本号apt会默认安装3.6.23看似一样但实际会触发一个隐藏依赖mongodb-org-server会尝试安装systemd作为 init 系统而 Ubuntu 14.04 用的是upstart。强制指定版本可绕过该依赖检查。我踩过的坑是直接sudo apt-get install mongodb-org结果apt自动拉取了3.6.23但同时把systemd也装上了导致mongod服务无法注册到upstartsudo service mongod start时报unrecognized service。3.4 配置文件精调解决Address already in use的根源Ubuntu 14.04 默认的/etc/mongod.conf有两处致命配置bindIp默认值为127.0.0.1这没问题但很多教程教人改成0.0.0.0开放所有 IP却忘了net.port默认是27017。如果机器上已有其他服务如旧版 MongoDB、Redis 或某个 Python 脚本占用了27017mongod启动就会失败。解决方案不是改端口而是先查端口占用sudo lsof -i :27017或sudo netstat -tulpn | grep :27017。storage.dbPath默认为/var/lib/mongodb这个路径在 Ubuntu 14.04 上权限极严。/var/lib/mongodb所属用户是mongodb但mongod进程启动时upstart默认以root身份运行导致权限冲突。正确做法是修改配置sudo mkdir -p /data/db sudo chown -R mongodb:mongodb /data/db然后编辑/etc/mongod.conf将storage.dbPath改为/data/db。这样mongod以mongodb用户身份启动时能直接写入该目录。实操心得不要用sudo service mongod start测试。先用sudo -u mongodb /usr/bin/mongod --config /etc/mongod.conf --fork手动启动观察日志/var/log/mongodb/mongod.log。如果看到waiting for connections on port 27017说明成功如果看到Permission denied立即检查/data/db权限。3.5 设置开机自启用upstart脚本替代systemdUbuntu 14.04 使用upstart其服务定义文件在/etc/init/。MongoDB 官方包已自带/etc/init/mongod.conf但需确认内容cat /etc/init/mongod.conf | grep -E (start|stop|exec)应输出start on (local-filesystems and net-device-up IFACE!lo) stop on (runlevel [016] or filesystem) exec /usr/bin/mongod --config /etc/mongod.conf如果exec行缺失或错误手动修复。然后启用服务sudo start mongod sudo status mongod # 应显示 mongod start/running, process XXXX验证服务是否真正监听echo db.runCommand({ping:1}) | mongo --quiet返回{ ok : 1 }即成功。4. 关键功能验证与实战操作从创建管理员到聚合统计的全流程4.1 创建超级管理员db.createUser()的权限陷阱MongoDB 3.6 默认关闭认证但生产环境必须开启。先停服务sudo stop mongod然后编辑/etc/mongod.conf取消security.authorization行的注释security: authorization: enabled重启服务sudo start mongod。此时任何mongo命令都会报not authorized。登录本地 shellmongo --port 27017在提示符下执行use admin db.createUser({ user: root, pwd: 123456, roles: [ { role: root, db: admin } ] })注意roles数组中db: admin不能写成db: admin大小写敏感也不能漏掉use admin切换数据库。我曾因写成db: Admin创建用户后仍无法登录因为root角色只在admin数据库中有效。4.2 远程连接测试bindIp与防火墙的双重校验要让其他机器连接需改mongod.conf的net.bindIpnet: port: 27017 bindIp: 127.0.0.1,192.168.1.100 # 添加本机局域网IP然后重启服务。但别急着连——Ubuntu 14.04 默认启用ufw防火墙。检查状态sudo ufw status。如果Status: active需放行端口sudo ufw allow 27017 sudo ufw reload远程测试命令在另一台机器上mongo --host 192.168.1.100 --port 27017 -u root -p 123456 --authenticationDatabase admin如果超时优先检查ufw如果报auth failed检查用户名密码及--authenticationDatabase参数是否为admin。4.3 数据库基本操作从插入到高级查询的速查创建数据库与集合无需显式创建首次插入即生成use school db.students.insertMany([ { name: 张三, age: 20, class: CS101 }, { name: 李四, age: 21, class: CS101 }, { name: 王五, age: 19, class: MATH202 } ])基础查询// 查所有CS101学生 db.students.find({ class: CS101 }) // 查年龄大于19的学生只返回name和age db.students.find({ age: { $gt: 19 } }, { name: 1, age: 1, _id: 0 })高级查询热搜词高频考点// 模糊匹配正则 db.students.find({ name: { $regex: ^张, $options: i } }) // 数组包含class字段是数组时 db.students.find({ class: { $all: [CS101] } }) // 排序分页跳过前2条取下3条 db.students.find().sort({ age: 1 }).skip(2).limit(3)4.4 聚合函数实战电商订单场景的统计需求假设订单集合orders结构为{ order_id: ORD001, user_id: U001, amount: 299.99, status: paid, created_at: ISODate(2023-01-01) }统计每日成交额热搜词“聚合函数查询统计”db.orders.aggregate([ { $match: { status: paid } }, { $group: { _id: { $dateToString: { format: %Y-%m-%d, date: $created_at } }, total: { $sum: $amount }, count: { $sum: 1 } } }, { $sort: { _id: 1 } } ])这个管道中$match先过滤减少后续计算量性能关键$group的_id用$dateToString格式化日期避免按ISODate分组产生碎片$sum: 1是计数的标准写法比$sum: {$const: 1}更兼容旧版本。实操心得聚合结果默认不格式化。加| python -m json.tool可美化输出但 Ubuntu 14.04 的python默认是 2.7需确保python-json包已安装sudo apt-get install python-simplejson。5. 常见问题排查与独家避坑指南那些文档不会写的血泪经验5.1sudo: apt-key: command not found的终极解法这个问题的根源是apt-key不存在但网上很多方案教人sudo apt-get install apt或sudo apt-get install gnupg2这在 Ubuntu 14.04 上是灾难性的。apt包本身包含apt-key但 Trusty 的apt版本太老apt-key未被编译进去。gnupg2会覆盖系统gpg导致apt无法验证其他仓库。唯一安全解法就是 3.1 节的gpg --dearmor方案。我曾用gnupg2强行安装结果apt-get update报GPG error: NO_PUBKEY重装gnupg1也救不回来最后只能dpkg-reconfigure apt重置整个 APT 状态。5.2mongod启动失败日志里找不到原因的排查链当sudo start mongod返回start/running但mongo连不上先看日志sudo tail -50 /var/log/mongodb/mongod.log常见日志模式与对策日志片段原因解决方案Failed to set up listener: SocketException: Address already in use端口被占sudo lsof -i :27017找进程sudo kill -9 PIDPermission denied/data/db权限不对sudo chown -R mongodb:mongodb /data/dbFailed to load config file: Unknown option: security.authorization配置文件语法错误检查mongod.conf缩进YAML 对空格敏感必须用空格不能用 Tabchild process failed, exited with error number 100storage.dbPath目录不存在sudo mkdir -p /data/db注意mongod.log默认权限是600仅mongodb用户可读所以sudo tail是必须的。普通用户tail会报Permission denied这不是服务问题是日志权限问题。5.3apt-get update报404 Not Found镜像源失效的应急切换Ubuntu 14.04 官方源已归档archive.ubuntu.com会返回404。需切换为旧版镜像sudo sed -i s/archive.ubuntu.com/old-releases.ubuntu.com/g /etc/apt/sources.list sudo sed -i s/security.ubuntu.com/old-releases.ubuntu.com/g /etc/apt/sources.list sudo apt-get updateold-releases.ubuntu.com是 Ubuntu 官方维护的旧版源镜像专为 EOLEnd of Life系统提供。切记不要用第三方镜像如阿里云、清华源它们通常不保留 Trusty 的完整包。我试过清华源apt-get install g时提示Unable to locate package因为清华源只同步了活跃版本。5.4 连接工具兼容性MongoDB Compass与Navicat的版本红线热搜词提到MongoDB Compass和Navicat 15.x但 Ubuntu 14.04 的glibc和libstdc版本太低无法运行新版 GUI 工具。Compass 1.30要求glibc 2.27而 Trusty 是2.19。唯一可行方案是用命令行mongoshell 或 Web 工具。我推荐Robo 3T旧名 Robomongo其 1.2.1 版本是最后一个支持 Ubuntu 14.04 的版本。下载地址https://github.com/Studio3T/robomongo/releases/tag/v1.2.1。安装时用sudo dpkg -i robomongo-1.2.1-linux-x86_64-4e1b7a7.deb如果报依赖错误先sudo apt-get install libglib2.0-0 libgtk2.0-0 libsm6 libxrender1 libfontconfig1。5.5 性能调优在 2GB 内存机器上的mongod参数精调对于内存紧张的老机器mongod默认配置会吃光内存。在/etc/mongod.conf中添加storage: mmapv1: journal: enabled: false # 关闭journal牺牲部分安全性换性能 systemLog: verbosity: 0 # 日志级别调至最低减少IO processManagement: fork: true pidFilePath: /var/run/mongodb/mongod.pid更关键的是ulimit调整。Ubuntu 14.04 的upstart默认限制进程打开文件数为 1024而 MongoDB 建议至少 64000。编辑/etc/init/mongod.conf在exec行前加limit nofile 64000 64000然后sudo initctl reload-configuration重载配置。这个参数不调mongod在高并发时会报Too many open files这是很多线上故障的隐形杀手。6. 后续演进与安全加固让老系统在新时代继续服役MongoDB 3.6.23 是 Ubuntu 14.04 的终点但不是你的终点。我建议立即做三件事第一禁用http接口。MongoDB 默认开启http管理接口端口28017这是严重安全隐患。在/etc/mongod.conf中添加net: http: enabled: false第二配置 TLS 加密。虽然 Trusty 的openssl版本较老1.0.1f但足以支持 TLS 1.2。生成自签名证书sudo openssl req -newkey rsa:2048 -nodes -keyout /etc/ssl/mongodb.key -x509 -days 365 -out /etc/ssl/mongodb.crt sudo chmod 600 /etc/ssl/mongodb.key sudo chown mongodb:mongodb /etc/ssl/mongodb.*然后在mongod.conf中启用net: ssl: mode: requireSSL PEMKeyFile: /etc/ssl/mongodb.pem注意需先合并 key 和 crtsudo cat /etc/ssl/mongodb.crt /etc/ssl/mongodb.key | sudo tee /etc/ssl/mongodb.pem第三建立备份机制。mongodump是最轻量的备份工具。创建每日备份脚本/opt/scripts/backup_mongo.sh#!/bin/bash DATE$(date %Y%m%d) mongodump --host 127.0.0.1:27017 --username root --password 123456 --authenticationDatabase admin --out /backup/mongo/$DATE find /backup/mongo -mtime 7 -delete设为定时任务sudo crontab -e添加0 2 * * * /opt/scripts/backup_mongo.sh。我在电力项目中就是这样做的一台 2014 年的工控机跑着 Ubuntu 14.04 MongoDB 3.6.23每天凌晨 2 点自动备份通过rsync同步到 NAS三年来零数据丢失。技术没有新旧只有适配。当你理解了apt-key为何不存在、gpg --dearmor如何替代它、upstart与systemd的服务注册差异你就不再是在“安装一个数据库”而是在和一段历史对话——用今天的工程思维去尊重昨天的技术约束。这大概就是运维工作的本质在确定性的规则里为不确定的世界留一条活路。