LoginSignup
13
6

More than 3 years have passed since last update.

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

Posted at

ハマったこと

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

参考にしたサイト

13
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
6