マルチサイトホスティング
作成日:
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
セキュリティの原則
- 最小権限: 公開が必要なサービスのみ
proxy-netに参加 - DB非公開: データベースは
internal-netのみ、ポート公開なし - Traefik ラベル: 公開サービスのみ
traefik.enable=true - docker.sock 保護:
docker-socket-proxy経由でアクセス
デプロイフロー
新規サイト追加の手順
- DNS設定: サブドメインの A/AAAA レコードをサーバー IP に向ける
- リポジトリ作成: サイト用のリポジトリを作成
- compose.yaml 作成: Traefik ラベルを含む設定を作成
- デプロイ:
docker compose up -d - 確認: 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 などで定期的にアクセス確認
- リソース監視:
htop、docker statsでリソース使用状況を確認 - ログ監視:
docker compose logsでエラーを確認
バックアップ対象
- 証明書:
/letsencrypt/acme.json(Traefik) - 設定ファイル:
compose.yaml、traefik.yml - 永続データ: Docker ボリューム(DB データなど)
- アプリケーションデータ: アップロードファイルなど
関連トピック
- ドメイン戦略 - サブドメイン vs サブディレクトリ
- リバースプロキシ選定 - Traefik vs Nginx vs Caddy
- Traefik - Traefik の詳細設定
- Docker Compose - Docker Compose の基本
- Nginx SSL/TLS 証明書管理 - Nginx での証明書管理