2010年12月9日木曜日

Amazon S3のファイルを国内VPS(nginx)にキャッシュして配布

今作っているサービスで、ユーザのプロフィール画像をとかを保存、配布するために作成。
サーバはほぼEC2に置いているので、画像とかは一旦S3に保管する予定。とはいえS3だと遅すぎるのでCloudFrontにするか自前で何か作るかを検討。
CloudFrontでもいいんだけど従量制だし、あれってCloudFrontのアドレスになった気がするから国内VPSに設置を。

思いついたのはdankogaiさんのこの記事から。

結果としては一応できていそうな感じで、こういった状態


http://img.catary.net/s/01_200.jpg
※画像については深く気にしないように

実体のファイルはS3のBucketにあり、nginxのReverseProxy+CacheでVPSにロードしています。
静的ファイルとプロフィール画像は基本的に同じURL=内容は変わらないという設計にしているのでサーバの力が持つ限りキャッシュを保持するように設定をする予定。(今は検証中なんで短時間の保持に)



最終的な環境ではかなり楽に構築できるけど、ここまで来るのには結構時間かかった。
  • Apache→ReverseProxy、CacheはあるがReverseProxy+Cacheができない。これに気付かなくて暫く詰まった、、、
  • Squid→動作自体はできたが、S3に繋がらない。おそらく送出ヘッダの問題なんだが設定がうまくまわらないので一旦他のを試してみることに
  • Pound→キャッシュ機能ない?
  • nginx→サクっといけた!!!!
ということでnginx採用。

手順メモ


nginxの導入はEPELからリポジトリもってきてyumで導入(のつもり)
wget http://download.fedora.redhat.com/pub/epel/5/[arch]/epel-release-[version].noarch.rpm
rpm -ivh epel-release-[version].noarch.rpm
yum install nginx
ln -s /etc/rc.d/init.d/nginx /etc/rc.d/rc3.d/S88nginx
Reverse Proxyの設定は
のサイトを参考。

これをベースにロケーション部分を
location /s {
proxy_pass http://s3-us-west-1.amazonaws.com/bucket-name; ~ }
みたいな感じにして各locationをS3のURLに置くだけ。
今のところ存在しないファイルを指定しようとするとレスポンスがそのまま帰ってきてしまうのでそこはどうにかしたい。

EC2使ってて、国内にファイル配信する場合はこういうのでもいいんじゃないでしょうか。

0 件のコメント:

コメントを投稿