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

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

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

Unicornは、汎用のRackアプリケーションサーバ。RackとWebサーバーの機能を併せ持ちます。レスポンス処理や、Nginx単体がRackの機能をサポートしていない事から、一般的にはNginx+Unicorn+Railsの構成を取って用います。

Ruby on Rails 6

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

Amazon EC2

Amazon EC2は“Amazon Elastic Compute Cloud”の略称です。Amazon Web Services(AWS)の一部であり、仮想化されたWebサーバーのコンピュータリソースをレンタルできるサービスです。

AWS(Amazon Web Services)

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

Q&A

解決済

1回答

930閲覧

アプリケーションサーバーのunicornが起動できません。

dcg

総合スコア3

unicorn

Unicornは、汎用のRackアプリケーションサーバ。RackとWebサーバーの機能を併せ持ちます。レスポンス処理や、Nginx単体がRackの機能をサポートしていない事から、一般的にはNginx+Unicorn+Railsの構成を取って用います。

Ruby on Rails 6

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

Amazon EC2

Amazon EC2は“Amazon Elastic Compute Cloud”の略称です。Amazon Web Services(AWS)の一部であり、仮想化されたWebサーバーのコンピュータリソースをレンタルできるサービスです。

AWS(Amazon Web Services)

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

0グッド

0クリップ

投稿2022/07/29 15:45

編集2022/08/18 14:59

イメージ説明

テラタームでEC2にssh接続している環境で、unicorn_rails -c config/unicorn.rb -E production -Dを叩いて、アプリケーションサーバーのunicornを起動させようとしたのですが、画像のように

directory for pid=/home/ec2-user/raisetech-live8-sample-app/unicorn.pid not writable (ArgumentError)

というエラーが出ました。

書き込み権限のエラーだと思ったので、sudo chown -R username:username /home/ec2-user/~を打ってみても変わらず同じエラーが出てしまいます。

試しに cd ~ でディレクトリを変えて、Railsを起動してみると次は、

rbenv: unicorn_rails: command not found

