Date: 2014/5/20 Cate: rails Tags: ,  

Railsで画像アップロードをするときに、CarrierWaveというgemが便利なので使っています。
簡単設定でS3にアップロードとかもできて大変便利で、さらにフォームのバリデーションが通らなかったときも画像のキャッシュを持っててくれたりしてありがたいのですが、このキャッシュが複数台サーバーで運用するときにクセモノで結構ハマりました。

フォームで画像を選択して、一旦フォームの確認画面を挟んでから投稿する、というものを作っていたのですが、この確認画面でCarrierWaveのキャッシュを使おうとすると、たとえば本番環境でサーバーが2台以上で構成されていると、サーバーAに画像がアップロードされて、そのあとの確認画面からの修正画面へのアクセスがサーバーBにいったりする、みたいになると、画像のファイル自体はサーバーAにしか存在しないためうまく動かなくなるのです。

キャッシュもS3にあげてくれたらなー、とかおもったのですがそれのやりかたはいまいちわからず・・・。
結局、キャッシュファイルが保存されるディレクトリをnfsをつかって各サーバーで共有することにしました。
nfsのやり方は
[CentOS6] NFSサーバ構築 – OSSでLinuxサーバ構築
rpcinfo -p …

こちらがわかりやすかったです!有難う御座います。
AWSで動かしているんですが、SecurityGroupでTCPの111と2049をあけることを忘れないように。

さらに、S3連携でfogをつかっているのですが、fogのasset_hostがS3用URLに設定されていると、S3にアップロードされていないのにキャッシュ画像のURLがS3のURLになっちゃって困ったので、

 Hoge.image.asset_host = "http://example.com"

とむりやりasset_hostを書き換えたりもしました。

なんかイマイチなやり方な気がするのですが、もっとうまいやりかたあったら知りたいです・・・!
キャッシュをS3に保存するのが一番スマートな気もするのですが・・・。

Leave a Reply