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

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

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

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

Ruby on Rails

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

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

AWS(Amazon Web Services)

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

Q&A

解決済

1回答

2141閲覧

ECS上でnginxとRails(puma)が上手く連携されない。

suneokun

総合スコア5

nginx

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

Ruby on Rails

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

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

AWS(Amazon Web Services)

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

0グッド

1クリップ

投稿2020/02/28 02:25

前提・実現したいこと

ECS上でnginxとRails(puma)を連携させたい。

VPC,SUBNET,ALB,SGは設定済
CLUSTER,SERVICE,TASK DEFINITION(一つのTASKでnginxとRailsコンテナ起動)を作成済で
下記QIITA記事をほぼそのままコピペしECRへpush済。
※nginx.conf内のserver_nameはALBのDNS名を指定。

https://qiita.com/eighty8/items/0288ab9c127ddb683315

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

ALBのDNS名にアクセスするとnginxのウェルカムページが表示される。
想定しているのはRailsのウェルカムページなので
nginxとpumaのソケット通信が上手くいってないんじゃないかと思い
色々なサイトで調査したが原因が見つかりませんでした。

taskのRailsのログを見ると
puma側ではUse Ctrl-C to stopと最後のメッセージで表示されているので
正常に起動していると判断。
※タスク定義のコマンドにてbundle exec puma -C config/puma.rbを指定
間違っていましたらすみません。
しかしRailsのウェルカムページが表示されない。
ターゲットグループのターゲットタブでは502ステータスが返されてunhealthyとなっている。
※それぞれのtaskにてstatusがrunningとなっているのに502で返されている理由もわかりません。

試したこと

下記qiita記事にて
"Rails の静的コンテンツ (public/ 配下) を
Nginx で処理するため && Rails-Nginx 間でソケット通信を行うために,
Ⅰ.config/puma で bind "unix://#{app_root}/tmp/sockets/puma.sock" する
Ⅱ.Dockerfile (Rails イメージ) で VOLUME /app/public, VOLUME /app/tmp を指定する
Ⅲ.Task Definition の Nginx コンテナパートで volumesFrom を指定する"
と記載があったためDockerfileとタスク定義にて反映しましたが何も変わりませんでした。

https://qiita.com/na-o-ys/items/d96829e27a294903c42d

私の理解不足なんですが
どなたが教えて下さる方がいらっしゃったら嬉しいです。
宜しくお願い致します。

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

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

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

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

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

yukky1201

2020/02/28 03:25

設定をコピペで実施していると、下記ファイルにログが出力されていると思うので、質問に追記すると事象の確認がしやすいです。 access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log;
suneokun

2020/02/29 00:37

yukky1201さん ご指摘頂きありがとうございます。 ご指摘頂きましたことを早速、追記したいと思い nginx.confに設定している上記パスの2ファイルを 起動しているnginxコンテナに入りcatでファイルの中身を確認しようとしたところ コマンドラインのまま中々、内容が表示されないのでCtrl+Cで抜けました。 上記のファイルの開き方が間違っているのでしょうか。 ネットで同様のファイルの開き方を調べましたら catで開いていたので問題ないとはおもっておりましたが 何か見落としている点などってございますでしょうか。 教えて頂けましたら嬉しいです。 何卒宜しくお願い致します。
guest

回答1

0

ベストアンサー

設定ファイルについて

nginxの設定ファイル

server unix:///webapp/tmp/sockets/puma.sock;

とconfig/pumaの

bind "unix://#{app_root}/tmp/sockets/puma.sock"

の部分のパスが一致してる必要があります。
puma.sockファイルは双方で共通のパスであればどこに置いてもいいです。
適切に設定してみてください。
この例だと#{app_root}がwebappになってる必要があります。
また双方のパスの最初のダブルスラッシュ//は不要なはずです。(あっても問題ないかも)

Docker volumeについて

ここでやりたいことはsocketとrailsアプリのpublicディレクトリに双方のコンテナからアクセスできるようにすることです。
上の設定ファイルと合わせてアプリのルートディレクトリが間違ってないかなど確認してみてください。
上に合わせるなら/webapp/public /webapp/tmpになるはずです

そもそもDockerfileでビルド時にRailsアプリをどこに展開したかも確認してください。

またECSがEC2タイプならEC2インスタンスにSSHで接続してnginxコンテナから、/webapp/public等が見えるか確認してみてください
見れないようなら、Dockerのvolume関連の設定が間違ってます。

投稿2020/02/28 04:01

ozroro

総合スコア97

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

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

suneokun

2020/03/01 03:16

