精简启动错误(`start_unix_server':没有unix-domain acceptor(RuntimeError))

Phu*_*gTT 3 ruby-on-rails nginx thin

我使用capistrano(rails 4,ruby 2.1.2,thin 1.6.2,capistrano 2.1.5)将一个rails应用程序部署到nginx,瘦.我通过瘦启动命令开始瘦身.并在此文件thin.log上查看一些错误.谁能告诉我如何解决这个问题?

非常感谢你!

thin.yml

 pid: /home/deploy/myapp/pids/thin.pid
 port: 3000
 timeout: 30
 wait: 30
 log: log/thin.log
 max_conns: 1024
 require: []
 environment: production
 max_persistent_conns: 512
 threaded: true
 no-epoll: true
 daemonize: true
 socket: /home/deploy/myapp/sockets/thin.sock
 chdir: /home/deploy/myapp/current
 address: 0.0.0.0
Run Code Online (Sandbox Code Playgroud)

在/ etc/nginx的/网站-availabel /默认

upstream myapp{
        server 127.0.0.1:3000;
        server 127.0.0.1:3001;
        server 127.0.0.1:3002;
}
server {
        listen   80;
        server_name _;
        character utf-8;


        access_log /home/deploy/myapp/log/access.log;
        error_log /home/deploy/myapp/log/error.log;
        root     /home/deploy/myapp/current/public;

        location / {
                proxy_pass http://127.0.0.1:3000;
        }

}
Run Code Online (Sandbox Code Playgroud)

thin.log

Writing PID to /home/deploy/myapp/pids/thin.pid
Using rack adapter
Thin web server (v1.6.2 codename Doc Brown)
Maximum connections set to 1024
Listening on /home/deploy/myapp/sockets/thin.sock, CTRL+C to stop
Exiting!
/home/deploy/.rvm/gems/ruby-2.1.2/gems/eventmachine-1.0.3/lib/eventmachine.rb:528:in `start_unix_server': no unix-domain acceptor (RuntimeError)
    from /home/deploy/.rvm/gems/ruby-2.1.2/gems/eventmachine-1.0.3/lib/eventmachine.rb:528:in `start_server'
    from /home/deploy/.rvm/gems/ruby-2.1.2/gems/eventmachine-1.0.3/lib/eventmachine.rb:548:in `start_unix_domain_server'
    from /home/deploy/.rvm/gems/ruby-2.1.2/gems/thin-1.6.2/lib/thin/backends/unix_server.rb:19:in `connect'
    from /home/deploy/.rvm/gems/ruby-2.1.2/gems/thin-1.6.2/lib/thin/backends/base.rb:63:in `block in start'
    from /home/deploy/.rvm/gems/ruby-2.1.2/gems/eventmachine-1.0.3/lib/eventmachine.rb:187:in `call'
    from /home/deploy/.rvm/gems/ruby-2.1.2/gems/eventmachine-1.0.3/lib/eventmachine.rb:187:in `run_machine'
    from /home/deploy/.rvm/gems/ruby-2.1.2/gems/eventmachine-1.0.3/lib/eventmachine.rb:187:in `run'
    from /home/deploy/.rvm/gems/ruby-2.1.2/gems/thin-1.6.2/lib/thin/backends/base.rb:73:in `start'
    from /home/deploy/.rvm/gems/ruby-2.1.2/gems/thin-1.6.2/lib/thin/server.rb:162:in `start'
    from /home/deploy/.rvm/gems/ruby-2.1.2/gems/thin-1.6.2/lib/thin/controllers/controller.rb:87:in `start'
    from /home/deploy/.rvm/gems/ruby-2.1.2/gems/thin-1.6.2/lib/thin/runner.rb:199:in `run_command'
    from /home/deploy/.rvm/gems/ruby-2.1.2/gems/thin-1.6.2/lib/thin/runner.rb:155:in `run!'
    from /home/deploy/.rvm/gems/ruby-2.1.2/gems/thin-1.6.2/bin/thin:6:in `<top (required)>'
    from /home/deploy/.rvm/gems/ruby-2.1.2/bin/thin:23:in `load'
    from /home/deploy/.rvm/gems/ruby-2.1.2/bin/thin:23:in `<main>'
    from /home/deploy/.rvm/gems/ruby-2.1.2/bin/ruby_executable_hooks:15:in `eval'
    from /home/deploy/.rvm/gems/ruby-2.1.2/bin/ruby_executable_hooks:15:in `<main>'
Run Code Online (Sandbox Code Playgroud)

Pie*_*son 5

一般来说:配置Thin和Nginx一起工作

我在VPS上遇到了几乎相同的问题.我不明白的是你的Thin配置结合了端口和套接字.我不知道这是不是一个好方法.

但无论如何,这是我的建议:

在薄的一面

你只需告诉Thin使用/home/deploy/myapp/sockets/thin.sock套接字.好吧,我们很好.我已经使用了另一个目录作为套接字(比如说/tmp你的应用程序tmp目录),但我不是专家,那就是你的电话.

在Nginx方面

然后,如果您希望Thin和Nginx进行通信,则必须告诉Nginx Thin正在侦听此特定套接字上的传入请求.在这个upstream块中,您告诉Nginx Thin正在侦听localhost:3000上的传入请求.再次,当您在Thin conf中同时使用端口和套接字时,我不确定这是否是一个问题(但至少,对于我来说,这些设置中的一个对我来说是无用的,就Thin-Nginx通信而言被关注到).如果在同一台机器上使用Nginx和Thin,我认为套接字是更好的方法,因为它们使通信依赖于文件系统而不是HTTP请求,这应该更有效.要告诉Nginx Thin正在侦听套接字,你必须使用upstream像这样的块:

upstream myapp {
    server unix:/home/deploy/myapp/sockets/thin.sock;
}
Run Code Online (Sandbox Code Playgroud)

从您的Thin配置文件判断,此项目只有一个Thin运行实例,因此您只需要server一行.如果你曾经使用过2个瘦实例(servers: 2在你的瘦yml配置中),那你就在nginx端做了类似的事情:

upstream myapp {
    server unix:/home/deploy/myapp/sockets/thin.0.sock;
    server unix:/home/deploy/myapp/sockets/thin.1.sock;
}
Run Code Online (Sandbox Code Playgroud)

"没有unix-domain acceptor(RuntimeError)"

至于"没有unix-domain acceptor(RuntimeError)"错误,它可能来自套接字目录上的权限问题,至少就是刚才遇到这个问题的情况(不知道为什么,我的sockets目录)已经不见了,当我再次创建它时,它必须具有正确的权限以避免此错误).所以我要说看看这个;)