ストリーミングファイルだけ他のサーバから配信する

動画ファイルの配信だけ Web サーバ本体では無くて、別のサーバから配信したいけど WordPress とかいじりたくなかったので Nginx だけいじって対応しましたよってお話です。
いわゆるオレオレCDN( Nginxを使ったオレオレCDNの構築 )ですな。

構成的には上図のようになります。
要望的には html とか css, js, なんかは web サーバから配信したいんだけど、ネットワーク帯域を消費しまくる動画ファイル ( mp4, webm, ogv, flv ) だけは別サーバで配信したい。
素早く対応したいから WordPress のプラグインとか作らないで、Nginx の設定だけで済ませたいって感じです。

どうやって実現したかというと

Web サーバは www.example.com、コンテンツ配信サーバは DNS ラウンドロビンで振り分けられた 192.168.0.1, 192.168.0.2 という IP アドレスを持つ static.example.com ってサーバだとします。

Reverse Proxy Cache – コンテンツ配信側

コンテンツ配信側の nginx.conf は、以下のように設定しました。

http {
  # proxy cache
  proxy_cache_path  /var/cache/nginx/proxy_cache levels=1:2
                      keys_zone=czone:32m max_size=256m inactive=1440m;
  proxy_temp_path   /var/cache/nginx/proxy_temp;
  proxy_cache_key   "$scheme://$host$request_uri";
  proxy_set_header  Host               $host;
  proxy_set_header  X-Real-IP          $remote_addr;
  proxy_set_header  Remote-Addr        $remote_addr;
  proxy_set_header  X-Forwarded-Host   $host;
  proxy_set_header  X-Forwarded-Server $host;
  proxy_set_header  X-Forwarded-For    $proxy_add_x_forwarded_for;
  proxy_hide_header Vary;
  proxy_connect_timeout 5;
  proxy_send_timeout 10;
  proxy_read_timeout 120;
  proxy_cache_use_stale timeout invalid_header http_500 http_502 http_503 http_504;
  proxy_cache_lock on;
  proxy_cache_lock_timeout 5s;

  server {
    listen       80;
    server_name  static.example.com;

    location ~* /www.example.com/.*\.(mp[34]|flv|webm|ogv)$ {
      flv;
      mp4;
      mp4_buffer_size 1m;
      mp4_max_buffer_size 20m;

      resolver 127.0.0.1;

      rewrite ^/www.example.com/(.+) $1 break;

      proxy_cache        czone;
      proxy_cache_key    "$scheme://$host$request_uri";
      proxy_set_header   Host 'www.example.com';
      proxy_pass         http://www.example.com:8080/$1;
      proxy_cache_valid  200 365d;
    }
  }
}

http://static.example.com/www.example.com/{オリジナル URL} って URL へのアクセスが来た場合、オリジンサーバの 8080 ポートに接続してファイルを取ってきてキャッシュします。
あとでオリジンサーバ側の設定も書きますが expires 365d にしているので、キャッシュは1年間このサーバ上に保持されます。

Origin – Web サーバ側

こっちは server ディレクティブだけ書いておきます。

まずはリバースプロキシサーバから要求される 8080 ポートの設定。

server {
  listen       8080;
  server_name  www.example.com;
  root         /var/www/html;

  allow 192.168.0.1;
  allow 192.168.0.2;
  deny all;

  location / {
    expires 365d;
  }
}

IP アドレスを制限してリバースプロキシサーバ以外からの接続を禁止します。
アレなら iptables も設定して 8080 への接続をしぼっちゃっても良いですね。

次に通常の 80 ポートの設定

server {
  listen       80;
  server_name  www.example.com;
  root         /var/www/html;

  location ~* \.(mp[34]|flv|webm|ogv)$ {
    rewrite ^(.*)\.(mp[34]|flv|webm|ogv) http://static.example.com/$host$request_uri permanent;
  }

  :
}

拡張子が .mp3, .mp4, .flv, .webm, .ogv の場合はコンテンツ配信側のサーバに 301 リダイレクトさせちゃいます。
これで Web アプリケーションをいじらなくても良いっすね。

それでは、よい動画配信ライフを!

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください