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

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

新規登録して質問してみよう
ただいま回答率
85.51%
CentOS

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

unicorn

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

nginx

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

Ruby on Rails 4

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

Capistrano

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

Q&A

解決済

2回答

3895閲覧

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

HiromasaSuzuki

総合スコア13

CentOS

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

unicorn

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

nginx

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

Ruby on Rails 4

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

Capistrano

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

0グッド

1クリップ

投稿2016/10/21 09:17

編集2016/10/22 09:11

皆様

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

###実現したいこと
当該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: /
└ エラーログなし

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

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

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

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

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

投稿2016/10/22 00:43

suama

総合スコア1997

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

HiromasaSuzuki

2016/10/22 06:03

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

2016/10/22 09:14

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

2016/10/22 09:16 編集

ご示唆頂いた内容を元に、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) 」
HiromasaSuzuki

2016/10/22 09:19

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

2016/10/22 09: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から接続できるようになります。
HiromasaSuzuki

2016/10/22 09:32

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

2016/10/22 10: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がちゃんとアプリを提供できているかの確認をしたほうが良いと思います。
HiromasaSuzuki

2016/10/22 11: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
HiromasaSuzuki

2016/10/22 11: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
suama

2016/10/22 13:41

色々ありがとうございます。railsのソースは、お手元の開発環境とかで動かしたものでしょか。 railsのプログラム的なところは明るくないのですが、思いつくところを。 本来アプリケーションのトップ ( http://xxx.xx.xx/ ) としてアクセスした際は、StatusCode: 200でエラーにならず、何かの一覧が出るとかであれば、400が返ってくるということは、なにかおかしい状態になっているんだと思います。 すくなくともunicornの起動はできていて、レスポンスも返せる状態にはなっていると思われるので、railsのログ(production.logとか) に何かメッセージが出ているんじゃないでしょうか。 DBとの接続でエラーになっているとか、/ にアクセスした際に読み込まれる箇所でエラーが発生しているとかかな...と思います。 また、moonphaseさまのご指摘の通り、3000番に切り替えたほうが原因や動作確認しやすくなるので、できれば3000番での起動に変えてみてください。 そうすると、curl http://localhost:3000/ といった形で、curlコマンドでも確認しやすくなります。 返ってきた結果に、エラーの原因が含まれているかもしれません。
HiromasaSuzuki

2016/10/22 13:53

suama さま ご丁寧にありがとうございます。 原因を突き止めたいと思います。 また進捗ございましたらご報告させて頂きます。 改めて本当にありがとうございました。
HiromasaSuzuki

2016/10/25 09:19

ご無沙汰しております。 試行錯誤を重ねて、解決する事が出来ました。 原因はconfig.ruを勝手にアレンジしている事でした・・・ その問題を発見するに辺り、suamaさんの助言、大変役立ちました。 誠にありがとうございました。
guest

0

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

投稿2016/10/21 09:25

編集2016/10/21 09:26
moonphase

総合スコア6621

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

HiromasaSuzuki

2016/10/21 09:34

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

2016/10/21 09:52 編集

location / { に記述を変えた所画面表示は502 Bad Gatewayとなりました。 ありがとうございます。 再度質問になり、恐縮なのですが、 error.logを確認すると index of "/var/www/my_app/" is forbiddenのままなのですが、 これはパーミッションでなく別の問題に起因しているのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問