質問: プログラミング初心者です。 質問内容に分かりにくい点があるかもしれませんので、足りない部分は聞いていただけると幸いです。 railsで作成したアプリをAWSにVPCを作成してEC2でデプロイしました。 (nginxとunicornを使用) routes53で独自ドメインを取得しELBのALBを使い、elasticIPに紐づけています。 データべースはRDSインスタンスのmysqlを使用。 公開したアプリが順調だったが、アクセスが多く重くなることがあるため、サーバーの負荷分散を試みました。 イメージからEC2を複製し(同一AZ内)、ターゲットグループに追加したところ、複製元と複製後のインスタンスにアクセスが交互に振り分けられ、アプリも問題なく起動しました。 ところが、EC2をもう一台複製し(同一AZ内)ターゲットグループに追加したところ、トップページには問題なくいけるのですが、アプリの一部の機能が正常に作動しなくなりました(3台とも) 2台稼働の状態では間違いなく正常に動作しているのに、3台にすると動作しません、、、理由に検討がつかず困っています。 うまく動作しない部分は、非常にコードが長いので、一部抜粋しますと、 inputで送信された画像を、gemのminimagick処理した後、 image.write("public/user_images/#{@user.image}")で保存し、その画像を表示するという動作です。 3台体制にすると、ページ自体は遷移するのですが、その画像が表示されません。(2台体制の時は確実に表示されます、、、ちなみにストレージは使用していません。) 画像は一時的に表示されればよく、保存不要なので、ストレージは使用していないのですが、これが原因だったりするのでしょうか、、、 原因や改善方法について御回答いただけると幸いです。 --- 【追記】ちなみにアプリの構成は3ページで 1http~.com 2http~.com/users/:id 3http~.com/users/:id/show 1でuserを新規作成し、2で画像を選択3で画像処理を行い、その画像を表示。 この際に、EC23台体制にすると画像が表示されません、、、
回答: 負荷分散はあまり経験がないのですが、書かれている内容を拝見すると2台でうまく行っているのが不思議です。50%確率で発生していたのが67%確率になって目立つようになった、ということでは? 各サーバ間で Rails.rootを共有しているわけではないと思います(NFSでマウントしているとか) ということは、public/user_images は各サーバのlocalにあるので、 1)サーバ1が 画像取込みのリクエストを受け、画像を取込み、 html を返す 2) その中に書かれている 画像へのURLへのリクエストがサーバ1以外に回される。そこにはない これを避けるには 1) ストレージを使う 2) public/user_images をfile共有する 3) という新たにリクエストを発行する方法でなく、インラインで画像データを送り出す(そういう方法があるのかどうか知りません) 辺りでしょうか