Cum să Instalezi și să Configurezi MongoDB pe un VPS (Ghid Complet)
MongoDB este o bază de date NoSQL orientată pe documente care stochează înregistrările ca documente BSON (Binary JSON), permițând modelarea datelor fără schemă cu scalabilitate orizontală prin sharding nativ. Spre deosebire de bazele de date relaționale, MongoDB nu necesită o schemă de tabel predefinită, ceea ce o face alegerea dominantă pentru aplicațiile cu structuri de date în evoluție, un debit ridicat de scriere sau relații ierarhice între date.
Acest ghid parcurge un deployment MongoDB de nivel producție pe un VPS Linux — acoperind instalarea din depozitul oficial, întărirea autentificării, controlul accesului la rețea, configurarea TLS, ajustarea performanței și automatizarea backup-urilor. Fiecare pas presupune că operați într-un mediu de server real unde securitatea și fiabilitatea sunt non-negociabile.
Cerințe preliminare
Înainte de a continua, confirmați următoarele:
- Un VPS care rulează Ubuntu 20.04 LTS sau Ubuntu 22.04 LTS (comenzile sunt identice pentru ambele)
- Acces de utilizator root sau cu privilegii
sudoprin SSH - Minimum 2 GB RAM (4 GB recomandat pentru sarcini de lucru în producție)
- Cel puțin 20 GB de spațiu disponibil pe disc pe un volum de stocare rapid
- UFW sau iptables disponibil pentru gestionarea firewall-ului
- Familiaritate de bază cu linia de comandă Linux
> Notă arhitecturală: Motorul de stocare WiredTiger al MongoDB utilizează un cache intern implicit de 50% din (RAM – 1 GB). Pe un VPS de 2 GB, aceasta produce aproximativ 512 MB de cache. Pentru sarcini de lucru intensive în citire, alocați cel puțin 4 GB RAM pentru a evita I/O constant pe disc din cauza presiunii cache-ului.
MongoDB vs. Alte Baze de Date NoSQL: Comparație Rapidă
| Caracteristică | MongoDB | Redis | Cassandra | CouchDB |
|---|---|---|---|---|
| Model de date | Document (BSON) | Cheie-valoare | Coloană largă | Document (JSON) |
| Limbaj de interogare | MQL (interogări bogate) | Comenzi | CQL | Mango / MapReduce |
| Scalare orizontală | Sharding nativ | Mod cluster | Nativă | Multi-master |
| Tranzacții ACID | Da (v4.0+, multi-doc) | Parțial (scripturi Lua) | Ușoare | Da |
| Cel mai bun caz de utilizare | Aplicații de uz general, API-uri | Caching, sesiuni | Serii de timp, IoT | Sincronizare offline-first |
| Persistență pe disc | Stocare primară | Opțional (RDB/AOF) | Stocare primară | Stocare primară |
| Căutare full-text | Atlas Search / index text | Limitată | Nu | Limitată |
Pasul 1: Actualizați Sistemul
Începeți întotdeauna cu un sistem complet actualizat. Pachetele învechite introduc CVE-uri cunoscute care pot fi exploatate înainte de a instala chiar și stiva de aplicații.
sudo apt update && sudo apt upgrade -yDupă aplicarea actualizărilor de kernel sau libc, reporniți pentru a activa noul kernel:
sudo rebootReconectați-vă prin SSH după ce serverul revine online (de obicei 30–60 de secunde).
Pasul 2: Instalați MongoDB din Depozitul Oficial
Depozitele apt implicite ale Ubuntu conțin o versiune învechită, reîmpachetată de comunitate, a MongoDB, care nu dispune de patch-uri de securitate recente și îmbunătățiri ale motorului. Instalați întotdeauna din depozitul oficial MongoDB.
Adăugați Cheia GPG MongoDB și Depozitul
Comanda apt-key este depreciată pe Ubuntu 22.04. Utilizați metoda recomandată cu keyring, care funcționează atât pe 20.04, cât și pe 22.04:
curl -fsSL https://www.mongodb.org/static/pgp/server-7.0.asc |
sudo gpg --dearmor -o /usr/share/keyrings/mongodb-server-7.0.gpgAdăugați intrarea oficială a depozitului:
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> Notă versiune: Înlocuiți 7.0 cu versiunea țintă (de ex., 6.0) dacă aveți nevoie de o versiune specifică pentru compatibilitatea aplicației. MongoDB 7.0 este versiunea actuală cu suport pe termen lung începând cu 2024.
Instalați Pachetele MongoDB
sudo apt update
sudo apt install -y mongodb-orgAceasta instalează următoarele componente:
mongod — daemonul principal al bazei de date
mongos — routerul de sharding (utilizat în deployment-urile cu cluster sharded)
mongosh — shell-ul modern MongoDB (înlocuiește binarul legacy mongo)
mongodb-database-tools — include mongodump, mongorestore, mongoexport și mongoimportFixați Versiunea Instalată
Preveniți upgrade-urile neintenționate care ar putea rupe compatibilitatea aplicației:
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-selectionsPasul 3: Configurați Cerințele Preliminare la Nivel de Sistem
MongoDB funcționează cel mai bine când anumiți parametri de kernel și sistem de fișiere sunt ajustați înainte de pornirea daemonului.
Setați ulimit pentru Fișiere Deschise
MongoDB necesită o limită ridicată a descriptorilor de fișiere. Creați o suprascriere systemd:
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
EOFDezactivați Transparent Huge Pages (THP)
THP cauzează vârfuri semnificative de latență în MongoDB. Dezactivați-l persistent:
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-thpVerificați că setarea a intrat în vigoare:
cat /sys/kernel/mm/transparent_hugepage/enabledRezultatul ar trebui să afișeze [never] ca valoare activă.
Pasul 4: Porniți și Activați MongoDB
sudo systemctl daemon-reload
sudo systemctl start mongod
sudo systemctl enable mongodConfirmați că daemonul rulează:
sudo systemctl status mongodCăutați Active: active (running) în rezultat. Dacă serviciul nu pornește, inspectați imediat jurnalul:
sudo tail -50 /var/log/mongodb/mongod.logEșecurile comune la pornire includ:
- Portul 27017 deja în uz — un alt proces este legat la port; identificați-l cu
sudo ss -tlnp | grep 27017 - Permisiuni director de date — utilizatorul
mongodtrebuie să dețină/var/lib/mongodb; remediați cusudo chown -R mongodb:mongodb /var/lib/mongodb - THP încă activat — motorul WiredTiger înregistrează un avertisment și poate degrada performanța
Pasul 5: Securizați MongoDB — Autentificare și Autorizare
Aceasta este secțiunea cea mai critică. Instanțele MongoDB neprotejate expuse la internet au fost responsabile pentru mii de breșe de date. Instalarea implicită nu are nicio autentificare, ceea ce înseamnă că oricine poate ajunge la portul 27017 are acces complet de citire/scriere la fiecare bază de date.
Creați Utilizatorul Administrativ
Conectați-vă la shell-ul local MongoDB (nu este necesară autentificarea înainte de activarea acesteia):
mongoshÎn interiorul shell-ului, comutați la baza de date admin și creați un superutilizator:
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" }
]
})Utilizarea passwordPrompt() în loc de un șir de text simplu împiedică apariția parolei în istoricul shell-ului. Introduceți parola când vi se solicită, apoi ieșiți:
exitActivați Autentificarea în mongod.conf
Deschideți fișierul de configurare MongoDB:
sudo nano /etc/mongod.confLocalizați secțiunea security (va fi comentată) și activați autorizarea:
security:
authorization: enabledSalvați și ieșiți (Ctrl+X, apoi Y, apoi Enter), apoi reporniți daemonul:
sudo systemctl restart mongodVerificați că Autentificarea Este Aplicată
Încercați o conexiune neautentificată — aceasta ar trebui să eșueze acum:
mongosh --eval "db.adminCommand({ listDatabases: 1 })"Ar trebui să primiți o eroare Unauthorized. Acum autentificați-vă corect:
mongosh -u adminuser -p --authenticationDatabase adminCreați Utilizatori cu Domeniu de Aplicație
Nu utilizați niciodată superutilizatorul admin pentru conexiunile aplicației. Creați un utilizator cu privilegii minime pentru fiecare bază de date a aplicației:
use myappdb
db.createUser({
user: "appuser",
pwd: passwordPrompt(),
roles: [
{ role: "readWrite", db: "myappdb" }
]
})Pasul 6: Configurați Legarea la Rețea și Regulile Firewall
Restricționați sau Extindeți bindIp
În mod implicit, mongod.conf se leagă doar la 127.0.0.1. Aceasta este setarea corectă dacă aplicația dvs. rulează pe același VPS. Dacă aveți nevoie de acces de la distanță (de ex., de la un server de aplicații pe un host separat), editați /etc/mongod.conf:
net:
port: 27017
bindIp: 127.0.0.1,10.0.0.5Înlocuiți 10.0.0.5 cu IP-ul privat specific al serverului dvs. de aplicații. Nu setați niciodată bindIp: 0.0.0.0 pe o interfață publică fără o regulă de firewall care restricționează accesul la IP-uri cunoscute. Legarea la toate interfețele fără firewall este cauza principală a incidentelor de expunere a datelor MongoDB.
Reporniți după modificări:
sudo systemctl restart mongodConfigurați Regulile Firewall UFW
Dacă este necesar accesul de la distanță, permiteți doar IP-ul de încredere specific:
sudo ufw allow from 10.0.0.5 to any port 27017 proto tcp
sudo ufw enable
sudo ufw status verboseBlocați orice alt acces extern la portul 27017:
sudo ufw deny 27017UFW procesează regulile în ordine — regula specifică allow from de deasupra regulii generale deny are prioritate pentru IP-ul de încredere.
Pasul 7: Activați TLS/SSL pentru Conexiuni Criptate
Pentru orice deployment în care traficul MongoDB traversează o rețea — chiar și un LAN privat — criptarea TLS este obligatorie. Fără aceasta, acreditările și datele sunt transmise în text simplu.
Generați un certificat autosemnat pentru testare (utilizați un certificat semnat de CA în producție — luați în considerare asocierea acestuia cu un Certificat SSL pentru domeniul dvs.):
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.pemAdăugați configurația TLS în /etc/mongod.conf:
net:
port: 27017
bindIp: 127.0.0.1
tls:
mode: requireTLS
certificateKeyFile: /etc/mongodb/ssl/mongodb.pemReporniți MongoDB și conectați-vă cu TLS:
sudo systemctl restart mongod
mongosh --tls --tlsCertificateKeyFile /etc/mongodb/ssl/mongodb.pem
--tlsAllowInvalidCertificates -u adminuser -p --authenticationDatabase adminFlag-ul --tlsAllowInvalidCertificates este acceptabil doar pentru certificatele autosemnate în dezvoltare. Eliminați-l când utilizați un certificat semnat de CA.
Pasul 8: Ajustarea Performanței în mongod.conf
Pentru un deployment în producție pe un VPS cu resurse dedicate, ajustați cache-ul WiredTiger și setările de journaling. Deschideți /etc/mongod.conf și adăugați sau modificați următoarele:
storage:
dbPath: /var/lib/mongodb
journal:
enabled: true
wiredTiger:
engineConfig:
cacheSizeGB: 1.5
operationProfiling:
slowOpThresholdMs: 100
mode: slowOp
replication:
oplogSizeMB: 1024Parametrii cheie de ajustare explicați:
cacheSizeGB— Setați aceasta la aproximativ 50% din RAM disponibil minus 1 GB. Pe un VPS de 4 GB, utilizați1.5. Pe un VPS de 8 GB, utilizați3.5.slowOpThresholdMs— Interogările care depășesc acest prag (în milisecunde) sunt înregistrate în profiler. Scăderea acestuia ajută la identificarea timpurie a interogărilor neindexate.oplogSizeMB— Relevant dacă intenționați să adăugați membri ai setului de replici mai târziu. Dimensionarea prealabilă a oplog evită întârzierea replicării la sarcini de lucru cu scriere intensă.
Aplicați modificările:
sudo systemctl restart mongodPasul 9: Backup și Restaurare cu mongodump
Backup Manual
mongodump
--uri="mongodb://adminuser:yourpassword@127.0.0.1:27017/?authSource=admin"
--out /var/backups/mongodb/$(date +%Y-%m-%d)Restaurare Manuală
mongorestore
--uri="mongodb://adminuser:yourpassword@127.0.0.1:27017/?authSource=admin"
/var/backups/mongodb/2024-06-15Automatizați Backup-urile cu Cron
Creați un script dedicat de backup:
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.shProgramați-l să ruleze zilnic la 2:00 AM:
(crontab -l 2>/dev/null; echo "0 2 * * * /usr/local/bin/mongodb-backup.sh >> /var/log/mongodb-backup.log 2>&1") | crontab -> Considerație pentru producție: Stocați backup-urile în afara serverului. Păstrarea backup-urilor pe același VPS ca baza de date nu oferă nicio protecție împotriva defecțiunii discului sau compromiterii serverului. Utilizați rsync, rclone sau un magazin de obiecte compatibil S3 pentru a replica backup-urile într-o locație de la distanță.
Pasul 10: Monitorizați Sănătatea MongoDB
Comenzi de Monitorizare Integrate
În interiorul mongosh, rulați statistici de server:
db.serverStatus()
db.stats()
db.currentOp()Utilizați mongostat și mongotop
Din shell, monitorizați numărul de operațiuni în timp real:
mongostat --uri="mongodb://adminuser:yourpassword@127.0.0.1:27017/?authSource=admin"Monitorizați timpul de citire/scriere per colecție:
mongotop --uri="mongodb://adminuser:yourpassword@127.0.0.1:27017/?authSource=admin"Metrici Cheie de Urmărit
| Metrică | Prag de Avertizare | Ce Indică |
|---|---|---|
wiredTiger.cache.bytes currently in cache | > 90% din cacheSizeGB | Presiune cache; creșteți RAM sau reduceți setul de date |
connections.current | > 80% din connections.available | Epuizarea pool-ului de conexiuni; ajustați pooling-ul aplicației |
opcounters.getmore | Constant ridicat | Ineficiență cursor; revizuiți modelele de interogare |
repl.lag (seturi de replici) | > 10 secunde | Întârziere replicare; verificați rețeaua și I/O-ul discului |
locks.Global.acquireWaitCount | Orice valoare susținută | Contention de blocare; revizuiți operațiunile de lungă durată |
Alegerea Găzduirii Potrivite pentru MongoDB
Performanța și fiabilitatea instanței dvs. MongoDB sunt direct legate de infrastructura de bază. Luați în considerare aceste niveluri de deployment:
- Dezvoltare și staging: Un VPS standard cu 2–4 GB RAM este suficient pentru sarcini de lucru non-producție, testarea schemelor și medii de integrare.
- Producție nod unic: Un VPS cu 4–8 GB RAM, stocare NVMe și un nucleu CPU dedicat gestionează traficul de producție moderat pentru majoritatea aplicațiilor web.
- Producție cu debit ridicat: Un Server Dedicat elimină efectul de vecin zgomotos inerent mediilor virtualizate. Modelele I/O ale WiredTiger beneficiază semnificativ de pe urma array-urilor NVMe bare-metal.
- Sarcini de lucru ML/analiză: Dacă rulați MongoDB alături de pipeline-uri de date, analiză intensivă în agregare sau căutare vectorială, Găzduirea GPU poate accelera sarcinile de procesare din aval.
Pentru deployment-urile care necesită o interfață de gestionare grafică, VPS cu cPanel oferă un mediu familiar pentru echipele mai puțin confortabile cu administrarea prin CLI pur, deși editarea directă a mongod.conf rămâne necesară pentru configurarea avansată.
Matricea de Decizie pentru Deployment
Utilizați această listă de verificare înainte de a intra în producție:
- [ ] MongoDB instalat din depozitul oficial, versiune fixată
- [ ] Serviciul
mongodactivat și confirmatactive (running) - [ ] Transparent Huge Pages dezactivat și verificat
- [ ]
ulimitpentru descriptori de fișiere setat la 64000 sau mai mare - [ ] Autentificarea activată în
mongod.conf(authorization: enabled) - [ ] Utilizator admin creat cu
passwordPrompt()— fără parole în text simplu în istoricul shell-ului - [ ] Utilizatori specifici aplicației creați cu roluri de privilegii minime
- [ ]
bindIprestricționat la localhost sau doar la IP-uri de încredere specifice - [ ] Reguli UFW în vigoare — portul 27017 blocat de pe internetul public
- [ ] TLS activat cu un certificat valid
- [ ] Cache WiredTiger dimensionat la 50% din (RAM – 1 GB)
- [ ] Profilarea interogărilor lente activată (
slowOpThresholdMs: 100) - [ ] Backup-uri zilnice automatizate cu replicare în afara serverului
- [ ] Restaurarea backup-ului testată — un backup pe care nu l-ați restaurat niciodată nu este un backup
Întrebări Frecvente
Pe ce port implicit ascultă MongoDB și ar trebui schimbat?
MongoDB ascultă implicit pe portul TCP 27017. Schimbarea acestuia la un port non-standard adaugă o obscuritate minoră, dar nu este un substitut pentru autentificare și regulile de firewall. Dacă îl schimbați, actualizați net.port în /etc/mongod.conf și ajustați toate regulile UFW și șirurile de conexiune în consecință.
De ce folosește MongoDB atât de mult RAM chiar și cu un set de date mic?
WiredTiger pre-alocă cache-ul său intern pe baza formulei max(50% of (RAM - 1 GB), 256 MB). Aceasta este intenționată — menținerea datelor de lucru în memorie elimină citirile de pe disc. Dacă consumul de RAM este o preocupare pe un VPS mic, setați explicit cacheSizeGB în /etc/mongod.conf la o valoare mai mică.
Pot rula MongoDB pe găzduire partajată?
Nu. MongoDB necesită un daemon de fundal persistent (mongod), acces direct la sistemul de fișiere pentru directorul său de date și capacitatea de a se lega la un port de rețea. Niciunul dintre acestea nu este disponibil pe Găzduirea Web Partajată. Un VPS este mediul minim viabil.
Care este diferența dintre mongodump și un snapshot de sistem de fișiere pentru backup-uri?
mongodump efectuează un backup logic — citește documentele prin interfața de interogare MongoDB și le exportă ca fișiere BSON. Este portabil și funcționează între versiuni, dar este mai lent și nu poate garanta consistența la un moment dat pe o instanță live cu scriere intensă fără --oplog. Un snapshot de sistem de fișiere (LVM, ZFS sau snapshot de stocare bloc în cloud) capturează fișierele de date brute la un moment consistent în timp și este semnificativ mai rapid pentru seturi de date mari, dar necesită ca motorul de stocare să fie într-o stare consistentă.
Cum verific ce versiune de MongoDB este instalată?
Rulați următoarea comandă din terminal:
mongod --versionSau din interiorul mongosh:
db.version()