

`sinatra`+`unicorn`+`nginx`での環境構築に挑戦しています。
しかし、`unicorn`を立ち上げるところでエラーがでて困っています。 どうかお力を貸してください。

環境

  * mac osx 
    * vagrant
    * centos 6.6

エラー内容

[code]

    FATAL -- : error adding listener addr=/var/www/html/unicorn/tmp/sockets/unicorn.sock
    /var/www/html/unicorn/vendor/bundler/ruby/1.9.1/gems/unicorn-4.8.3/lib/unicorn/socket_helper.rb:158:in `initialize': Operation not permitted - "/var/www/html/unicorn/tmp/sockets/unicorn.sock" (Errno::EPERM)
    
[/code]

`unicorn.rb`は以下のようになっています。

[code]

    @dir = File.expand_path("/var/www/html/unicorn", __FILE__)
    
    worker_processes 2
    working_directory @dir
    
    timeout 300
    listen "/var/www/html/unicorn/tmp/sockets/unicorn.sock", :backlog => 1024
    
    pid "#{@dir}/tmp/pids/unicorn.pid"
    
    stderr_path "#{@dir}/log/unicorn.stderr.log"
    stdout_path "#{@dir}/log/unicorn.stdout.log"
    
[/code]

なお、`listen`を`3000`などにするとうまく起動します。

この`.socket`というファイルは勝手に作られるのか、それとも自分で用意して読み込ませるのかがわからないのですが、とりあえず`/var/www/html/unicorn/tmp/sockets/`のパーミッションは`777`にしてみましたが、結果は同じでした。

ググっても`listen`を絶対パスにしろと書いてある物しか見つけられなかったので、教えてください。 よろしくおねがいします。


CC BY-SA 3.0
2014-12-26T02:16:09.243
2609
2014-12-26T04:52:55.117
2014-12-26T03:10:03.510
33
5785
question
ruby nginx unicorn
unicornの.socketファイルがうまく生成されません


`/etc/nginx/conf.d/`内にある設定ファイル側で記述した`.sock`のパスと`unicorn.rb`内の`listen`で指定したパスは同じものにする必要があります。

[code]

    # 'unicorn'の部分はプロクシパス
    upstream unicorn {
        # ここのパスを'unicorn.rb'と合わせる
        server unix:/var/www/html/unicorn/tmp/sockets/unicorn.sock fail_timeout=0;
    }
    
    server {
        location / {
            # upstreamで指定した名前と合わせる
            proxy_pass http://unicorn;
        }
    }
    
[/code]

のような設定になっていますか？

以下の記事は`sinatra`用ですが、`unicorn`と`nginx`の説明の部分は参考になるかと思います。

[Sinatra Recipes - Deployment - Nginx Proxied To
Unicorn](http://sinatra.ruby.iijgio.com/p/deployment/nginx_proxied_to_unicorn)


CC BY-SA 3.0
2014-12-26T02:28:42.187
2611
2014-12-26T02:35:33.657
2014-12-26T02:35:33.657
3313
3313
2609
answer


> listenを3000などにするとうまく起動します。

unicorn が使用するポート番号はデフォルトで 8080 だそうですが、もしかして別のサーバプロセスが 8080 番ポートを使用していたりはしませんか？
`netstat` や `lsof` コマンドなどを使用して確認してみてはいかがでしょうか。具体的には以下を root 権限で実行します。

  * netstat

# netstat -tlnp | grep ':8080'

  * lsof

# lsof -i TCP:8080


CC BY-SA 3.0
2014-12-26T02:39:00.940
2612
2014-12-26T02:54:12.230
2014-12-26T02:54:12.230
2609
answer


まず[英語版の同内容の質問](https://stackoverflow.com/q/16388342)からの引用ですが、unixドメインソケットはVagrantの共有ディレクトリには置けません。もしかして該当のディレクトリは共有ディレクトリではないですか？

また、unicornの場合はどうか知りませんがNodejsではUnixドメインソケットでlistenした場合sockが自動では消えてくれない問題がありました。もちろんゴミが残ってたらlistenできないのでもし同名のソケットが残っている場合はunlinkしてみてください。


CC BY-SA 3.0
2014-12-26T04:52:55.117
2617
2014-12-26T04:52:55.117
2017-05-23T12:38:56.083
-1
2376
2609
answer