错误启动(`start_unix_server': no unix-domain acceptor (RuntimeError))

Posted

技术标签:

【中文标题】错误启动(`start_unix_server\': no unix-domain acceptor (RuntimeError))【英文标题】:Thin start with error (`start_unix_server': no unix-domain acceptor (RuntimeError))错误启动(`start_unix_server': no unix-domain acceptor (RuntimeError)) 【发布时间】:2014-08-21 20:00:55 【问题描述】:

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

非常感谢!

瘦.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

/etc/nginx/sites-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;
        


瘦日志

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>'

【问题讨论】:

当我在生产中使用瘦时,我一直在端口 8080 中启动它,thin -e production -p 8080 并让 nginx 在 8080 上监听我的应用程序。我没有知道我是否做错了,但它有效。 @Russell Kompinski:出于安全原因,我认为我需要停止在端口 3000 中进行细听。上面这段代码,我尝试使用默认的 nginx 服务器监听 80 端口。 我遇到了同样的错误,对我来说更改套接字名称有效。我还不知道为什么。 【参考方案1】:

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

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

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

偏薄

您只需告诉 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;

从您的 Thin 配置文件来看,您只有一个 Thin 实例为此项目运行,因此您只需要一个 server 行。如果您使用过 2 个 Thin 实例(在您的 Thin yml 配置中使用 servers: 2),您会在 nginx 端执行类似的操作:

upstream myapp 
    server unix:/home/deploy/myapp/sockets/thin.0.sock;
    server unix:/home/deploy/myapp/sockets/thin.1.sock;

"没有 unix 域接受器 (RuntimeError)"

至于“no unix-domain acceptor (RuntimeError)”错误,可能是socket目录的权限问题,至少我刚刚遇到这个问题时是这样的现在(不知道为什么,我的sockets 目录不见了,当我再次创建它时,它必须具有正确的权限才能避免此错误)。所以我想说看看这个;)

【讨论】:

我尝试使用 Unix 套接字,因为我认为打开端口(如端口 3000)是安全漏洞。【参考方案2】:

对我来说,这个错误是由缺少套接字目录引起的(在你的情况下,这将是 /home/deploy/myapp/sockets)。

【讨论】:

【参考方案3】:

这是我的 nginx 使用瘦的样子。也许它可以提供帮助。

   upstream thin_server 
          server 0.0.0.0:8080 fail_timeout=0;
        

        server 
                listen   80 default;
                root /home/example/public;
                server_name example.com www.example.com;
                index index.htm index.html;


                location / 
                        try_files $uri/index.html $uri.html $uri @app;
                

                location ~* ^.+\.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js|mp3|flv|mpeg|avi)$ 
                                try_files $uri @app;
                        

                 location @app 
                        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                        proxy_set_header Host $http_host;
                        proxy_redirect off;
                        proxy_pass http://thin_server;
            

            error_page 500 502 503 504 /500.html;
            client_max_body_size 4G;
            keepalive_timeout 10;

【讨论】:

我尝试使用套接字,但它不起作用。你能告诉我为什么吗?我不明白套接字:/home/deploy/myapp/sockets/thin.sock 和服务器 0.0.0.0:8080 之间有什么不同。 :(。谢谢。 @PhuongTT 我不确定如何回答这个问题,而且我对不同的套接字类型也没有深入的了解。您是在询问套接字地址吗?我们使用的套接字地址是 localhost 和端口 8080 的 ip 和端口组合,即 0.0.0.0:8080。你能澄清一下吗?另外,这对你有用吗? 这种方式对我有用。我只是问你问题以了解更多信息。 :D

以上是关于错误启动(`start_unix_server': no unix-domain acceptor (RuntimeError))的主要内容,如果未能解决你的问题,请参考以下文章

SQL数据库启动不了,提示错误1069?急!!!

MySQL启动1053错误怎么解决?

无法启动Terminal Services 错误码1058?

Mysql服务无法启动,显示错误1067

硬盘文件读取错误,无法启动

Win7无法启动服务错误1068怎么办?