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

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

ただいまの
回答率

90.51%

  • CentOS

    3141questions

    CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

  • Ruby on Rails 4

    2544questions

    Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

  • nginx

    1032questions

    nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

  • Capistrano

    155questions

    Rubyで書かれたサーバオーケストレーションで、複数のサーバでスクリプトを実行する際に用いられます。主な使用用途はWebアプリケーションのデプロイメントです。 アプリケーションのバージョンアップ自動化、およびデータベースの変更などもできます。

  • unicorn

    123questions

    Unicornは、汎用のRackアプリケーションサーバ。RackとWebサーバーの機能を併せ持ちます。レスポンス処理や、Nginx単体がRackの機能をサポートしていない事から、一般的にはNginx+Unicorn+Railsの構成を取って用います。

Nginx で Unicorn起動時、白い画面にNot Found: / の表示 (Rails)

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,520

皆様

ご覧頂きありがとうございます。
初めて質問させて頂きます。
まだプログラミングを始めたばかりで、表現に間違いがあるかもしれませんが、
その際はご指摘頂けますと幸いです。
宜しくお願い致します。

実現したいこと

当該IPアドレスを入力した時にアプリの画面表示

エラーメッセージ

白いページに Not Found: /

環境/前提

・ さくらVPS / CentOS 6.8 / rails 4.2.6 / Nginx 1.10.1 / Capistrano3/
・ Unicorn は bundle exec unicorn_rails -c config/unicorn.rb -D -E staging で起動確認済み

 /etc/nginx/conf.d/local.conf(default.conf) 

upstream unicorn{
    server unix:/tmp/unicorn.sock
    fail_timeout=0;
}

server {
    listen (IPアドレス):8080;
    listen 80;
    server_name  (自分で決めたホスト名);

    root   /var/www/my_app/current/public;
    client_max_body_size 4G;

      location ~ ^/assets/ {
        root /var/www/my_app/current/public;
    }

    location / {
        root   /var/www/my_app/current/public;
        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_redirect off;
        autoindex on;

        if (!-f $request_filename) {
            proxy_pass http://unicorn;
            break;
        }
     }

     error_page 500 502 503 504 /500.html;

     location = /500.html {
        root /var/www/my_app/current/public;
     }
}

 Unicorn.rb

@app_path = '/var/www/my_app'
working_directory @app_path + "/current"

worker_processes 2
preload_app true
timeout 30
listen "/tmp/unicorn.sock", :backlog => 64
pid "/var/www/my_app/shared/tmp/pids/unicorn.pid"

stderr_path "/var/www/my_app/shared/log/unicorn.stderr.log"
stdout_path "/var/www/my_app/shared/log/unicorn.stdout.log"

before_fork do |server, worker|
  ENV['BUNDLE_GEMFILE'] = File.expand_path('Gemfile', ENV['RAILS_ROOT'])
end

before_fork do |server, worker|
  if defined?(ActiveRecord::Base)
    ActiveRecord::Base.connection.disconnect!
  end

  old_pid = "#{server.config[:pid]}.oldbin"
  if File.exists?(old_pid) && server.pid != old_pid
    begin
      Process.kill("QUIT", File.read(old_pid).to_i)
    rescue Errno::ENOENT, Errno::ESRCH
    end
  end
end

after_fork do |server, worker|
  if defined?(ActiveRecord::Base)
    ActiveRecord::Base.establish_connection
  end
end

試したこと

・Unicon停止した状態で、IPアドレスに接続を図る
└ Rails の We're sorry, but something went wrong. が表示
└ to unix:/tmp/unicorn.sock failed to unix:/tmp/unicorn.sock failed (111: Connection refused)
・Unicorn 起動
└ 白い画面にNot Found: / 
└ エラーログなし

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

+1

unicornはソケットで通信を想定されてますでしょうか。
nginxからリクエストすると502になるので、nginxがバックエンドのunicornにリクエストを転送していますが、unicorn側に繋がらない状態のようです。

