Wie man MongoDB auf einem VPS installiert und konfiguriert (Vollständige Anleitung)
MongoDB ist eine dokumentenorientierte NoSQL-Datenbank, die Datensätze als BSON (Binary JSON)-Dokumente speichert und eine schemafreie Datenmodellierung mit horizontaler Skalierbarkeit durch natives Sharding ermöglicht. Im Gegensatz zu relationalen Datenbanken erfordert MongoDB kein vordefiniertes Tabellenschema, was es zur dominanten Wahl für Anwendungen mit sich entwickelnden Datenstrukturen, hohem Schreibdurchsatz oder hierarchischen Datenbeziehungen macht.
Dieser Leitfaden führt durch eine produktionsreife MongoDB-Bereitstellung auf einem Linux VPS — einschließlich Installation aus dem offiziellen Repository, Authentifizierungshärtung, Netzwerkzugangskontrolle, TLS-Konfiguration, Leistungsoptimierung und Backup-Automatisierung. Jeder Schritt setzt voraus, dass Sie in einer echten Serverumgebung arbeiten, in der Sicherheit und Zuverlässigkeit nicht verhandelbar sind.
Voraussetzungen
Bestätigen Sie vor dem Fortfahren Folgendes:
- Ein VPS mit Ubuntu 20.04 LTS oder Ubuntu 22.04 LTS (Befehle sind für beide identisch)
- Root- oder
sudo-privilegierter Benutzerzugriff über SSH - Mindestens 2 GB RAM (4 GB empfohlen für Produktions-Workloads)
- Mindestens 20 GB verfügbarer Festplattenspeicher auf einem schnellen Speichervolume
- UFW oder iptables für die Firewall-Verwaltung verfügbar
- Grundlegende Vertrautheit mit der Linux-Befehlszeile
> Architekturhinweis: MongoDBs WiredTiger-Speicher-Engine verwendet einen standardmäßigen internen Cache von 50% von (RAM – 1 GB). Auf einem 2 GB VPS ergibt das etwa 512 MB Cache. Für leseintensive Workloads sollten Sie mindestens 4 GB RAM bereitstellen, um konstante Festplatten-I/O durch Cache-Druck zu vermeiden.
MongoDB vs. andere NoSQL-Datenbanken: Kurzvergleich
| Merkmal | MongoDB | Redis | Cassandra | CouchDB |
|---|---|---|---|---|
| Datenmodell | Dokument (BSON) | Schlüssel-Wert | Wide-Column | Dokument (JSON) |
| Abfragesprache | MQL (umfangreiche Abfragen) | Befehle | CQL | Mango / MapReduce |
| Horizontale Skalierung | Natives Sharding | Cluster-Modus | Nativ | Multi-Master |
| ACID-Transaktionen | Ja (v4.0+, Multi-Dokument) | Teilweise (Lua-Skripte) | Leichtgewichtig | Ja |
| Bester Anwendungsfall | Allzweck-Apps, APIs | Caching, Sitzungen | Zeitreihen, IoT | Offline-First-Synchronisierung |
| Festplattenpersistenz | Primärspeicher | Optional (RDB/AOF) | Primärspeicher | Primärspeicher |
| Volltextsuche | Atlas Search / Textindex | Begrenzt | Nein | Begrenzt |
Schritt 1: System aktualisieren
Beginnen Sie immer mit einem vollständig gepatchten System. Veraltete Pakete führen bekannte CVEs ein, die ausgenutzt werden können, bevor Sie Ihren Anwendungs-Stack überhaupt installieren.
sudo apt update && sudo apt upgrade -yStarten Sie nach der Anwendung von Kernel- oder libc-Updates neu, um den neuen Kernel zu aktivieren:
sudo rebootVerbinden Sie sich nach dem Neustart des Servers über SSH erneut (typischerweise 30–60 Sekunden).
Schritt 2: MongoDB aus dem offiziellen Repository installieren
Ubuntus Standard-apt-Repositories liefern eine veraltete, community-neu-verpackte Version von MongoDB, der aktuelle Sicherheits-Patches und Engine-Verbesserungen fehlen. Installieren Sie immer aus MongoDBs offiziellem Repository.
MongoDB GPG-Schlüssel und Repository hinzufügen
Der apt-key-Befehl ist auf Ubuntu 22.04 veraltet. Verwenden Sie die empfohlene Keyring-Methode, die sowohl auf 20.04 als auch auf 22.04 funktioniert:
curl -fsSL https://www.mongodb.org/static/pgp/server-7.0.asc |
sudo gpg --dearmor -o /usr/share/keyrings/mongodb-server-7.0.gpgFügen Sie den offiziellen Repository-Eintrag hinzu:
echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-7.0.gpg ]
https://repo.mongodb.org/apt/ubuntu $(lsb_release -cs)/mongodb-org/7.0 multiverse" |
sudo tee /etc/apt/sources.list.d/mongodb-org-7.0.list> Versionshinweis: Ersetzen Sie 7.0 durch Ihr Ziel-Release (z.B. 6.0), wenn Sie eine bestimmte Version für die Anwendungskompatibilität benötigen. MongoDB 7.0 ist das aktuelle Long-Term-Support-Release ab 2024.
MongoDB-Pakete installieren
sudo apt update
sudo apt install -y mongodb-orgDies installiert die folgenden Komponenten:
mongod — der primäre Datenbank-Daemon
mongos — der Sharding-Router (verwendet in Sharded-Cluster-Bereitstellungen)
mongosh — die moderne MongoDB Shell (ersetzt das veraltete mongo-Binary)
mongodb-database-tools — enthält mongodump, mongorestore, mongoexport und mongoimportInstallierte Version fixieren
Verhindern Sie unbeabsichtigte Upgrades, die die Anwendungskompatibilität beeinträchtigen könnten:
echo "mongodb-org hold" | sudo dpkg --set-selections
echo "mongodb-org-database hold" | sudo dpkg --set-selections
echo "mongodb-org-server hold" | sudo dpkg --set-selections
echo "mongosh hold" | sudo dpkg --set-selections
echo "mongodb-org-mongos hold" | sudo dpkg --set-selections
echo "mongodb-org-tools hold" | sudo dpkg --set-selectionsSchritt 3: Systemseitige Voraussetzungen konfigurieren
MongoDB funktioniert am besten, wenn bestimmte Kernel- und Dateisystemparameter vor dem Start des Daemons optimiert werden.
ulimit für offene Dateien festlegen
MongoDB benötigt ein hohes Dateideskriptor-Limit. Erstellen Sie eine systemd-Überschreibung:
sudo mkdir -p /etc/systemd/system/mongod.service.d
sudo tee /etc/systemd/system/mongod.service.d/limits.conf > /dev/null <<EOF
[Service]
LimitFNOFILE=64000
LimitNPROC=64000
EOFTransparent Huge Pages (THP) deaktivieren
THP verursacht erhebliche Latenzspitzen in MongoDB. Deaktivieren Sie es dauerhaft:
sudo tee /etc/systemd/system/disable-thp.service > /dev/null <<EOF
[Unit]
Description=Disable Transparent Huge Pages (THP)
DefaultDependencies=no
After=sysinit.target local-fs.target
Before=mongod.service
[Service]
Type=oneshot
ExecStart=/bin/sh -c 'echo never | tee /sys/kernel/mm/transparent_hugepage/enabled > /dev/null'
ExecStart=/bin/sh -c 'echo never | tee /sys/kernel/mm/transparent_hugepage/defrag > /dev/null'
[Install]
WantedBy=basic.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable --now disable-thpÜberprüfen Sie, ob die Einstellung wirksam wurde:
cat /sys/kernel/mm/transparent_hugepage/enabledDie Ausgabe sollte [never] als aktiven Wert anzeigen.
Schritt 4: MongoDB starten und aktivieren
sudo systemctl daemon-reload
sudo systemctl start mongod
sudo systemctl enable mongodBestätigen Sie, dass der Daemon läuft:
sudo systemctl status mongodSuchen Sie nach Active: active (running) in der Ausgabe. Wenn der Dienst nicht startet, überprüfen Sie sofort das Protokoll:
sudo tail -50 /var/log/mongodb/mongod.logHäufige Startfehler umfassen:
- Port 27017 bereits in Verwendung — ein anderer Prozess ist an den Port gebunden; identifizieren Sie ihn mit
sudo ss -tlnp | grep 27017 - Berechtigungen des Datenverzeichnisses — der
mongod-Benutzer muss/var/lib/mongodbbesitzen; beheben Sie dies mitsudo chown -R mongodb:mongodb /var/lib/mongodb - THP noch aktiviert — die WiredTiger-Engine protokolliert eine Warnung und kann die Leistung beeinträchtigen
Schritt 5: MongoDB absichern — Authentifizierung und Autorisierung
Dies ist der kritischste Abschnitt. Ungeschützte MongoDB-Instanzen, die dem Internet ausgesetzt sind, waren für Tausende von Datenpannen verantwortlich. Die Standardinstallation hat keine Authentifizierung, was bedeutet, dass jeder, der Port 27017 erreichen kann, vollen Lese-/Schreibzugriff auf jede Datenbank hat.
Den administrativen Benutzer erstellen
Verbinden Sie sich mit der lokalen MongoDB Shell (vor der Aktivierung ist keine Authentifizierung erforderlich):
mongoshWechseln Sie in der Shell zur admin-Datenbank und erstellen Sie einen Superuser:
use admin
db.createUser({
user: "adminuser",
pwd: passwordPrompt(),
roles: [
{ role: "userAdminAnyDatabase", db: "admin" },
{ role: "readWriteAnyDatabase", db: "admin" },
{ role: "dbAdminAnyDatabase", db: "admin" },
{ role: "clusterAdmin", db: "admin" }
]
})Die Verwendung von passwordPrompt() anstelle einer Klartextzeichenfolge verhindert, dass das Passwort in der Shell-Historie erscheint. Geben Sie das Passwort ein, wenn Sie dazu aufgefordert werden, und beenden Sie dann:
exitAuthentifizierung in mongod.conf aktivieren
Öffnen Sie die MongoDB-Konfigurationsdatei:
sudo nano /etc/mongod.confSuchen Sie den security-Abschnitt (er wird auskommentiert sein) und aktivieren Sie die Autorisierung:
security:
authorization: enabledSpeichern und beenden Sie (Ctrl+X, dann Y, dann Enter), dann starten Sie den Daemon neu:
sudo systemctl restart mongodÜberprüfen, ob Authentifizierung erzwungen wird
Versuchen Sie eine nicht authentifizierte Verbindung — sie sollte jetzt fehlschlagen:
mongosh --eval "db.adminCommand({ listDatabases: 1 })"Sie sollten einen Unauthorized-Fehler erhalten. Authentifizieren Sie sich nun ordnungsgemäß:
mongosh -u adminuser -p --authenticationDatabase adminAnwendungsspezifische Benutzer erstellen
Verwenden Sie niemals den Admin-Superuser für Anwendungsverbindungen. Erstellen Sie einen Benutzer mit minimalen Rechten für jede Anwendungsdatenbank:
use myappdb
db.createUser({
user: "appuser",
pwd: passwordPrompt(),
roles: [
{ role: "readWrite", db: "myappdb" }
]
})Schritt 6: Netzwerkbindung und Firewall-Regeln konfigurieren
bindIp einschränken oder erweitern
Standardmäßig bindet mongod.conf nur an 127.0.0.1. Dies ist die richtige Einstellung, wenn Ihre Anwendung auf demselben VPS läuft. Wenn Sie Remote-Zugriff benötigen (z.B. von einem Anwendungsserver auf einem separaten Host), bearbeiten Sie /etc/mongod.conf:
net:
port: 27017
bindIp: 127.0.0.1,10.0.0.5Ersetzen Sie 10.0.0.5 durch die spezifische private IP Ihres Anwendungsservers. Setzen Sie bindIp: 0.0.0.0 niemals auf einer öffentlich zugänglichen Schnittstelle ohne eine Firewall-Regel, die den Zugriff auf bekannte IPs einschränkt. Das Binden an alle Schnittstellen ohne Firewall ist die häufigste Ursache für MongoDB-Datenexpositionsvorfälle.
Starten Sie nach Änderungen neu:
sudo systemctl restart mongodUFW-Firewall-Regeln konfigurieren
Wenn Remote-Zugriff erforderlich ist, erlauben Sie nur die spezifische vertrauenswürdige IP:
sudo ufw allow from 10.0.0.5 to any port 27017 proto tcp
sudo ufw enable
sudo ufw status verboseBlockieren Sie allen anderen externen Zugriff auf Port 27017:
sudo ufw deny 27017UFW verarbeitet Regeln in der Reihenfolge — die spezifische allow from-Regel über der breiten deny-Regel hat Vorrang für die vertrauenswürdige IP.
Schritt 7: TLS/SSL für verschlüsselte Verbindungen aktivieren
Für jede Bereitstellung, bei der MongoDB-Datenverkehr ein Netzwerk überquert — selbst ein privates LAN — ist TLS-Verschlüsselung obligatorisch. Ohne sie werden Anmeldedaten und Daten im Klartext übertragen.
Generieren Sie ein selbstsigniertes Zertifikat zum Testen (verwenden Sie in der Produktion ein CA-signiertes Zertifikat — erwägen Sie die Kombination mit einem SSL-Zertifikat für Ihre Domain):
sudo mkdir -p /etc/mongodb/ssl
sudo openssl req -newkey rsa:4096 -nodes -keyout /etc/mongodb/ssl/mongodb.key
-x509 -days 365 -out /etc/mongodb/ssl/mongodb.crt
-subj "/CN=your-vps-hostname"
sudo cat /etc/mongodb/ssl/mongodb.crt /etc/mongodb/ssl/mongodb.key |
sudo tee /etc/mongodb/ssl/mongodb.pem > /dev/null
sudo chown -R mongodb:mongodb /etc/mongodb/ssl
sudo chmod 600 /etc/mongodb/ssl/mongodb.pemFügen Sie die TLS-Konfiguration zu /etc/mongod.conf hinzu:
net:
port: 27017
bindIp: 127.0.0.1
tls:
mode: requireTLS
certificateKeyFile: /etc/mongodb/ssl/mongodb.pemStarten Sie MongoDB neu und verbinden Sie sich mit TLS:
sudo systemctl restart mongod
mongosh --tls --tlsCertificateKeyFile /etc/mongodb/ssl/mongodb.pem
--tlsAllowInvalidCertificates -u adminuser -p --authenticationDatabase adminDas --tlsAllowInvalidCertificates-Flag ist nur für selbstsignierte Zertifikate in der Entwicklung akzeptabel. Entfernen Sie es, wenn Sie ein CA-signiertes Zertifikat verwenden.
Schritt 8: Leistungsoptimierung in mongod.conf
Für eine Produktionsbereitstellung auf einem VPS mit dedizierten Ressourcen optimieren Sie den WiredTiger-Cache und die Journaling-Einstellungen. Öffnen Sie /etc/mongod.conf und fügen Sie Folgendes hinzu oder ändern Sie es:
storage:
dbPath: /var/lib/mongodb
journal:
enabled: true
wiredTiger:
engineConfig:
cacheSizeGB: 1.5
operationProfiling:
slowOpThresholdMs: 100
mode: slowOp
replication:
oplogSizeMB: 1024Wichtige Optimierungsparameter erklärt:
cacheSizeGB— Setzen Sie dies auf ungefähr 50% des verfügbaren RAM minus 1 GB. Auf einem 4 GB VPS verwenden Sie1.5. Auf einem 8 GB VPS verwenden Sie3.5.slowOpThresholdMs— Abfragen, die diesen Schwellenwert (in Millisekunden) überschreiten, werden im Profiler protokolliert. Eine Absenkung hilft, nicht indizierte Abfragen frühzeitig zu identifizieren.oplogSizeMB— Relevant, wenn Sie später Replica-Set-Mitglieder hinzufügen möchten. Eine Vorausgrößenanpassung des Oplogs vermeidet Replikationsverzögerungen bei schreibintensiven Workloads.
Änderungen anwenden:
sudo systemctl restart mongodSchritt 9: Backup und Wiederherstellung mit mongodump
Manuelles Backup
mongodump
--uri="mongodb://adminuser:yourpassword@127.0.0.1:27017/?authSource=admin"
--out /var/backups/mongodb/$(date +%Y-%m-%d)Manuelle Wiederherstellung
mongorestore
--uri="mongodb://adminuser:yourpassword@127.0.0.1:27017/?authSource=admin"
/var/backups/mongodb/2024-06-15Backups mit Cron automatisieren
Erstellen Sie ein dediziertes Backup-Skript:
sudo tee /usr/local/bin/mongodb-backup.sh > /dev/null <<'EOF'
#!/bin/bash
BACKUP_DIR="/var/backups/mongodb"
TIMESTAMP=$(date +%Y-%m-%d_%H-%M-%S)
MONGO_URI="mongodb://adminuser:yourpassword@127.0.0.1:27017/?authSource=admin"
RETENTION_DAYS=7
mkdir -p "${BACKUP_DIR}/${TIMESTAMP}"
mongodump --uri="${MONGO_URI}" --out="${BACKUP_DIR}/${TIMESTAMP}"
find "${BACKUP_DIR}" -maxdepth 1 -type d -mtime +${RETENTION_DAYS} -exec rm -rf {} ;
EOF
sudo chmod +x /usr/local/bin/mongodb-backup.shPlanen Sie es täglich um 2:00 Uhr:
(crontab -l 2>/dev/null; echo "0 2 * * * /usr/local/bin/mongodb-backup.sh >> /var/log/mongodb-backup.log 2>&1") | crontab -> Produktionsüberlegung: Speichern Sie Backups außerhalb des Servers. Das Aufbewahren von Backups auf demselben VPS wie die Datenbank bietet keinen Schutz gegen Festplattenausfall oder Server-Kompromittierung. Verwenden Sie rsync, rclone oder einen S3-kompatiblen Objektspeicher, um Backups an einen entfernten Standort zu replizieren.
Schritt 10: MongoDB-Zustand überwachen
Integrierte Überwachungsbefehle
Führen Sie in mongosh Serverstatistiken aus:
db.serverStatus()
db.stats()
db.currentOp()mongostat und mongotop verwenden
Überwachen Sie aus der Shell heraus Echtzeit-Operationszählungen:
mongostat --uri="mongodb://adminuser:yourpassword@127.0.0.1:27017/?authSource=admin"Überwachen Sie Lese-/Schreibzeiten pro Collection:
mongotop --uri="mongodb://adminuser:yourpassword@127.0.0.1:27017/?authSource=admin"Wichtige zu überwachende Metriken
| Metrik | Warnschwellenwert | Was es anzeigt |
|---|---|---|
wiredTiger.cache.bytes currently in cache | > 90% von cacheSizeGB | Cache-Druck; RAM erhöhen oder Datensatz reduzieren |
connections.current | > 80% von connections.available | Erschöpfung des Verbindungspools; App-Pooling optimieren |
opcounters.getmore | Dauerhaft hoch | Cursor-Ineffizienz; Abfragemuster überprüfen |
repl.lag (Replica Sets) | > 10 Sekunden | Replikationsverzögerung; Netzwerk und Festplatten-I/O prüfen |
locks.Global.acquireWaitCount | Jeder anhaltende Wert | Sperrkonflikte; lang laufende Operationen überprüfen |
Die richtige Hosting-Umgebung für MongoDB wählen
Die Leistung und Zuverlässigkeit Ihrer MongoDB-Instanz sind direkt mit der zugrunde liegenden Infrastruktur verbunden. Berücksichtigen Sie diese Bereitstellungsstufen:
- Entwicklung und Staging: Ein Standard-VPS mit 2–4 GB RAM ist für Nicht-Produktions-Workloads, Schema-Tests und Integrationsumgebungen ausreichend.
- Produktion Einzelknoten: Ein VPS mit 4–8 GB RAM, NVMe-Speicher und einem dedizierten CPU-Kern bewältigt moderaten Produktionsverkehr für die meisten Webanwendungen.
- Hochdurchsatz-Produktion: Ein Dedizierter Server eliminiert den Noisy-Neighbor-Effekt, der in virtualisierten Umgebungen inhärent ist. WiredTigers I/O-Muster profitieren erheblich von Bare-Metal-NVMe-Arrays.
- ML/Analyse-Workloads: Wenn Sie MongoDB zusammen mit Datenpipelines, aggregationsintensiven Analysen oder Vektorsuche betreiben, kann GPU-Hosting nachgelagerte Verarbeitungsaufgaben beschleunigen.
Für Bereitstellungen, die eine grafische Verwaltungsoberfläche erfordern, bietet VPS mit cPanel eine vertraute Umgebung für Teams, die mit der reinen CLI-Verwaltung weniger vertraut sind, obwohl die direkte mongod.conf-Bearbeitung für die erweiterte Konfiguration weiterhin erforderlich ist.
Bereitstellungs-Entscheidungsmatrix
Verwenden Sie diese Checkliste vor dem Live-Gang:
- [ ] MongoDB aus dem offiziellen Repository installiert, Version fixiert
- [ ]
mongod-Dienst aktiviert und alsactive (running)bestätigt - [ ] Transparent Huge Pages deaktiviert und verifiziert
- [ ]
ulimitfür Dateideskriptoren auf 64000 oder höher gesetzt - [ ] Authentifizierung in
mongod.confaktiviert (authorization: enabled) - [ ] Admin-Benutzer mit
passwordPrompt()erstellt — keine Klartextpasswörter in der Shell-Historie - [ ] Anwendungsspezifische Benutzer mit Minimal-Rechte-Rollen erstellt
- [ ]
bindIpauf localhost oder nur bestimmte vertrauenswürdige IPs beschränkt - [ ] UFW-Regeln vorhanden — Port 27017 vom öffentlichen Internet blockiert
- [ ] TLS mit einem gültigen Zertifikat aktiviert
- [ ] WiredTiger-Cache auf 50% von (RAM – 1 GB) dimensioniert
- [ ] Langsame Abfrage-Profilerstellung aktiviert (
slowOpThresholdMs: 100) - [ ] Automatisierte tägliche Backups mit serverexterner Replikation
- [ ] Backup-Wiederherstellung getestet — ein Backup, das Sie noch nie wiederhergestellt haben, ist kein Backup
FAQ
Auf welchem Standardport hört MongoDB, und sollte er geändert werden?
MongoDB hört standardmäßig auf TCP-Port 27017. Eine Änderung auf einen nicht standardmäßigen Port fügt geringfügige Verschleierung hinzu, ist aber kein Ersatz für Authentifizierung und Firewall-Regeln. Wenn Sie ihn ändern, aktualisieren Sie net.port in /etc/mongod.conf und passen Sie alle UFW-Regeln und Verbindungszeichenfolgen entsprechend an.
Warum verbraucht MongoDB so viel RAM, selbst bei einem kleinen Datensatz?
WiredTiger reserviert seinen internen Cache vorab basierend auf der Formel max(50% of (RAM - 1 GB), 256 MB). Dies ist beabsichtigt — das Halten von Arbeitsdaten im Speicher eliminiert Festplattenlesevorgänge. Wenn der RAM-Verbrauch auf einem kleinen VPS ein Problem darstellt, setzen Sie cacheSizeGB in /etc/mongod.conf explizit auf einen niedrigeren Wert.
Kann ich MongoDB auf Shared Hosting betreiben?
Nein. MongoDB erfordert einen persistenten Hintergrund-Daemon (mongod), direkten Dateisystemzugriff auf sein Datenverzeichnis und die Möglichkeit, sich an einen Netzwerkport zu binden. Nichts davon ist auf Shared Web Hosting verfügbar. Ein VPS ist die minimal tragfähige Umgebung.
Was ist der Unterschied zwischen mongodump und einem Dateisystem-Snapshot für Backups?
mongodump führt ein logisches Backup durch — es liest Dokumente über die MongoDB-Abfrageschnittstelle und exportiert sie als BSON-Dateien. Es ist portabel und funktioniert versionsübergreifend, ist aber langsamer und kann keine Punkt-in-Zeit-Konsistenz auf einer aktiven, schreibintensiven Instanz ohne --oplog garantieren. Ein Dateisystem-Snapshot (LVM, ZFS oder Cloud-Block-Storage-Snapshot) erfasst die rohen Datendateien zu einem konsistenten Zeitpunkt und ist für große Datensätze deutlich schneller, erfordert jedoch, dass die Speicher-Engine in einem konsistenten Zustand ist.
Wie überprüfe ich, welche MongoDB-Version installiert ist?
Führen Sie den folgenden Befehl im Terminal aus:
mongod --versionOder von innerhalb von mongosh:
db.version()