Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
3
Help us understand the problem. What is going on with this article?
@shuhei_takada

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

More than 1 year has passed since last update.

ハマったこと

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

参考にしたサイト

3
Help us understand the problem. What is going on with this article?
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
shuhei_takada
毎日PCとにらめっこする仕事をしています。社会人1年目。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
3
Help us understand the problem. What is going on with this article?