Help us understand the problem. What is going on with this article?

Nginxで403 Forbiddenエラーの解決策(Rails+AWS+Nginx+Unicorn環境)

ハマったこと

Railsで作ったアプリをAWSにデプロイして、いざアクセスしようとしたら403 Forbiddenエラーになりました。(下図)
Screen Shot 2020-02-23 at 16.59.26.png

前提条件

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の中身を見てみると、ログの場所が記述されているはずです。

/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のエラーが発生していることが分かりました。

/home/ec2-user/***/log/nginx.error.log
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

参考にしたサイト

https://maitakeramen.hatenablog.com/entry/2019/08/23/225552

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした