MongoServerError: connect ECONNREFUSED 127.0.0.1:27017 の修正方法

beginner🍃 MongoDB2026-03-17| Linux (Ubuntu/Debian/RHEL)、macOS、Windows — MongoDB 4.x/5.x/6.x/7.x、MongooseまたはMongoDBドライバを使用したNode.js

Error Message

MongoServerError: connect ECONNREFUSED 127.0.0.1:27017
#mongodb#接続#mongod#ポート

TL;DR

ポート27017でのECONNREFUSEDは、アプリがMongoDBへの接続を試みたが、サービスが起動していないことを意味します — そのポートでリッスンしているものが何もありません。9割のケースは、以下のコマンド一つで解決できます:

# Linux (systemd)
sudo systemctl start mongod

# macOS (Homebrew)
brew services start mongodb-community

# Windows
net start MongoDB

根本原因

ECONNREFUSEDはTCPレベルのエラーです。OSが接続を積極的に拒否した — ポートが閉じています。これはいくつかの理由で発生します:

  • mongodプロセスが起動していない
  • MongoDBが別のポートまたはバインドアドレスでリッスンしている
  • ファイアウォールがポート27017をブロックしている
  • データディレクトリのパーミッションが正しくないため、mongodが起動できない
  • MongoDBが起動時にクラッシュした(ログに原因が記録されます)

ステップ1 — mongodが起動しているか確認する

# Linux / macOS
ps aux | grep mongod

# またはサービスの状態を確認する
sudo systemctl status mongod

inactive (dead)というステータスはMongoDBが停止している — または一度も起動していないことを意味します。ステップ2へ進んでください。

ステップ2 — MongoDBを起動する

# Linux (systemd — Ubuntu、Debian、RHEL、CentOS)
sudo systemctl start mongod
sudo systemctl enable mongod   # ブート時に自動起動

# macOS (Homebrew)
brew services start mongodb-community

# macOS (Homebrewなしでインストールした場合の手動起動)
mongod --config /usr/local/etc/mongod.conf

# Windows (管理者としてコマンドプロンプトを実行)
net start MongoDB

ステップ3 — ポートがリッスン状態か確認する

起動が成功したと思い込まないでください。MongoDBが実際にポート27017で接続を受け付けているか確認します:

# Linux / macOS
ss -tlnp | grep 27017
# または
lsof -i :27017

# Windows
netstat -ano | findstr 27017

次のような出力が表示されれば成功です:

tcp  0  0  127.0.0.1:27017  0.0.0.0:*  LISTEN  1234/mongod

この行はMongoDBがリッスンしていることを確認します。アプリを再度試してみてください — ECONNREFUSEDエラーは解消されているはずです。

ステップ4 — mongodの起動に失敗する場合はログを確認する

systemctl start mongodがエラーを返さないにもかかわらず、サービスがすぐに終了することがあります。ログに何が問題だったかが正確に記録されています:

# Linux
sudo journalctl -u mongod -n 50 --no-pager

# またはログファイルを直接確認する
sudo tail -n 50 /var/log/mongodb/mongod.log

よくあるログエラーと修正方法

データディレクトリのパーミッション拒否

# ログ出力:
# exception in initAndListen: NonExistentPath: Data directory /var/lib/mongodb not found.

# 修正: ディレクトリを作成してオーナーシップを修正する
sudo mkdir -p /var/lib/mongodb
sudo chown -R mongodb:mongodb /var/lib/mongodb
sudo chmod 755 /var/lib/mongodb

ポートがすでに使用中

# ログ出力:
# Address already in use for socket: 0.0.0.0:27017

# ポートを使用しているプロセスを確認する
sudo lsof -i :27017

# 古いmongodプロセスであれば強制終了する
sudo kill -9 <PID>

以前のクラッシュによるロックファイル

# ログ出力:
# Unclean shutdown detected. Please visit...

# ロックファイルを削除する
sudo rm /var/lib/mongodb/mongod.lock
sudo mongod --repair --dbpath /var/lib/mongodb
sudo systemctl start mongod

ステップ5 — mongod.confのバインドIPを確認する

MongoDBは起動しているのにまだ接続が拒否される場合は、バインドアドレスが原因である可能性が高いです。デフォルトでは、MongoDBは127.0.0.1のみでリッスンします — 他のホストやコンテナからの接続は認証レイヤーに到達する前に拒否されます。

# 設定ファイルを開く
sudo nano /etc/mongod.conf

# このセクションを確認する:
net:
  port: 27017
  bindIp: 127.0.0.1   # ← ローカル接続のみ受け付ける

Dockerコンテナや別サーバーなど、他のホストからの接続を許可するには、bindIpを変更します:

net:
  port: 27017
  bindIp: 0.0.0.0   # 任意のIPからの接続を受け付ける(ファイアウォールルールと併用すること)

次に再起動します:

sudo systemctl restart mongod

セキュリティに関する注意: MongoDBがファイアウォールの背後にある場合のみ0.0.0.0にバインドしてください。認証とネットワーク制限なしにポート27017をインターネットに直接公開しないでください。

ステップ6 — ファイアウォールの確認

リモートのMongoDBホストに接続していますか?ファイアウォールがポート27017のパケットを静かにドロップしている可能性があります。ポートを明示的に開放してください:

# Ubuntu (ufw)
sudo ufw allow 27017/tcp
sudo ufw status

# RHEL/CentOS (firewalld)
sudo firewall-cmd --permanent --add-port=27017/tcp
sudo firewall-cmd --reload

ステップ7 — DockerとDocker Compose

Dockerはネットワーキングに複雑さをもたらします。コンテナ内では、127.0.0.1はホストマシンではなくコンテナ自身を指します。そのため、Node.jsアプリがDockerで動作し、MongoDBがホスト上(または別のコンテナ内)にある場合、接続文字列を変更する必要があります:

# 誤り — コンテナのループバックに解決され、ホストではない
MONGODB_URI=mongodb://127.0.0.1:27017/mydb

# 正解 — host.docker.internalを使用する(macOS / WindowsのDocker Desktop)
MONGODB_URI=mongodb://host.docker.internal:27017/mydb

# 正解 — MongoDBがdocker-compose.ymlのサービスの場合、サービス名を使用する
MONGODB_URI=mongodb://mongo:27017/mydb

docker-compose.ymlの例:

services:
  app:
    build: .
    environment:
      - MONGODB_URI=mongodb://mongo:27017/mydb
    depends_on:
      - mongo
  mongo:
    image: mongo:7
    ports:
      - "27017:27017"

動作確認

mongoshを使用して接続がエンドツーエンドで機能することを確認します:

mongosh mongodb://127.0.0.1:27017
# 期待される出力:
# Connecting to: mongodb://127.0.0.1:27017/
# MongoServerVersion: 7.x.x
# >

またはMongooseを使用した簡単なNode.jsスニペットでテストします:

const mongoose = require('mongoose');
mongoose.connect('mongodb://127.0.0.1:27017/test')
  .then(() => console.log('接続成功!'))
  .catch(err => console.error(err));

出力に接続成功!と表示されれば修正が成功しています。ECONNREFUSEDエラーは解消されています。

Related Error Notes