動画ファイルの配信だけ 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 アプリケーションをいじらなくても良いっすね。
それでは、よい動画配信ライフを!