質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

ロードバランサー

ロードバランサー【負荷分散装置】は、複数のサーバへアクセス要求を分散する装置です。 要求を分散することで各サーバが快適な応答速度を保つことを目的としており、 アクセスの多い大規模サイト等は、この装置により 複数のサーバに負荷を分散する事で安定な運用が可能です。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Q&A

解決済

2回答

3266閲覧

AWSでRailsアプリをロードバランサーを使って2つのEC2インスタンスに負荷を分散したい

safs

総合スコア10

nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

ロードバランサー

ロードバランサー【負荷分散装置】は、複数のサーバへアクセス要求を分散する装置です。 要求を分散することで各サーバが快適な応答速度を保つことを目的としており、 アクセスの多い大規模サイト等は、この装置により 複数のサーバに負荷を分散する事で安定な運用が可能です。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

0グッド

0クリップ

投稿2019/01/20 15:23

編集2019/01/20 15:29

前提・実現したいこと

AWS初心者です。

Railsアプリを、ELB(ロードバランサー)を使って、2つのEC2インスタンスに分散しようとしています。

Route53でAレコードにELBのDNSを設定、
EC2インスタンス(Elastic IPから関連付け済み)が1つの段階では、ELBを前において、セキュリティグループもELB経由に変更してEC2に接続、サービスを動かせるところまではできています。

発生している問題・エラーメッセージ

https://qiita.com/okamu_/items/c051156e44c4fbd65234
↑の記事のように、AMIイメージを作成→2つ目の異なるアベイラビリティゾーンのEC2インスタンスを作成まで行いました。

ですが、2つ目のEC2インスタンスにはElastic IPも設定されておらず、当然ながらサイトは表示されません。

ロードバランサーにインスタンスを追加、ステータスは2つともInServiceの状況にはなるのですが、サイトにアクセスすると、サイト表示(最初に作ったEC2)→エラーページ(追加した2つ目のEC2)→サイト表示→エラーページの繰り返しです。分散はできているようですが、片方表示されない・・・(考えれば当たり前なんですが)。

このAMIイメージから追加した2つ目のEC2インスタンスは、nginxでどのような扱いをすればうまくロードバランサーで分散できるのでしょうか?
また、ロードバランサーで分散する際の、最初のEC2インスタンスに紐付いたElastic IPの扱いなど、運用方法の概要をご教示いただけましたら幸いです。

補足情報(FW/ツールのバージョンなど)

利用しているのは
Rails5.2 / nginx / puma / EC2 / Route53 /RDS(MySql) / ELB
といった環境です(不足していたら教えてください)。

nginxのconfファイルは↓のような感じです。

