ハマったこと
Railsで作ったアプリをAWSにデプロイして、いざアクセスしようとしたら403 Forbiddenエラーになりました。(下図)
前提条件
Ruby: 2.6.3
Rails: 6.0.2
Nginx: 1.12.2
サーバーのOS: Amazon Linux 2
解決策(先に結論だけ)
chmod 701 /home/ec2-user
で解決しました(ec2-userディレクトリのパーミッションを700→701に変更しました)
※ /home/ec2-user/
直下にRailsアプリを配置しています
エラーに遭遇するまでの経緯
下記のページを参考にしながら、RailsアプリをAWSにデプロイする作業を進めていました。
https://qiita.com/Yuki_Nagaoka/items/975b7598806d6ae0c0b2
上記のページでは、Railsアプリの設置場所を/var/www/rails/
配下にしているのですが、「アプリの設置場所は好きなところでいいだろう」と思って、自分の場合は~/
(/home/ec2-user/
と同義)に配置しました。
結果的に、この設置場所の違いが今回のエラーを発生させることになりました。
エラーに遭遇してから、解決するまでの経緯
そもそも、403 Forbiddenとは?
ページが存在するものの、ページを表示する権限がなくてアクセスが拒否されたことを示すHTTPステータスコードです。
(今回の場合は、NginxがRailsアプリがあるディレクトリへのアクセス権限を持っていなかったのが原因で403エラーが発生しました)
参考:https://ja.wikipedia.org/wiki/HTTP_403
ログを確認し、エラーの原因を調べる
Nginxのログファイルの場所は、Nginxの設定ファイルに記述されています。
Nginxの設定ファイルは、OSによっても異なりますが、Amazon Linuxの場合は/etc/nginx/nginx.conf
, /etc/nginx/nginx.conf.default
, /etc/nginx/conf.d/***.conf
にあります。
/etc/nginx/conf.d/***.conf
の中身を見てみると、ログの場所が記述されているはずです。
error_log /home/ec2-user/***/log/nginx.error.log;
access_log /home/ec2-user/***/log/nginx.access.log;
.
.
.
エラーログ(/home/ec2-user/***/log/nginx.error.log)の中身を見てみると、以下のようにPermission denied
のエラーが発生していることが分かりました。
2020/02/23 05:01:35 [crit] 26964#0: *47 stat() "/home/ec2-user/***/public/" failed (13: Permission denied), client: ***, server: ***, request: "GET / HTTP/1.1", host: "***"
2020/02/23 05:01:35 [crit] 26964#0: *47 connect() to unix:/home/ec2-user/***/tmp/sockets/.unicorn.sock failed (13: Permission denied) while connecting to upstream, client: ***, server: ***, request: "GET / HTTP/1.1", upstream: "http://unix:/home/ec2-user/***/tmp/sockets/.unicorn.sock:/", host: "***"
2020/02/23 05:01:35 [error] 26964#0: *47 open() "/home/ec2-user/***/public/500.html" failed (13: Permission denied), client: ***, server: ***, request: "GET / HTTP/1.1", upstream: "http://unix:/home/ec2-user/***/tmp/sockets/.unicorn.sock/", host: "***"
念の為、Unicornのログファイルも見ておいた方が良いです。サーバー上のページにブラウザからアクセスして、Nginxのログは出てくるがUnicornのログに何も表示されないのであれば、Nginxでエラーが起きていることが分かるからです。
もしUnicornのログに何か表示されれば、Railsアプリ内でエラーが起きているということになります。
パーミッションとは?
以下サイトを参考にしてください。
https://eng-entrance.com/linux-permission-basic
なぜパーミッションがdenyされるのか?
ユーザーのディレクトリ(/home/ec2-user/)のパーミッションは700なので、その他のユーザーが/home/ec2-user/配下のディレクトリにアクセスできないことが原因です。
ブラウザからサーバー上のページにアクセスしたときに、nginxの実行ファイルはnginx
というユーザー名で、Railsアプリがあるディレクトリにアクセスしていくつかのファイル(例えば、tmp/sockets/.unicorn.sockやpublic/など)を読み込みます。
つまり、nginx
という名前のユーザーが、それらのファイルへのアクセス権限を持っている必要があります。また、ファイルにアクセスするためには、ルートディレクトリからそのファイルがあるディレクトリまでのすべてのディレクトリでアクセス権限を持っていなければいけません。
ちなみに、アクセス権限はパーミッションでいうところの実行権限(x)です。
解決策
したがって、nginxユーザーがec2-userディレクトリ配下にあるRailsアプリにアクセスできるようにするために、ec2-userディレクトリの「その他のユーザー」に実行権限を付与する必要があります。
(つまり、下記を実行することで解決)
chmod 701 /home/ec2-user
参考にしたサイト