ozroroさん ご回答頂きましてありがとうございます。 教えて頂いて点を色々ためしたり調査したりしておりまして ご連絡遅くなってすみません。 教えて頂きました2点について ①puma.rbとnginx.confのソケットパスは正しいようです。  ※puma.stdout.logなどがwebapp/logに作成されているので   #{app_root}が/webappのパスを指定されています。 ②nginxコンテナに/webapp/publicが見当たりませんでした。 関係あるが分かりませんが 私がdockercompose.ymlを作成せず ECSのタスク定義コンソールで指定し設定しました。 内容は下記となります。 "containerDefinitions": [ { "dnsSearchDomains": null, "logConfiguration": { "logDriver": "awslogs", "secretOptions": null, "options": { "awslogs-group": "portfoliologs", "awslogs-region": "ap-northeast-1", "awslogs-stream-prefix": "web" } }, "entryPoint": null, "portMappings": [ { "hostPort": 0, "protocol": "tcp", "containerPort": 80 } ], "command": null, "linuxParameters": null, "cpu": 0, "environment": [], "resourceRequirements": null, "ulimits": null, "dnsServers": null, "mountPoints": [], "workingDirectory": null, "secrets": null, "dockerSecurityOptions": null, "memory": null, "memoryReservation": null, "volumesFrom": [ { "sourceContainer": "app_rails", "readOnly": null } ], "stopTimeout": null, "image": "630131780856.dkr.ecr.ap-northeast-1.amazonaws.com/app_nginx:latest", "startTimeout": null, "firelensConfiguration": null, "dependsOn": [ { "containerName": "app_rails", "condition": "START" } ], "disableNetworking": null, "interactive": null, "healthCheck": null, "essential": true, "links": null, "hostname": null, "extraHosts": null, "pseudoTerminal": null, "user": null, "readonlyRootFilesystem": null, "dockerLabels": null, "systemControls": null, "privileged": null, "name": "app_nginx" }, { "dnsSearchDomains": null, "logConfiguration": { "logDriver": "awslogs", "secretOptions": null, "options": { "awslogs-group": "portfoliologs", "awslogs-region": "ap-northeast-1", "awslogs-stream-prefix": "app" } }, "entryPoint": [], "portMappings": [], "command": [ "bundle", "exec", "puma", "-C", "config/puma.rb" ], "linuxParameters": null, "cpu": 0, "environment": [], "resourceRequirements": null, "ulimits": null, "dnsServers": null, "mountPoints": [], "workingDirectory": null, "secrets": null, "dockerSecurityOptions": null, "memory": 300, "memoryReservation": null, "volumesFrom": [], "stopTimeout": null, "image": "630131780856.dkr.ecr.ap-northeast-1.amazonaws.com/app_rails:latest", "startTimeout": null, "firelensConfiguration": null, "dependsOn": null, "disableNetworking": null, "interactive": null, "healthCheck": null, "essential": true, "links": null, "hostname": null, "extraHosts": null, "pseudoTerminal": null, "user": null, "readonlyRootFilesystem": null, "dockerLabels": null, "systemControls": null, "privileged": null, "name": "app_rails" } ], "placementConstraints": [], "memory": "512", "taskRoleArn": "arn:aws:iam::630131780856:role/ecsTaskExecutionRole", "compatibilities": [ "EC2" ], "taskDefinitionArn": "arn:aws:ecs:ap-northeast-1:630131780856:task-definition/portfolio1:17", "family": "portfolio1", "requiresAttributes": [ { "targetId": null, "targetType": null, "value": null, "name": "com.amazonaws.ecs.capability.logging-driver.awslogs" }, { "targetId": null, "targetType": null, "value": null, "name": "ecs.capability.execution-role-awslogs" }, { "targetId": null, "targetType": null, "value": null, "name": "com.amazonaws.ecs.capability.ecr-auth" }, { "targetId": null, "targetType": null, "value": null, "name": "com.amazonaws.ecs.capability.docker-remote-api.1.19" }, { "targetId": null, "targetType": null, "value": null, "name": "com.amazonaws.ecs.capability.task-iam-role" }, { "targetId": null, "targetType": null, "value": null, "name": "ecs.capability.container-ordering" }, { "targetId": null, "targetType": null, "value": null, "name": "ecs.capability.execution-role-ecr-pull" } ], "pidMode": null, "requiresCompatibilities": [ "EC2" ], "networkMode": "bridge", "cpu": "512", "revision": 17, "status": "ACTIVE", "inferenceAccelerators": null, "proxyConfiguration": null, "volumes": [] } docker-compose.ymlで設定できる内容は タスク定義では指定できないのでしょうか。 教えて頂けますと嬉しいです。 宜しくお願い致します。
ozroro

2020/03/01 05:45

恐らく、app_rails側のコンテナになにもvolumeが割り当てられていないので nginx側でvolumes_fromしても受け取るものがないのだと思います。 app_rails側にrailsアプリのルートディレクトリを含むようにタスク定義でvolumeを割り当ててみてください。
suneokun

2020/03/02 03:27

