Middleware
ミドルウェアはアプリケーションとインフラの間に位置し、リクエスト処理、メッセージング、キャッシングなどの共通機能を提供します。 ここでは概念説明より実際の構成と運用に焦点を当てます。
システム全体でのミドルウェアの役割
┌─────────────────────────────────────────────────────────────────────────┐
│ Client Request │
└─────────────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────────┐
│ CDN / Edge Cache │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ 静的コンテンツキャッシュ、DDoS防御、地理的分散 │ │
│ │ CloudFront, Cloudflare, Fastly │ │
│ └─────────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────────┐
│ Load Balancer │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ L4/L7負荷分散、SSL終端、ヘルスチェック │ │
│ │ ALB/NLB, HAProxy, Nginx │ │
│ └─────────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────────┐
│ Web Server / Reverse Proxy │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ リクエストルーティング、静的ファイル配信、リバースプロキシ │ │
│ │ Nginx, Apache, Caddy │ │
│ └─────────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────────┘
│
┌───────────────────────┼───────────────────────┐
│ │ │
▼ ▼ ▼
┌───────────────────┐ ┌───────────────────┐ ┌───────────────────┐
│ App Server │ │ Cache │ │ Message Queue │
│ │ │ │ │ │
│ PHP-FPM, Gunicorn │ │ Redis, Memcached │ │ RabbitMQ, Kafka │
│ Tomcat, Puma │ │ │ │ SQS │
└───────────────────┘ └───────────────────┘ └───────────────────┘
│ │ │
└───────────────────────┼───────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────────┐
│ Database / Storage │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ PostgreSQL │ │ MongoDB │ │ S3 │ │
│ │ MySQL │ │ Elasticsearch│ │ EFS │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
└─────────────────────────────────────────────────────────────────────────┘
本セクションで扱うミドルウェア
🌐 Web Server
リクエスト受付、ルーティング、静的配信、リバースプロキシ
- • Nginx - 高性能、イベント駆動
- • Apache - モジュール豊富、.htaccess
- • Caddy - 自動HTTPS、設定簡単
📨 Message Queue
非同期処理、サービス間連携、イベント駆動アーキテクチャ
- • RabbitMQ - AMQP、柔軟なルーティング
- • Kafka - 高スループット、永続化
- • SQS - マネージド、AWSネイティブ
⚡ Cache
レスポンス高速化、DB負荷軽減、セッション管理
- • Redis - 多機能、データ構造豊富
- • Memcached - シンプル、分散キャッシュ
- • Varnish - HTTPキャッシュ特化
ミドルウェア選定の観点
| 観点 | 確認事項 | 例 |
|---|---|---|
| スループット | 想定RPS、メッセージ量 | Kafka: 100万msg/sec可能 |
| レイテンシ | 許容される遅延 | Redis: sub-ms応答 |
| 耐障害性 | SPOF回避、レプリケーション | RabbitMQ: ミラーリングキュー |
| 運用負荷 | セルフホスト vs マネージド | SQS: 運用不要 |
| 既存連携 | 言語SDK、エコシステム | Nginx: PHP-FPM連携実績豊富 |
ミドルウェア障害調査の共通フロー
障害発生
│
▼
┌─────────────────────────────────────────┐
│ 1. どのレイヤーで止まっているか特定 │
│ - LB → Web Server → App → DB │
│ - 各レイヤーのログ確認 │
└─────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────┐
│ 2. エラーの種類を分類 │
│ - 接続エラー(Connection refused) │
│ - タイムアウト(504, timeout) │
│ - リソース枯渇(Too many open files) │
│ - 設定エラー(Permission denied) │
└─────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────┐
│ 3. メトリクスとログの相関 │
│ - CPU/Memory/Disk I/O │
│ - Connection数、Queue深度 │
│ - エラーログのタイムスタンプ │
└─────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────┐
│ 4. 設定値の確認 │
│ - 制限値(max_connections, buffer) │
│ - タイムアウト値 │
│ - ワーカー/プロセス数 │
└─────────────────────────────────────────┘
よくある調査コマンド
# 接続状態確認
ss -tlnp | grep nginx
netstat -an | grep ESTABLISHED | wc -l
# プロセス状態
ps aux | grep [n]ginx
pstree -p $(pgrep -o nginx)
# ファイルディスクリプタ
ls /proc/$(pgrep -o nginx)/fd | wc -l
cat /proc/$(pgrep -o nginx)/limits | grep "open files"
# ログ確認(リアルタイム)
tail -f /var/log/nginx/error.log | grep -E "(error|crit|alert)"
# 接続テスト
curl -I -w "time_total: %{time_total}s\n" http://localhost/health