The `unicorn_rails' command exists in these Ruby versions:2.6.3

というエラーが出ます。

これは、Railsのgemが入っていないと思い、

#gem のupdate
$ gem update --system
#bundler のinstall
$ gem install bundler
#rails のinstall
$ gem install rails

を行って、bundle updateしてもエラー内容は変わらずです。

どなたか助言をお願いします。

ー-----------------------------------------

ls -lを打った結果です。

イメージ説明

unicorn.rbファイルの出力先を/var/www/~に変更しました。

イメージ説明

/var/www/~上でサイド起動コマンドを打ちました。

イメージ説明

権限を与えるためにchownコマンドを打ちました。

イメージ説明

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

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

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

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

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

guest

回答1

0

ベストアンサー

これは毎回言ってるのですが、ホームディレクトリにアプリケーションのソースを配置するのはやめましょう。
ホームディレクトリは、ホームディレクトリの所有者(と、root)以外は通常アクセスできないようにされています。
だからといってホームディレクトリの権限を下手にいじるとSSHログインできなくなることがあります。
SSHが鍵認証されないとき、パーミッションを疑え。
もちろん適切に権限を振ることによって避けることもできますが、オペミスしたときの影響が致命的なので触らないほうがいいです。

/var/www/配下などにディレクトリを作成して、適切に権限を振ってそこにソースを配置してください。
例えば/var/www/htmlはAmazon Linux2ではApacheのデフォルトのDocumentRootになっています。
nginxではAmazon Linux2におけるデフォルトのDocumentRootは/usr/share/nginx/htmlだったりしますが、個人的には/var/www配下にあるほうがしっくり来ますね。

ホームディレクトリに配置する場合、フレームワーク単体で動かすならフレームワークを起動するユーザーのホームディレクトリであれば問題なく動きますが、nginxと連携させるなどする場合アクセス権限でハマります。

今回はホームディレクトリ配下にソースを配置したのになぜホームディレクトリのユーザーと同じユーザーで起動しようとして権限のエラーになってるのかわかりませんが、所有者がrootになってたりしませんかね。

試しに cd ~ でディレクトリを変えて、Railsを起動してみると

肝心のソースがそこにないので意味がありません。
cd ~と打つとホームディレクトリの直下(この場合/home/ec2-user)に移動します。
Railsをグローバルインストールしていない以上、そこにはunicorn_railsは存在しないので見つかりません。(グローバルインストールすることは通常ほとんどありません。)
また、ホームディレクトリ直下にGemfileがないのでbundle updateしようにも対象が見つからないでしょう。

投稿2022/07/30 05:39

yu_1985

総合スコア7445

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

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

dcg

2022/08/15 09:55

cd ~でディレクトリを変えて、Railsを起動しても肝心のソースがそこにないので意味がないことにやっと気づきました。 cd ~と打つとホームディレクトリの直下(この場合`/home/ec2-user`)に移動してしまいます。 Railsをグローバルインストールしていない以上、そこにはunicorn_railsは存在しないので見つからないに決まってますよね…。 また、ホームディレクトリ直下にGemfileがないのでbundle updateしようにも対象が見つからないですね。 なので、僕としては、これ以上ディレクトリを下手に変えて迷子になるよりは、/var/www/サンプルアプリ名 のディレクトリで起きた directory for pid=/home/ec2-user/raisetech-live8-sample-app/unicorn.pid not writable (ArgumentError) というエラーを解決して進めたいと思ってます。 ただ上記のエラーも調べてもあまり直接的な解決法が分からなくて、停滞しています。
yu_1985

2022/08/15 10:14

スクリーンショットではディレクトリ名しかわからないので、まず自分がどこにソースファイルを配置しているのかきちんとわかるようなスクリーンショットを貼ってください。 該当ディレクトリで pwdとls -lを打つなどした結果を貼るといいでしょう。 仮に本当に/var/wwwに配置しているとしたら、pidファイルの配置先をホームディレクトリにしてるのが問題なのでは。 前述のとおりホームディレクトリ配下は権限問題でハマる可能性が高いので推奨しません。 ソースをホームディレクトリに置いてないとすればどこかでpidファイルの出力先を設定している部分がおかしいのでは。 unicorn.rbかどこかに指定している箇所があるはずです。
dcg

2022/08/15 12:33 編集

コメントに画像を貼れなかったので、質問欄を編集して貼りました。 画像にある通り目的のソースファイル(unicorn.pid)は無いように見えます。 だとしたら、yu_1985さんの仰る通り、どこかのファイルの出力先の設定がおかしいということになります。 そこで、unicorn.rbを見てみると、pidファイルの記述は問題ないように思えるのですが、だとしたら何が問題なのでしょうか。
yu_1985

2022/08/15 14:47

配置ディレクトリが不明なので、pwdコマンドでディレクトリのフルパスを表示してください
dcg

2022/08/16 02:29

何度も申し訳ございません。 ls -l を打った時と同じディレクトリでpwdを打った結果を質問欄に貼っておきました。
yu_1985

2022/08/16 08:22 編集

> ここで、unicorn.rbを見てみると、pidファイルの記述は問題ないように思えるのですが、だとしたら何が問題なのでしょうか。 問題大ありです。 ソケットファイルもpidファイルも`ec2-user`のホームディレクトリのパスを直書きしています。(listenとpidの行) これだとソースがどこに配置されていても`ec2-user`のホームディレクトリ配下の`raisetech-sample-app`ディレクトリ内にそれらのファイルを書き込みに行きます。 これらは他のプロセスからも参照されうるファイルなのでそもそもホームディレクトリに配置するのはあまり良くないです。(アプリケーションのソースをホームディレクトリに置くなと言った理由の一つ) 仮にそれらの配置パスを直書きするならホームディレクトリはやめてもっと汎用的なディレクトリにしてください。(もちろん書き込みが可能な権限が必要) ググると例えばグローバルの`/tmp`配下に配置している例はよく見ます(本当にそれで良いかどうかは微妙) pidファイルの置き場という意味で考えると、pidのほうは`/var/run`配下にするのもいいでしょう。 あとはプロジェクトのroot配下にtmpというディレクトリを作ってそこに配置する例もよく見ます。 ※記載漏れていたので修正 その他にも、相対パスでアプリケーションのディレクトリ内に配置する方法もあります。 たとえば下記などはそのようにしています。 https://morizyun.github.io/ruby/library-unicorn-web-server-rails.html
dcg

2022/08/16 04:55

やっと、ホームディレクトリに配置するのはよくないということがわかりました。 そもそもソースファイルの置き場所が間違っているためコマンドを打ってもエラーが出てしまうのですね。 汎用的なディレクトリを推奨するとのことでしたが var/www/raisetech-sample-app に書き換えるのはダメなのでしょうか? もちろん、/var/run/raisetech-sample-app にしてもいいのですが、元々このアプリのために wwwというディレクトリを作ったのでそれでいいんじゃないかなと思った次第です。 ただそうすると、書き込み可能な権限というのが自分が作った wwwというディレクトリにあるのかが不明なので、変なことはせず /var/run/raisetech-sample-appに書き換えたほうが良い気もします。(しかし、/var/runというディレクトリに自分がアプリを置いたことはないのでそれも変更する必要があるということでしょうか?)
yu_1985

2022/08/16 05:24

> そもそもソースファイルの置き場所が間違っているためコマンドを打ってもエラーが出てしまうのですね いいえ、そういうことではありません。コマンドが成功する云々は回答の本文の部分で解決済みで、以後は話に出していません。 ソースの配置先については今現在/var/www/raisetech-sample-appに配置されてるならそれは問題ないです。 pwdコマンドで`/var/www/raisetech-sample-app`が出力されているので既にそこにソースは配置されています。 問題はlistenとpidの出力先パスでホームディレクトリを直で指定していることです ソースの配置先と関係ありませんよね? 相対パスでアプリケーションディレクトリを指定するか、システムのグローバルなディレクトリにするかどちらかにしてください、ということを言っています。 ここではその双方について例を書いています。 汎用的にというのは、違うパスに配置しても動作させることができるように記載してくださいという意味です。 直書きすると該当のパスが存在しない時に動作しなくなります。 汎用性を求めるなら相対パスか、必ずサーバー上に存在するパスかどちらかにすべきと思います。 > /var/run/raisetech-sample-appに書き換えたほうが良い気もします 自分が例に挙げたのはpidファイルの出力先の候補としてであって、ソースの配置先としてではありません。 なぜ例に挙げたかというと、他のミドルウェア等が一般的にpidファイルを配置することが多いのがそこだからです。 そもそも/var/runに置いたとしても権限を気にしなければいけないのは変わりありません。(/var/runにソースを配置することは普通ないですが)
dcg

2022/08/16 07:44

システムのグローバルなディレクトリにする、という意味と手順がわからないので、相対パスに置き換えることにしました。 画像にあるように/var/run/raisetech-sample-appにしてあります。 ただ、変更した後も同じエラーが起きてしまうのと、今まで正常にできていたec2へのssh接続ができなくなりました。 やればやるほど悪い方向に迷っている気がして、正直折れそうです。なぜ数週間前には接続できていたのにエラーが起きるのでしょうか…。
yu_1985

2022/08/16 08:19

> システムのグローバルなディレクトリにする、という意味と手順がわからないので、相対パスに置き換えることにしました。 いえ、今やっているのがまさにグローバルなディレクトリへの配置です。 記載しているのは絶対パスです。 絶対パスと相対パスの違いについて調べてみてください。 /var/run配下にするならpidファイルを先に作成しておいて書き込み権限を付与する必要があります。 また、sockファイルもホームディレクトリに置くのはやめましょう。 SSHについては、鍵ファイルのパス指定が間違っているのではないでしょうか。 エラーメッセージをちゃんと読む癖をつけましょう。 相対パスでカレントディレクトリ内に対象の鍵ファイルがないとその指定の仕方では鍵が見つかりません。 こういう時はまさに絶対パスで指定するといいです。
dcg

2022/08/17 11:51

>/var/run配下にするならpidファイルを先に作成しておいて書き込み権限を付与する必要があります。 具体的には、ssh接続したec2にログインして、cd /var/runに移動して、touchコマンドでpidファイル(?)を作成するということでしょうか?pidファイル作成で調べてもそういう記述はないので恐らく違うと思いますが、この場合の作成の手順がわかっていません。 >SSHについては、鍵ファイルのパス指定が間違っているのではないでしょうか。 エラーメッセージをちゃんと読む癖をつけましょう。 相対パスでカレントディレクトリ内に対象の鍵ファイルがないとその指定の仕方では鍵が見つかりません。 こういう時はまさに絶対パスで指定するといいです。 3週間前にはssh -i "lecture04.pem" ec2-user@54.150.173.96というコマンドを打つだけでssh接続できました。なので、ここでいうパス指定の意味を知りません。コマンドの"lecture04.pem"の部分を絶対パスにするという意味でしょうか?ただ、"lecture04.pem"の絶対パスが何なのかをまずは確認しなければならないのですが、そもそもログインできていないのでそれすらできません。
yu_1985

2022/08/17 14:29

> cd /var/runに移動して、touchコマンドでpidファイル(?)を作成するということでしょうか? cdコマンドでカレントディレクトリを変えても、touchコマンドでフルパス指定するでもどちらでも良いと思います。 Linuxでの権限の付与はchmodでやってください。 > ssh -i "lecture04.pem" ec2-user@54.150.173.96というコマンドを打つだけでssh接続できました。 その時とコマンド実行しているディレクトリが違うんじゃないでしょうか。 "lecture04.pem"だけ指定していると、カレントディレクトリ内に"lecture04.pem"という鍵ファイルが無いと失敗します。 > そもそもログインできていないのでそれすらできません。 ログインも何も自分のローカル環境にある鍵ファイルなので、自分で配置したパスを参照してください。 さすがにそれがどこにあるかについてはわかりかねます…。
dcg

2022/08/18 14:52

Git.Bashではなく、テラタームでssh接続したらログインできました。 ソースファイルなのですが、unicorn.rbファイルの出力先を'/var/www/raisetech-live8-sample-app/unicorn.pid'にして、カレントディレクトリを/var/www/raisetech-live8-sample-appにすれば、そもそも解決するのではないかと思い、やってみたのですが、同様のエラーが出ました。 ここでまた最初の展開に戻るのですが、権限を与えるために sudo chown -R ec2user /var/www/raisetech-live8-sample-app/unicorn.pidを打ったところ、chown: invalid user: ‘ec2user’とエラーが出ました。 まずなぜ、ソースファイルの出力先とソースファイルの配置場所が合っているのに起動コマンドが正常にならないのか、それから、なぜchownコマンドを打っても、有効なユーザー名にならないのかがわかりません(ec2user以外のユーザー名を設定していません。)
yu_1985

2022/08/18 15:29

> カレントディレクトリを/var/www/raisetech-live8-sample-appにすれば カレントディレクトリは何も関係ありません。 `/var/www`にはデフォルトではunicornを起動するユーザーが書き込みする権限がないんじゃないですかね。 ec2userじゃなくてec2-userです。名前が違います。 Amazon Linuxを使っている前提です。Amazon LinuxでないOSの場合はまた別です。
dcg

2022/08/19 12:02 編集

>`/var/www`にはデフォルトではunicornを起動するユーザーが書き込みする権限がないんじゃないですかね。 ユーザー名を修正して、chownコマンドを打ったところ、chown: cannot access ‘/var/www/raisetech-live8-sample-app/unicorn.pid’: No such file or directoryとなり、ファイルがないと出ました。 このec2のインスタンスタイプはamazon linux 2なのでそれは間違いないと思います。 基礎知識がほとんどない状態でアプリのデプロイを試みた結果このようにエラーにハマってしまっています。 正直この状態からアプリを起動できるまでたどり着くイメージがわきません。 /home/ec2-user/.rbenv/versions/2.6.3/lib/ruby/gems/2.6.0/gems/unicorn-6.1.0/lib/unicorn/configurator.rb:104:in `block in reload': directory for pid=/home/ec2-user/raisetech-live8-sample-app/unicorn.pid not writable (ArgumentError) 元々このエラーを直したかったのですが、自分の知識と理解力が足りなすぎて、今何をしているのかわからなくなっていました。pidファイルの意味も内容も調べてもピンとこないレベルです。 unicornを起動しようとしても、権限がないとエラーが出る 権限を与えようとしても、そのファイルはないと出る この状態で何ができるのでしょうか。
yu_1985