ozroroさん ご回答頂きましてありがとうございます。 app_rails側で/webapp/public,/webapp/tmpをvolumeで指定し app_nginx側でvolumeコンテナをapp_railsの各上記パスに指定しました。 今、気づきましたが ECSのタスク定義にてスタートアップ依存関係を app_railsが起動後(START)にapp_nginxを起動する関係にしておりまして app_rails側でサーバー起動完了せずともnginxが起動しており nginxウェルカムページが表示されているのでは無いかと思いましたが 関係ってありますでしょうか。 上記が原因だとすると app_rails側にてhealthcheckしhealthyだった場合に app_nginxを起動するようにした方が良いと思い 下記URLを参考にそれぞれの参考コマンドのURL部分をhttp://0:0:0:0:3000に変更し  参考コマンド:curl -s -S -o /dev/null http://$HOSTNAME         CMD-SHELL,curl -f http://localhost/ || exit 1 タスク定義を更新してサービスも更新し実行しましたが healthチェックが上手くいかずapp_nginx側のコンテナが実行されなくなりました。 https://knowledge.sakura.ad.jp/6754/ https://dev.classmethod.jp/cloud/aws/ecs-healthcheck/ 依存関係が原因とする時 railsサーバー起動を確認するヘルスチェックコマンドは 上記で宜しいんでしょうか。 度々の質問で申し訳ございません。 お手数おかけしますが 教えて頂けますと嬉しいです。 何卒宜しくお願い致します。
ozroro

2020/03/02 11:19

そこの起動順の依存関係は関係ないと思います。 今ローカルでちょっと試してみましたが、先にnginxサーバーだけ立ち上げて、後からrails立ち上げたとしても問題はないです。 後今気づいたんですがnginxとrailsの疎通での問題なら、エラー500のページが返ってくるので、 ウェルカムページが表示されるということはnginxの設定の問題じゃないでしょうか。 見直してもし分からないようならnginx.confを質問の方に追記してください。
suneokun

2020/03/03 01:18

ozroroさん ご回答頂きましてありがとうございます。 今、ページにアクセスすると仰るとおり502エラーが返される場合もあったり Rails側で下記エラーが起こったりを交互に行ったり来たりしております。 Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2 "No such file or directory") ちなみにRDSに繋ぐつもりでしたので DBコンテナは作らずに環境を構築しておりましたし RailsのウェルカムページはDBが存在しなくても表示されると思っておりました。 上記認識が間違っていますでしょうか。 一応、念のためnginx.confの設定内容を下記に貼り付けます。 #プロキシ先の設定 #nginxが受け取ったリクエストをバックエンドのpumaに送信 upstream webapp { # ソケット通信したいのでpuma.sockを指定 server unix:///webapp/tmp/sockets/puma.sock; } server { listen 80; # ドメインもしくはIPを指定 server_name loadbalancer1-1156268830.ap-northeast-1.elb.amazonaws.com; access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; # ドキュメントルートの指定 root /webapp/public; client_max_body_size 100m; error_page 404 /404.html; error_page 505 502 503 504 /500.html; try_files $uri/index.html $uri @webapp; keepalive_timeout 5; # リバースプロキシ関連の設定 location @webapp { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_pass http://webapp; } } 度々のご質問でお手数おかけしますが 教えて頂けますと嬉しいです。 何卒宜しくお願い致します。
ozroro

2020/03/03 04:09

nginxとrails間の通信はできてそうですね。 >RailsのウェルカムページはDBが存在しなくても表示される これは違いますね。dbとの疎通は必要なようです。 チュートリアルなんかで最初に動作確認するときは大抵sqlite3なんで分からないですが 例えばローカルで rails new newapp -d mysql という感じで新しいmysqlのプロジェクトを作ってサーバー接続できない状態で試してみたら分かると思います。 とりあえず試したいだけならDBをsqliteなんかに変えちゃえばウェルカムページの表示はできるんじゃないでしょうか。 今更のはなしになっちゃいますがローカルでdocker-composeでの構築を先にしといた方がそういったトラブルも減らしやすいし、デバッグもしやすいです。 若干遠回りに感じるかもしれませんが、結局は必要になる技術なんで取り組んでみることをお勧めします。DB設定なんかは環境変数から読み込むようにしとけば、ローカルでは.envファイルECSではタスク定義で指定できますよ。
suneokun

2020/03/03 07:11

ozroroさん ご回答頂きありがとうございます。 そうなんですね。 チュートリアルは一通りやったのですが その時は確かにsqlite3だったので今回のエラーが発生しなかったので分かりませんでした。 なるほど。 ローカルではECSが使えないので docker-compose.ymlで構築し ECSで上記内容に合わせていくんですね。 ECS上で環境構築する事を紹介している記事で docker-compose.ymlを作成していたのは おそらくそういう事だったのですね。 大変勉強になりました。 これからMYSQLでポートフォリオを作成していこうと 考えていますので引き続き進めていこうと思います。 度々の質問にお忙しい中 ご回答頂きましてありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問