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

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

ただいまの
回答率

89.99%

Nginx + Unicorn でRailsアプリが403 forbiddenエラーになる

受付中

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,842

ngtrcode

score 6

お世話になります。

現在RailsアプリをVPSによって稼働させようとしています。

しかし、Railsアプリを表示させようとしたところ403 forbiddenが出てしまい、うまく稼働させることができません。

基本的な構成は、以下のように考えています。

基本構成

  • /home/【user】/railsapp - APProot (【user】は実際のuser nameが入る。設定ファイル中も同様)
  • WebサーバーとしてNginx
  • Rack WebサーバとしてUnicorn
  • Ruby 2.3.1 (下記Railsアプリに必要仕様に合わせています。)
  • PostgreSQL 9.4 (下記Railsアプリに必要仕様に合わせています。)
  • OS - Ubuntu 14.04

です。

また、Railsアプリは、オープンソースのクラウドファンディングアプリを入れようと思っています。(https://github.com/catarse/catarse)

すごく非効率なのだと思いますが、sshでサーバにログインして、必要なものを構築していっているので、デプロイツール等は使っていません。

現在の各種設定ファイルは以下の通りです。
(コメントアウトされている部分は、文字数の制限により、一部削除しています。)

Nginx設定

/etc/nginx/nginx.conf

user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
    worker_connections 768;
    # multi_accept on;
}

http {
    ##
    # Basic Settings
    ##

    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    ##
    # SSL Settings
    ##

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
    ssl_prefer_server_ciphers on;

    ##
    # Logging Settings
    ##

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;


  ##
  # Unicorn Settings
  ##
  upstream unicorn {
    server unix:/home/【user】/railsapp/tmp/sockets/unicorn.sock fail_timeout=0;
  }

    ##
    # Gzip Settings
    ##

    gzip on;
    gzip_disable "msie6";

    ##
    # Virtual Host Configs
    ##

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

/etc/nginx/sites-available/default

# Default server configuration
#
server {
    listen 80;
    root /home/【user】/railsapp;

    # Add index.php to the list if you are using PHP
    index index.html index.htm index.nginx-debian.html;

    server_name _;

    location / {
        # First attempt to serve request as file, then
        # as directory, then fall back to displaying a 404.
        try_files $uri $uri/ =404;
    }

        location /html/ {
          try_files $uri/index.html $uri.html $uri @unicorn;
        }

        location ~ ^/assets/ {
          alias /home/【user】/railsapp/public/assets;
        }

        location @unicorn {
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $http_host;
            proxy_pass http://unicorn;
        }

        error_page 500 502 503 504 /500.html;
        location = /500.html {
        root /home/【user】/railsapp/pubilc;
        }

    #location ~ /\.ht {
    #    deny all;
    #}
}


# Virtual Host configuration for example.com
# 文字数制限により削除してあります。

unicorn設定ファイル

/home/【user】/railsapp/config/unicorn.rb

if ENV['WORKER_PROCESSES']
  worker_processes ENV['WORKER_PROCESSES'].to_i
else
  worker_processes 2
end

user '【user】', '【user】' 

# Requests with more than 30 sec will be killed
timeout 300
working_directory "/home/【user】/railsapp"

# Preload entire app for fast forking.
preload_app true

listen "/home/【user】/railsapp/tmp/sockets/unicorn.sock"
pid "/home/【user】/railsapp/tmp/pids/unicorn.pid"

before_fork do |server, worker|

  Signal.trap 'TERM' do
    puts 'Unicorn master intercepting TERM and sending myself QUIT instead'
    Process.kill 'QUIT', Process.pid
  end

  defined?(ActiveRecord::Base) and
    ActiveRecord::Base.connection.disconnect!
end

after_fork do |server, worker|

  Signal.trap 'TERM' do
    puts 'Unicorn worker intercepting TERM and doing nothing. Wait for master to sent QUIT'
  end

  defined?(ActiveRecord::Base) and
    ActiveRecord::Base.establish_connection
end

stderr_path File.expand_path('log/unicorn-err.log', ENV['RAILS_ROOT'])
stdout_path File.expand_path('log/unicorn-out.log', ENV['RAILS_ROOT'])

/etc/init.d/unicorn

#!/bin/sh

# File: /etc/init.d/unicorn

### BEGIN INIT INFO
# 文字数制限により削除
### END INIT INFO

# Feel free to change any of the following variables for your app:

USER=【user】

#APP_ROOT=[PATH_TO_RAILS_ROOT_FOLDER]
APP_ROOT=/home/【user】/railsapp

# Set the environment. This can be changed to staging or development for staging
# servers.
RAILS_ENV=production

# This should match the pid setting in $APP_ROOT/config/unicorn.rb.
PID=$APP_ROOT/tmp/pids/unicorn.pid

# A simple description for service output.
DESC="Unicorn app - $RAILS_ENV"

# If you're using rbenv, you may need to use the following setup to get things
# working properly:
RBENV_RUBY_VERSION=`cat $APP_ROOT/.ruby-version`
RBENV_ROOT="/usr/local/rbenv"
PATH="$RBENV_ROOT/bin:$PATH"
SET_PATH="cd $APP_ROOT && rbenv rehash && rbenv local $RBENV_RUBY_VERSION"

# Unicorn can be run using `bundle exec unicorn` or `bin/unicorn`.
#UNICORN="bin/unicorn"
UNICORN="bundle exec unicorn"

# Execute the unicorn executable as a daemon, with the appropriate configuration
# and in the appropriate environment.
UNICORN_OPTS="-c $APP_ROOT/config/unicorn.rb -E $RAILS_ENV -D"
CMD="$SET_PATH && $UNICORN $UNICORN_OPTS"

# Give your upgrade action a timeout of 60 seconds.
TIMEOUT=60

# Store the action that we should take from the service command's first
# argument (e.g. start, stop, upgrade).
action="$1"

# Make sure the script exits if any variables are unset. This is short for
# set -o nounset.
set -u

# Set the location of the old pid. The old pid is the process that is getting
# replaced.
old_pid="$PID.oldbin"

# Make sure the APP_ROOT is actually a folder that exists. An error message from
# the cd command will be displayed if it fails.
cd $APP_ROOT || exit 1

# A function to send a signal to the current unicorn master process.
sig () {
test -s "$PID" && kill -$1 `cat $PID`
}

# Send a signal to the old process.
oldsig () {
test -s $old_pid && kill -$1 `cat $old_pid`
}

# A switch for handling the possible actions to take on the unicorn process.
case $action in
# Start the process by testing if it's there (sig 0), failing if it is,
# otherwise running the command as specified above.
start)
sig 0 && echo >&2 "$DESC is already running" && exit 0
su - $USER -c "$CMD"
;;

