nginx
VirtualBox
puma
RubyOnRails

VirtualBoxでNginxとpumaの連携がうまくいかない人に試してほしい3つのこと(多分ここだけにしかない手順あり)

きっかけ

  • Nginxの勉強がしたいぞ
  • railsアプリを作って、pumaサーバのsockファイルで通信しよう
  • ん?Permission deniedとか出て502しかでないぞ?
  • そしてどこも似たような解決方法を書いてあるけどどれも効かないんですけど!
  • ........結果的に解決したけどこの方法誰も言及してない。書いとこう

対象

  • NginxとRailsの連携がしたいのに502に行く手を阻まれている方
  • setenforce?そんなものもうやり尽くしたよ!でもできねーよ!という人

結論先取り

  • 以下の三つを確認しましょう
  1. SElinuxがオフになっているか
  2. sockファイルを/tmpディレクトリに置いてたりしないか(共有できない場所らしい)
  3. /home/vagrant配下にsockファイルを置いている(自分が一番ハマったところ)

私の環境

  • CentOS7を使いました
$ uname -rs
Linux 3.10.0-514.16.1.el7.x86_64

$ nginx -v
nginx version: nginx/1.10.2

$ rails -v
Rails 5.1.3

SELinux

  • これがオンになっているせいで、リクエストが弾かれてしまいうまくいかないパターン
  • いたるところで解決策として提示されている他、案外これで解決してしまうことも多いらしいのでその記事を参考にしてください

sockファイルを/tmpに置いている

  • こちらの記事を参考にしました
  • 自分は実際に試していないのだが、/tmpディレクトリ配下にsockファイルを置いてしまうとnginxとの共有ができなくなるため、繋がらなくなるんだとか
  • なので、railsのルートディレクトリにあるtmp/sockets/ディレクトリに置くようにしましょうという話

/home/vagrant配下にsockファイルをを置いている(メイン!)

  • 私は VagrantのルートディレクトリにRailsアプリを置いていたわけだが、これが 致命的に502に直結するきっかけになり得るということを知らなかった........
  • 厳密にはsockファイルをアプリのtmpディレクトリに置いていたため、sockファイルが/home/vagrant配下に作られることになったのが原因だとのちに判明しました(hmikisatoさんありがとうございます)
  • どうやらNginxが原因ではなくて、pumaが/home/vagrant配下にsockファイルを作成することができないからなんだとか。(参考

まとめ

  • socketファイルは、配置的にRailsアプリ内のtmpディレクトリに置いて置いた方がわかりやすい
  • なのでNginxとVagrantを使うなら、Railsアプリはsockファイルが作成できる/usr/share/nginx/html配下に置きましょう