マルチサイトホスティング

作成日:
infrastructure VPS Docker hosting

概要

マルチサイトホスティングとは、1台のサーバー(VPS やレンタルサーバー)で複数のウェブサイトを運用する構成のこと。コスト削減とリソースの有効活用を目的として、個人開発や小規模プロジェクトで広く採用されている。

なぜ1台のサーバーで複数サイトを運用するのか

メリット

  • コスト効率: サーバー代を複数サイトで分散できる
  • リソース有効活用: 低トラフィックなサイトは小さなリソースで十分
  • 管理の集約: インフラ管理を1箇所に集約できる
  • 学習効率: 1つの環境で複数の技術を試せる

デメリット・注意点

  • 単一障害点: サーバーダウンで全サイトが影響を受ける
  • リソース競合: 1サイトの高負荷が他に影響する可能性
  • セキュリティリスク: 1サイトの脆弱性が他に波及するリスク
  • スケーリングの限界: 成長したサイトは分離を検討する必要あり

技術スタックの選択肢

1. Docker + リバースプロキシ(推奨)

最もモダンで柔軟な構成。各サイトをコンテナで隔離し、リバースプロキシでルーティングする。

[インターネット]

[Traefik / Nginx] ← リバースプロキシ(80/443)

   ┌──┴──┬──────┬──────┐
   ↓     ↓      ↓      ↓
[Site A][Site B][Site C][API]
 :3000   :4000   :5000   :8080

メリット:

  • サイト間の隔離性が高い
  • 各サイトを独立してデプロイ・更新可能
  • 異なる言語・フレームワークを混在可能
  • Let’s Encrypt による自動 HTTPS

構成例:

# compose.yaml(インフラ層)
services:
  traefik:
    image: traefik:v3.5
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./traefik.yml:/etc/traefik/traefik.yml:ro
      - traefik-certs:/letsencrypt
    networks:
      - proxy-net  # Traefik も proxy-net に参加する必要がある

networks:
  proxy-net:
    external: true

volumes:
  traefik-certs:
# site-a/compose.yaml(サイト A)
services:
  site-a:
    image: site-a:latest
    labels:
      - traefik.enable=true
      - traefik.http.routers.site-a.rule=Host(`site-a.example.com`)
      - traefik.http.routers.site-a.tls=true
      - traefik.http.routers.site-a.tls.certresolver=le
    networks:
      - proxy-net

networks:
  proxy-net:
    external: true

2. Nginx ベースの仮想ホスト

従来からある構成。Nginx の server ブロックでドメインごとにルーティングする。

# /etc/nginx/sites-available/site-a.conf
server {
    listen 80;
    server_name site-a.example.com;
    root /var/www/site-a;
    index index.html;
}

# /etc/nginx/sites-available/site-b.conf
server {
    listen 80;
    server_name site-b.example.com;
    root /var/www/site-b;
    index index.html;
}

メリット:

  • シンプルで理解しやすい
  • 静的サイトなら十分
  • Docker不要で軽量

デメリット:

  • 動的サイトの管理が複雑
  • 隔離性が低い
  • 証明書管理が手動(certbot)

3. クラウドプラットフォーム連携

Cloudflare Tunnel や ngrok などを使い、サーバーを公開せずに運用する方式。

メリット:

  • ファイアウォール設定不要
  • DDoS 保護がデフォルト
  • IPアドレスを隠蔽可能

デメリット:

  • 外部サービスへの依存
  • 無料プランの制限
  • レイテンシ増加の可能性

技術選定の指針

判断基準

要件推奨構成
静的サイトのみNginx 仮想ホスト or Caddy
動的サイト混在Docker + Traefik
異なる言語/FW混在Docker + Traefik
簡単に始めたいCaddy(自動HTTPS内蔵)
細かいチューニング必要Nginx
Kubernetes移行視野Docker + Traefik

サーバースペックの目安

小規模(2-3サイト、低トラフィック):

  • CPU: 1-2 vCPU
  • RAM: 1-2 GB
  • Storage: 20-40 GB SSD
  • 月額: 500-1,500円程度

中規模(5-10サイト、中程度トラフィック):

  • CPU: 2-4 vCPU
  • RAM: 4-8 GB
  • Storage: 40-100 GB SSD
  • 月額: 2,000-5,000円程度

リポジトリ構成のパターン

パターン A: モノレポ方式

すべてのサイトを1つのリポジトリで管理。

server-config/
├── traefik/
│   ├── compose.yaml
│   └── traefik.yml
├── sites/
│   ├── site-a/
│   │   ├── compose.yaml
│   │   └── Dockerfile
│   ├── site-b/
│   │   ├── compose.yaml
│   │   └── Dockerfile
│   └── site-c/
│       ├── compose.yaml
│       └── Dockerfile
└── scripts/
    ├── deploy-all.sh
    └── backup.sh

メリット: 一括管理、依存関係の把握が容易 デメリット: リポジトリが肥大化、権限分離が難しい

パターン B: マルチレポ方式(推奨)

インフラと各サイトを別リポジトリで管理。

# リポジトリ 1: private-gateway
private-gateway/
├── compose.yaml      # Traefik設定
├── traefik.yml
└── README.md

# リポジトリ 2: site-a
site-a/
├── compose.yaml
├── Dockerfile
├── src/
└── README.md

# リポジトリ 3: site-b
site-b/
├── compose.yaml
├── Dockerfile
├── src/
└── README.md

メリット:

  • 各サイトを独立して管理・デプロイ
  • 権限分離が容易
  • CI/CD を個別に設定可能

デメリット: 管理するリポジトリが増える

ネットワーク設計

外部公開ネットワークと内部ネットワークの分離

# ネットワーク作成
# docker network create proxy-net

networks:
  proxy-net:      # 外部公開用(Traefik と公開サービス)
    external: true
  internal-net:   # 内部通信用(DB、キャッシュなど)
    internal: true

セキュリティの原則

  1. 最小権限: 公開が必要なサービスのみ proxy-net に参加
  2. DB非公開: データベースは internal-net のみ、ポート公開なし
  3. Traefik ラベル: 公開サービスのみ traefik.enable=true
  4. docker.sock 保護: docker-socket-proxy 経由でアクセス

デプロイフロー

新規サイト追加の手順

  1. DNS設定: サブドメインの A/AAAA レコードをサーバー IP に向ける
  2. リポジトリ作成: サイト用のリポジトリを作成
  3. compose.yaml 作成: Traefik ラベルを含む設定を作成
  4. デプロイ: docker compose up -d
  5. 確認: HTTPS でアクセスできることを確認

更新時のフロー

# サイト A を更新
cd /opt/apps/site-a
git pull
docker compose pull
docker compose up -d

# 全サービスの状態確認
docker ps
docker compose logs -f

監視とバックアップ

最低限の監視

  • 外形監視: UptimeRobot、Healthchecks.io などで定期的にアクセス確認
  • リソース監視: htopdocker stats でリソース使用状況を確認
  • ログ監視: docker compose logs でエラーを確認

バックアップ対象

  • 証明書: /letsencrypt/acme.json(Traefik)
  • 設定ファイル: compose.yamltraefik.yml
  • 永続データ: Docker ボリューム(DB データなど)
  • アプリケーションデータ: アップロードファイルなど

関連トピック