upstream puma { server unix:/var/www/サービス名/shared/tmp/sockets/puma.sock; } server { listen 80; server_name ドメイン; access_log /var/www/サービス/shared/log/nginx_access.log; error_log /var/www/サービス/shared/log/nginx_error.log; root /var/www/サービス/current/public; include /etc/nginx/default.d/*.conf; location / { try_files $uri $uri/index.html $uri.html @webapp; } location @webapp { proxy_read_timeout 300; proxy_connect_timeout 300; proxy_redirect off; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_pass http://puma; } #エラーページの設定 error_page 500 502 503 504 /500.html; }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

EC2は2つとも同じ状態にしましょう。
デプロイしてあるもの、各サービスの起動状態は間違っていませんか?

セッションの管理はどこで行っていますか?
セッションの管理があるなら、取り急ぎはELBでSticky Sessionの設定を有効化すれば表示されるようになると思います。

投稿2019/01/21 06:37

moonphase

総合スコア6621

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

safs

2019/01/21 15:44 編集

moonphase様、ご回答ありがとうございます。 https://aws.amazon.com/jp/getting-started/projects/scalable-wordpress-website/03/01/ こちらを参考に、最初のEC2インスタンスからAMIを作成→2個めのEC2インスタンスを作成という手順をとったのですが、これだけでは同じ状態にならないのでしょうか?? また、片方(最初に作ったEC2)は新たに追加したユーザーでSSHログインをしているのが原因かもと推測しています。 >セッションの管理はどこで行っていますか? Elastic CacheのRedisで行っています。 >ELBでSticky Sessionの設定を有効化 知識不足ですいません。こちら初めて聞いたので調べて試してみます。 希望のとっかかりが見えました、ありがとうございます。 改めてSticky Sessionを中心に試してみて近日中に進歩を投稿させていただければと思います。 取り急ぎ御礼まで。
moonphase

2019/01/22 05:40

セッション管理をElastic Cacheで行っているのであれば、通常Sticky Sessionは不必要かと思います。 試しに、1個目のEC2をELBから解除し、2個目のみにした場合は正常に表示されますでしょうか?
safs

2019/01/22 18:21 編集

ご返信ありがとうございます。 >試しに、1個目のEC2をELBから解除し、2個目のみにした場合は正常に表示されますでしょうか? こちら2個目のAMIから作成したEC2インスタンスのみにしたら表示されません。 nginxエラー画面と交互に表示されていたのが、1個目を解除した途端にnginxエラーページのみが表示されています。2つのEC2を同じ状態にするためにいじらないようにしているのですが・・・。 1つ目のEC2はElastic IPと紐付いているのですが、2つ目のEC2は紐付いていないのが原因だと推測しています。 Elastic IPを設定しないとサイトを表示させられない、でもELBを使う際にはElastic IPがあると2つ目のインスタンスが1つ目の正常なEC2と完全に同じ状態にならなくてエラーが出るというジレンマに陥っています。 また、(関係があるかはわかりませんが)1つ目のEC2は独自ユーザーを追加しておりssh ◯◯_keyでログイン可能な状態、2つ目はまだデフォルトのec2-userでssh -i ◯◯.pem ec2-user@◯◯.compute.amazonaws.comしかログインできない状態です。 【1つ目のEC2で参考にした記事】SSH通信によるインスタンスへのログイン https://qiita.com/naoki_mochizuki/items/814e0979217b1a25aa3e ロードバランサーで複数インスタンス間を自在にやり取りをさせるのはどのようなやり方がスタンダードなのでしょうか?(nginx等WEBサーバーで切り替える?) Elastic IPとは共存できないのでしょうか? 調べ方がいまいちわからず設定方法までしか出てこなくて困っております・・・。 素人質問ですいません。。 何を調べたら良いなど概要だけでもご教示願えましたら幸いです。
moonphase

2019/01/22 23:21 編集

ELBのヘルスチェックの設定内容、EC2:1とEC2:2のヘルシー状態を教えてもらえますか。 追加で、特殊な構成を行っていない限り、Elastic IPの有無は今回のエラーとは無関係と考えています。
safs

2019/01/23 03:56

ヘルスチェックの設定内容は以下の通りです。 ping ターゲット HTTP:80/ タイムアウト 5 秒 間隔 10 秒 非正常のしきい値 2 正常のしきい値 5 恥ずかしながらヘルシー状態ってなんだろう?と調べたら、ターゲットグループのターゲットのステータスで正しいですかね? 初めてターゲットグループを確認しましたが、ターゲットグループのターゲットは両方共「unused」でした・・・。原因これですか・・・。 ロードバランサーのインスタンスのステータスは両方共InServiceだったのでこれでOKなはずと思っていました・・・。 ちょっと調べてみます。ありがとうございます。
safs

2019/01/23 18:08

CLBなのでターゲットグループは関係ありませんでした。 問題は解決していませんが、おそらく原因はわかってきたのでここで一度閉じたいと思います。 ありがとうございました!!
guest

0

自己解決

いろいろ調べた結果、最初はElastic IPなどのIPの設定が原因かと思っていたのですが、
Nginx関連のエラーだということがわかってきました。

片方はうまくいっていても片方はうまくいっていない原因は調査中ですが、
方向性は見えたのでここで一度閉じたいと思います。

ありがとうございました!

投稿2019/01/23 18:12

safs

総合スコア10

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問