コンテンツにスキップ

ローカルホスト(localhost)の仕組み

1. ローカルホストとは

localhost とは、自分自身のコンピュータを指す特別なホスト名。 ネットワーク上の他のマシンではなく、「今使っているこのPC」を意味する。

ブラウザで http://localhost:3000 にアクセス
→ 自分のPC上で動いているサーバーに接続

2. IPアドレスとの関係

ホスト名 IPアドレス プロトコル
localhost 127.0.0.1 IPv4
localhost ::1 IPv6
  • 127.0.0.1ループバックアドレス と呼ばれる
  • 127.0.0.0/8(127.0.0.1 〜 127.255.255.255)の範囲はすべてループバック用に予約されている
  • どのPCでも共通。世界中のどのマシンでも 127.0.0.1 は「自分自身」

3. 名前解決の仕組み

localhost127.0.0.1 の変換は hostsファイル で定義されている。

# Windowsの場合
C:\Windows\System32\drivers\etc\hosts

# Linux/macOSの場合
/etc/hosts

hostsファイルの中身(例):

127.0.0.1       localhost
::1             localhost

名前解決の優先順位: 1. hostsファイル(ローカル) 2. DNSキャッシュ 3. DNSサーバーへの問い合わせ

localhost はhostsファイルで解決されるため、DNSサーバーへの問い合わせは発生しない

4. ループバックインターフェース

通常の通信 vs ループバック通信

【通常の通信】
PC → NIC(ネットワークカード)→ ルーター → インターネット → 相手のサーバー

【ループバック通信】
PC → ループバックインターフェース → 同じPC内で折り返し
  • 物理的なネットワーク機器を経由しない
  • OSのネットワークスタック内で完結する
  • そのため非常に高速(遅延ほぼゼロ)
  • ネットワークが切断されていても動作する

図解

┌─────────────────────────────────┐
│           あなたのPC              │
│                                 │
│  ┌──────────┐    ┌──────────┐   │
│  │ ブラウザ  │    │  サーバー  │   │
│  │ (クライ   │    │ (Node.js  │   │
│  │  アント)  │    │  等)      │   │
│  └────┬─────┘    └─────┬────┘   │
│       │                │        │
│       │  localhost:3000 │        │
│       ▼                ▼        │
│  ┌──────────────────────────┐   │
│  │   ループバックインターフェース  │   │
│  │       (127.0.0.1)         │   │
│  └──────────────────────────┘   │
│                                 │
│  ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─   │
│  物理NIC(使わない)             │
└─────────────────────────────────┘

5. ポート番号

localhost単体ではサーバーを特定できない。ポート番号で区別する。

http://localhost:3000  → Webアプリ(React等)
http://localhost:8080  → APIサーバー
http://localhost:5432  → PostgreSQL
http://localhost:6379  → Redis
  • ポートは 0〜65535 の範囲
  • 0〜1023ウェルノウンポート(HTTP=80, HTTPS=443 等)で管理者権限が必要
  • 1024〜49151登録済みポート(一般的なアプリが使う)
  • 49152〜65535動的ポート(OSが一時的に割り当てる)

ポートの仕組み

1つのPCで複数のサーバーを同時に動かせる理由:

┌────────────────────────────────────┐
│          127.0.0.1                  │
│                                    │
│  :3000 → React開発サーバー          │
│  :5000 → Flask APIサーバー          │
│  :5432 → PostgreSQL                │
│  :8080 → Spring Bootアプリ          │
│                                    │
│  ※同じポートを2つのアプリで使うことは │
│    できない(ポート競合エラー)        │
└────────────────────────────────────┘

6. 0.0.0.0127.0.0.1 の違い

開発中にサーバー起動時、バインドアドレスの選択が重要:

アドレス 意味 アクセス範囲
127.0.0.1 ループバックのみ 自分のPCからのみ
0.0.0.0 すべてのインターフェース 同一LAN内の他の端末からもアクセス可能
# 自分だけアクセスできる(安全)
app.run(host="127.0.0.1", port=5000)

# 同一ネットワーク内の他のデバイスからもアクセス可能
# スマホでの動作確認等に便利だが、セキュリティに注意
app.run(host="0.0.0.0", port=5000)

7. 開発での活用例

Web開発

# React開発サーバー
npm start
# → http://localhost:3000 で開発中のサイトを確認

# Python Flask
flask run
# → http://localhost:5000

# Next.js
npm run dev
# → http://localhost:3000

データベース接続

# PostgreSQLへのローカル接続
connection = psycopg2.connect(
    host="localhost",
    port=5432,
    database="mydb",
    user="postgres",
    password="password"
)

Docker

# docker-compose.yml
services:
  web:
    ports:
      - "8080:80"  # ホストの8080 → コンテナの80にマッピング
http://localhost:8080 でコンテナ内のWebサーバーにアクセス

8. トラブルシューティング

よくある問題

症状 原因 対処法
接続できない サーバーが起動していない プロセス確認: netstat -an \| findstr :3000
ポート競合 同じポートを別アプリが使用中 使用中のポートを確認して停止 or 別ポートを使う
ERR_CONNECTION_REFUSED サーバーがそのポートでリッスンしていない ポート番号・バインドアドレスを確認
WSLからホストにアクセスできない WSLとWindowsはネットワークが分離 host.docker.internal や ホストIPを使う

ポート使用状況の確認コマンド

# Windows
netstat -ano | findstr :3000

# Linux/macOS
lsof -i :3000
ss -tlnp | grep 3000

9. セキュリティ上の注意

  • localhost はファイアウォールを通過しない → 外部から直接アクセスされない
  • ただし 0.0.0.0 でバインドするとLAN内に公開されるため注意
  • 開発用サーバーを本番環境で使わない(セキュリティ機能が不十分)
  • ローカルで動いているからといって安全とは限らない(SSRF攻撃など)

まとめ

localhost = 自分のPC = 127.0.0.1
ループバックインターフェースで折り返し
物理ネットワークを使わない = 高速 & オフラインでもOK
ポート番号で複数のサービスを区別
Web開発・DB接続・Docker等、開発のあらゆる場面で活用