cre8cre8
AskMe♥

NginxとunicornでRails動かしてたらsockがNo such fileと言われたとき

ある爽やかな午前のこと。僕は仕事場でネットサーフィンをしていたんだ。
すると突然、その平和なひとときを邪魔するエラーが発生したんだ。。。

error_log
12016/11/15 11:17:54 [crit] 6566#0: *33 connect() to unix:/tmp/unicorn.appname.sock failed (2: No such file or directory) while connecting to upstream, client: 255.255.255.255, server: your.rails.jp, request: "GET /your.file HTTP/1.1", upstream: "http://unix:/tmp/unicorn.appname.sock:/your.file", host: "your.rails.jp", referrer: "https://oh.my.god/"

ログは一部ダミーデータに変更しています。

「チキショー!!俺の甘美なネットサーフィンタイムをっ…!!」
こうして僕はいやいやながら復旧作業に着手するのであった。

PrivateTmpが原因だった -> 結論☆

どうやら、CentOS7からPrivateTmpというものが有効になっているらしい。
こいつの効果で/tmp以下にsockがあっても他のプロセスと通信できないというか作ったプロセスしか見えないとのことらしい。
くっ…普段からAmazon Linuxばっかり触ってたから気づくのに30分くらいかかった…orz

というわけで、CentOS7でNginx+unicorn_railsで運用している場合のPrivateTmp回避方法を下に記す。

PrivateTmpの影響を受けないようにconfig共を設定

/etc/nginx/conf.d/default.conf
1
2upstream unicorn_appname_server {
3    server unix:/var/socks/unicorn.appname.sock;
4}
5

とにかく sock ファイルを /tmp 以下に置かなければいいので、
/var以下や/home以下や/ちょめちょめディレクトリなどお好きなところにsockを保存するように設定しなおす。
ただし、Nginxからちゃんとアクセスできるパーミッションがあるパスにしないとsockにアクセスできなくてエラーになるので注意。

/var/www/rails-app/config/unicorn.rb
1listen "/var/socks/unicorn.appname.sock"

unicornの設定ファイルをNginxの設定ファイルに書いたsockファイルのパスに設定。
Nginxとunicorn両方とも設定しておかないとうまく動かないので必ず両方同じパスにしてください。

rails_unicornを起動

Nginx+rails_unicorn久々すぎたので起動コマンド忘れてたので備忘録。。。
手順としては、
1 rails_unicornを起動して sockファイルを作る (unicornはバックグラウンドで動かしとく)
2 nginx起動してどこからでも読み込めるようにする
である。下記は私の環境での起動コマンドである。

shell
1bundle exec unicorn_rails -c config/unicorn.rb -E production -D
2sudo service nginx start

朝の優雅なひとときを邪魔された結末…

PrivateTmpに気づくまで時間かかったので、お昼休憩なくなったぉ…(´・ω・`)
今まで動いてたのになんで落ちるのん…なんで急にPrivateTmp有効になったのん…(´;ω;`)ブワッ

≪ 前の記事
Python3でunittestを導入してみる
次の記事 ≫
これさえ覚えれば大丈夫!scaffoldをまとめてみた

いいねやコメントを送っていただけると中の人がしっぽ振って大喜びします♪

あなたへのおすすめの記事