2022/08/19 12:28

そりゃ、存在しないファイルの所有者を変更することはできませんね。 そもそもまだホームディレクトリ内のpidファイルを参照しようとしているんですが、まず設定ファイルの修正は行いましたか? パスを決め打ちしてますけど、まずちゃんとそのディレクトリは存在するのか、とかちゃんと確認はしましたか。 起動に至るまでになにか参照してるドキュメントはないのでしょうか。
dcg

2022/08/19 12:53

設定ファイルの修正は、質問欄の画像の通りです。 ディレクトリ自体はあるはずです。その中にファイルがない感じです(ファイルがある状態っていつからそうなるんだろう…。) https://pikawaka.com/rails/ec2_deploy この記事をそのままやっていました。
yu_1985

2022/08/20 10:25

最初にunicorn起動するまでファイルはできません。 ファイルがない状態でディレクトリ内にファイルを作ろうとすると、その該当ディレクトリに対する書き込み権限が必要です。 > directory for pid=/home/ec2-user/raisetech-live8-sample-app/unicorn.pid not writable (ArgumentError) というエラーが出ているならまだどこかしらホームディレクトリにpidを書こうとしている設定があるのではないでしょうか。 設定ファイルを直してもう一度unicornを起動しようとしても同じ状態ですか? そのままやっている割に設定ファイルの内容が違うのでは。少なくとも出力ファイルのパスを直書きしたりはしてないですよね。 一度今あるものを全て忘れてそのサイトに書いてあるとおりにやってみてはどうでしょうか。
dcg

2022/08/22 03:37

>そのままやっている割に設定ファイルの内容が違うのでは。少なくとも出力ファイルのパスを直書きしたりはしてないですよね。 一度今あるものを全て忘れてそのサイトに書いてあるとおりにやってみてはどうでしょうか。 設定ファイルを修正してもec2の内容が変更されないので紐づいてないのだと思います。 何度直しても同じエラーが起きてしまいます。 最初からリセットするのは考えてはいたのですが、おそらく全く同じ状況になる気がして躊躇してました。 もう一度やってみます。お手数おかけしました。ど素人に数々の助言ありがとうございました。
yu_1985

2022/08/22 08:36

やり直すなら別にそれでいいんですけど、該当の記述をプロジェクト内から検索することぐらいはすぐできるはずなので一度探してみてはどうでしょうか。 やり直すにしてもどこが問題だったか一度見ておいてもいいかと思います。
dcg

2022/08/25 10:06

かしこまりました。問題を特定しないと同じようなことをしてしまいそうなので、注意します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問