# Graceful shutdown. Send QUIT signal to the process. Requests will be
# completed before the processes are terminated.
stop)
sig QUIT && echo "Stopping $DESC" exit 0
echo >&2 "Not running"
;;

# Quick shutdown - kills all workers immediately.
force-stop)
sig TERM && echo "Force-stopping $DESC" && exit 0
echo >&2 "Not running"
;;

# Graceful shutdown and then start.
restart)
sig QUIT && echo "Restarting $DESC" && sleep 2 \
&& su - $USER -c "$CMD" && exit 0
echo >&2 "Couldn't restart."
;;

# Reloads config file (unicorn.rb) and ...

reload)
sig HUP && echo "Reloading configuration for $DESC" && exit 0
echo >&2 "Couldn't reload configuration."
;;

# Re-execute the running binary, ...
upgrade)
if sig USR2 && echo "Upgrading $DESC" && sleep 10 \
&& sig 0 && oldsig QUIT
then
n=$TIMEOUT
while test -s $old_pid && test $n -ge 0
do
printf '.' && sleep 1 && n=$(( $n - 1 ))
done
echo

if test $n -lt 0 && test -s $old_pid
then
echo >&2 "$old_pid still exists after $TIMEOUT seconds"
exit 1
fi
exit 0
fi
echo >&2 "Couldn't upgrade, starting 'su - $USER -c \"$CMD\"' instead"
su - $USER -c "$CMD"
;;

# A basic status checker. Just checks if the master process is responding to
# the `kill` command.
status)
sig 0 && echo >&2 "$DESC is running." && exit 0
echo >&2 "$DESC is not running."
;;

# Reopen all logs owned by the master and all workers.
reopen-logs)
sig USR1
;;

# Any other action gets the usage message.
*)
# Usage
echo >&2 "Usage: $0 <start|stop|restart|reload|upgrade|force-stop|reopen-logs>"
exit 1
;;
esac