unicornのプロセスは起動しているようでも、nginx側が期待してるソケットで待ち受け出来てないかもしれません。
うまく上がっていれば、ncやsocatといったコマンドで確認できます。

気になったのは、nginxとunicornの設定側とで、ソケットのパスが違うあたりです。unicorn的にはlisten のところで指定してるパスで待ち受けてると思います。

この辺りを確認して、最後にどうしてもうまくいかない場合、unicornの起動をソケットからtcpのポート接続(3000番など)に変えてみたりしてはいかがでしょう。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/10/22 15:03

    ご教示頂き、ありがとうございます。
    試してみて、またその結果をお伝えさせて頂きます。

    キャンセル

  • 2016/10/22 18:14

    過去にUNIXドメインなソケットで運用しようと思いましたが、INETドメインソケットに比べてトラブルが多かったので、それからINETドメインソケットで運用してます。
    INETドメインソケットであれば運用も楽だったりするので、今はすべてそうしてます。

    キャンセル

  • 2016/10/22 18:15 編集

    ご示唆頂いた内容を元に、403の問題を解決する事が出来ましたありがとうございます!
    また、新たなエラーが発生し問題の切り分けが出来ず、(変更内容は上を更新しました)
    もし宜しかったらご教示頂けませんでしょうか。

    【問題】
    ・Unicorn 起動時 に当該IPアドレスにアクセス
    └ 白い画面にNot Found: / のみ表示
    └ Nginxのエラーログなし

    ・Unicon停止した状態で、IPアドレスに接続を図る
    └ Rails の We're sorry, but something went wrong. が表示
    └ Nginx のエラーログに下記表示
    「to unix:/tmp/unicorn.sock failed to unix:/tmp/unicorn.sock failed (111: Connection refused) 」

    キャンセル

  • 2016/10/22 18:19

    > moonphase さん
    ご回答ありがとうございます!
    恥ずかしながら「INETドメインソケット」「UNIXドメインなソケット」の違いすら分からないレベルなので、しっかりと調べて勉強したいと思います

    キャンセル

  • 2016/10/22 18:29

    UNIXドメインソケットは、ファイルのソケットです。今回は「/tmp/unicorn.sock」です。
    INETドメインソケットは、いわゆる3000/tcpでLISTENするようなポートで接続できるソケットです。

    Unicorn.rbのlistenのところを
    listen 3000


    local.confのserver unix:/tmp/unicorn.sock;を
    server 127.0.0.1:3000;
    にすればINETドメインのLISTENでUnicornを起動し、Nginxから接続できるようになります。

    キャンセル

  • 2016/10/22 18:32

    > moonphase さん
    なるほど!確かに直感的でわかりやすいですね!!
    ご教示ありがとうございますm(._.)m

    キャンセル

  • 2016/10/22 19:08

    moonphaseさま、追加コメントありがとうございます!
    > INETドメインソケットに比べてトラブルが多かったので
    は、確かにそう思いました。

    もしソケットでunicornを起動しているなら、socatとかncが入っていればこんな感じで確認できます。

    $ echo -e "GET / HTTP/1.0\n\n" | socat unix-connect:/tmp/unicorn.sock STDIO
    $ echo -en "GET / HTTP/1.0\n\n" | | nc -U /tmp/unicorn.sock

    # unicornを3000番であげたならこっち
    $ echo -en "GET / HTTP/1.1\n\n" | nc localhost 3000

    3000番ならtelnetとかでも確認できます。(3000番が埋まってたらダメですが...)
    どちらにしても、nginxより先にunicornがちゃんとアプリを提供できているかの確認をしたほうが良いと思います。

    キャンセル

  • 2016/10/22 20:21 編集

    suamaさま
    ありがとうございます!!

    echo -e "GET / HTTP/1.0\n\n" | socat unix-connect:/tmp/unicorn.sock STDIO
    → HTTP/1.1 400 Bad Request

    の結果が返ってきたので、Unicorn 側の問題ですね・・・
    原因を探ってみたいと思いますm(._.)m

    キャンセル

  • 2016/10/22 20:27

    (追記)
    ▲ ps -ef | grep unicorn 実行時です。
    hiromasa 11462 1 0 19:58 ? 00:00:04 unicorn_rails master -c config/unicorn.rb -E staging -D
    hiromasa 11465 11462 0 19:58 ? 00:00:00 unicorn_rails worker[0] -c config/unicorn.rb -E staging -D
    hiromasa 11468 11462 0 19:58 ? 00:00:00 unicorn_rails worker[1] -c config/unicorn.rb -E staging -D
    hiromasa 16009 15929 0 20:18 pts/0 00:00:00 grep unicorn

    キャンセル

  • 2016/10/22 22:41

    色々ありがとうございます。railsのソースは、お手元の開発環境とかで動かしたものでしょか。
    railsのプログラム的なところは明るくないのですが、思いつくところを。

    本来アプリケーションのトップ ( http://xxx.xx.xx/ ) としてアクセスした際は、StatusCode: 200でエラーにならず、何かの一覧が出るとかであれば、400が返ってくるということは、なにかおかしい状態になっているんだと思います。

    すくなくともunicornの起動はできていて、レスポンスも返せる状態にはなっていると思われるので、railsのログ(production.logとか) に何かメッセージが出ているんじゃないでしょうか。

    DBとの接続でエラーになっているとか、/ にアクセスした際に読み込まれる箇所でエラーが発生しているとかかな...と思います。

    また、moonphaseさまのご指摘の通り、3000番に切り替えたほうが原因や動作確認しやすくなるので、できれば3000番での起動に変えてみてください。

    そうすると、curl http://localhost:3000/ といった形で、curlコマンドでも確認しやすくなります。
    返ってきた結果に、エラーの原因が含まれているかもしれません。

    キャンセル

  • 2016/10/22 22:53

    suama さま

    ご丁寧にありがとうございます。
    原因を突き止めたいと思います。

    また進捗ございましたらご報告させて頂きます。
    改めて本当にありがとうございました。

    キャンセル

  • この投稿は削除されました

  • 2016/10/25 18:19

    ご無沙汰しております。
    試行錯誤を重ねて、解決する事が出来ました。
    原因はconfig.ruを勝手にアレンジしている事でした・・・

    その問題を発見するに辺り、suamaさんの助言、大変役立ちました。
    誠にありがとうございました。

    キャンセル

+1

location @unicorn {
は違う気がします。
location / {location /hogehoge {など、ブラウザがアクセスするURIを入れてください。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/10/21 18:34

    ありがとうございます!試した結果をまたご報告させて頂きます!

    キャンセル

  • 2016/10/21 18:51 編集

    location / {
    に記述を変えた所画面表示は502 Bad Gatewayとなりました。
    ありがとうございます。

    再度質問になり、恐縮なのですが、
    error.logを確認すると index of "/var/www/my_app/" is forbiddenのままなのですが、
    これはパーミッションでなく別の問題に起因しているのでしょうか?

    キャンセル

同じタグがついた質問を見る

  • CentOS

    3141questions

    CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

  • Ruby on Rails 4

    2544questions

    Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

  • nginx

    1032questions

    nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

  • Capistrano

    155questions

    Rubyで書かれたサーバオーケストレーションで、複数のサーバでスクリプトを実行する際に用いられます。主な使用用途はWebアプリケーションのデプロイメントです。 アプリケーションのバージョンアップ自動化、およびデータベースの変更などもできます。

  • unicorn

    123questions

    Unicornは、汎用のRackアプリケーションサーバ。RackとWebサーバーの機能を併せ持ちます。レスポンス処理や、Nginx単体がRackの機能をサポートしていない事から、一般的にはNginx+Unicorn+Railsの構成を取って用います。