以上が設定ファイルです。

nginxエラーログ

nginxのエラーログは下記の通りです。

/var/log/nginx/error.log

2016/12/24 10:36:45 [error] 24421#24421: *16 directory index of "/home/【user】/railsapp/" is forbidden, client: 153.229.108.244, server: _, request: "GET / HTTP/1.1", host: "27.120.80.169"

権限設定

forbiddenとでているので、Approotのオーナー、権限を調べてみましたが、以下の通りです。

# /home/【user】にて $ls -l
drwxrwxr-x 18 www-data www-data     4096 Dec 22 21:31 railsapp

# /home/【user】/railsappにて $ls -l
-rwxrwxr-x  1 www-data www-data  3437 Dec 22 20:01 Gemfile
-rwxrwxr-x  1 www-data www-data 18185 Dec 22 20:01 Gemfile.lock
-rwxrwxr-x  1 www-data www-data   343 Dec 22 20:01 Rakefile
drwxrwxr-x 13 www-data www-data  4096 Dec 22 20:01 app
-rwxrwxr-x  1 www-data www-data   501 Dec 22 20:01 app.json
drwxrwxr-x  2 www-data www-data  4096 Dec 22 20:01 bin
-rwxrwxr-x  1 www-data www-data   781 Dec 22 20:01 bower.json
-rwxrwxr-x  1 www-data www-data   270 Dec 22 20:01 circle.yml
drwxrwxr-x  5 www-data www-data  4096 Dec 24 00:10 config
-rwxrwxr-x  1 www-data www-data   255 Dec 22 20:01 config.ru
drwxrwxr-x  4 www-data www-data  4096 Dec 24 00:21 db
drwxrwxr-x  2 www-data www-data  4096 Dec 22 20:01 deploy
drwxrwxr-x  4 www-data www-data  4096 Dec 22 20:01 lib
drwxrwxr-x  2 【user】  【user】   4096 Dec 23 18:17 log
drwxrwxr-x  4 www-data www-data  4096 Dec 22 21:20 node_modules
-rwxrwxr-x  1 www-data www-data   192 Dec 22 20:01 package.json
drwxrwxr-x  4 www-data www-data  4096 Dec 22 21:23 public
drwxrwxr-x 19 www-data www-data  4096 Dec 22 20:01 spec
drwxrwxr-x  5 www-data www-data  4096 Dec 23 17:40 tmp
drwxrwxr-x  5 www-data www-data  4096 Dec 22 20:22 vendor

現状、以上の設定で403forbiddenがでます。ご助言いただけますと幸いです。
なお、VPSをいじるのは、初めての経験ですので、必要な情報がまだ足りないかもしれません。
その際には、何の情報があると、よりご教示いただけるということを教えていただきたく思います。

よろしくお願いいたします。

【12/26追記】
publicディレクトリに、index.htmlを配置したところ、これ自体は表示することができました。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

0

location / で @unicorn 動かしてないですが問題ないですか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/12/27 00:20

    同じような設定で試しましたが、私の環境ではやっぱり location / 直せば動きますね。
    location / {
    try_files $uri $uri/ @unicorn;
    }

    キャンセル

  • 2016/12/27 00:27

    それと assets が forbidden になるので
    location /assets/ {
    root /home/【user】/railsapp/public/assets;
    }

    キャンセル

  • 2016/12/28 13:24

    おや、tanyzzさん退会されてしまったんでしょうか・・・?
    教えていただいた設定にしても403forbiddenになっているので、なにか根本的に間違っている部分がありそうです。たしかに、ローカルだとそれは動くのですが、VPS上だとうごかなくなってるので、対応してみようと考えています。

    キャンセル

0

もし違ったら、すいませんが、【】が悪さをしている可能性があると思います。
ディレクトリに【】を使っているのは何故でしょうか?
もし、必須要件ではないのであれば、【】を外したディレクトリの環境を用意して試してみてはどうでしょうか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/12/26 19:58

    ご回答ありがとうございます。
    すみません、こちらの【user】というのは、teratail上での表示です。実際には、【】はついておらず、/home/hoge/railsapp のようになっております。
    わかりづらい表記ですみません!

    キャンセル

  • 2016/12/26 20:01

    あー、やっぱり、そんな変な構成にはしてないですよね。
    了解しました。

    キャンセル

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

  • ただいまの回答率 89.99%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる