【问题标题】:Nginx cannot find unix socket file with Unicorn (no such file or directory)Nginx 找不到带有 Unicorn 的 unix 套接字文件(没有这样的文件或目录)
【发布时间】:2014-04-11 22:46:57
【问题描述】:

我正在使用 Nginx 和 Unicorn 将 Rails 4 应用程序部署到 Fedora 19 x64 服务器。问题是访问地址时出现错误:“We're sorry, but something was wrong.”

我的 Nginx 错误日志 (/var/log/nginx/error.log) 显示:

2014/03/08 03:50:12 [warn] 23934#0: conflicting server name "localhost" on 0.0.0.0:80, ignored
2014/03/08 03:50:12 [warn] 23936#0: conflicting server name "localhost" on 0.0.0.0:80, ignored
2014/03/08 03:50:14 [crit] 23939#0: *1 connect() to unix:/tmp/unicorn.[app name].sock failed (2: No such file or directory) while connecting to upstream, client: [client IP], server: localhost, request: "GET /v1/industries/1.xml HTTP/1.1", upstream: "http://unix:/tmp/unicorn.[app name].sock:/v1/industries.json", host: "api.[app name].ca"

据我所知,Nginx 并不知道套接字的存在。但是,查看/tmp,确实如此:

[root@localhost tmp]# ls
unicorn.[app name].sock

无论我如何修改我的 Unicorn 配置文件或我的 Nginx 配置文件,我都一直卡在这一点上。两者都被攻击:

/var/www/[应用名称]/config/unicorn.rb

working_directory "/var/www/[app name]"
pid "/var/www/[app name]/pids/unicorn.pid"
stderr_path "/var/www/[app name]/log/unicorn.log"
stdout_path "/var/www/[app name]/log/unicorn.log"
listen "/tmp/unicorn.[app name].sock"
worker_processes 2
timeout 30

/etc/nginx/conf.d/default.conf

upstream app {
    server unix:/tmp/unicorn.[app name].sock fail_timeout=0;
}
server {
    listen 80;
    server_name localhost;
    root /var/www/[app name]/public;
    try_files $uri/index.html $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://app;
    }
    error_page 500 502 503 504 /500.html;
    client_max_body_size 4G;
    keepalive_timeout 10;
}

我一直启动这两个守护进程的方式如下:

unicorn_rails -c /var/www/[app name]/config/unicorn.rb -D -E production
service nginx start

Unicorn 日志不包含相关信息,生产日志也不包含相关信息。这个设置看起来很简单,以前有人经历过吗?感谢您提供的任何帮助。

顺便说一句,我最初是在学习本教程:https://www.digitalocean.com/community/articles/how-to-deploy-rails-apps-using-unicorn-and-nginx-on-centos-6-5

【问题讨论】:

    标签: sockets unix nginx ruby-on-rails-4 unicorn


    【解决方案1】:

    我在将nginx改成使用systemd启动服务based on their template后突然出现了类似的情况。

    最终问题出在PrivateTmp=true,这使得nginx是由gunicorn创建的unable to access the socket file。一旦我将其更改为PrivateTmp=false,错误就解决了。

    【讨论】:

      【解决方案2】:

      经过几个小时和总共喝了 3 杯啤酒后,我终于找到了问题所在。经过几个小时的挖掘,我终于遇到了这个Server Fault answer

      用外行的话来说,在/tmp(或我发现的/var/tmp)中创建文件的程序似乎是唯一能够查看该目录中文件的程序。 Unicorn 正在创建 UNIX 套接字文件,但是 Nginx 看不到它。

      我采用的解决方案是让 Unicorn 在/var/sockets 中创建套接字。

      【讨论】:

      • 你是如何让 unicorn 改变它用户存储套接字的目录的?
      • 只需修改 Unicorn 配置文件中的监听变量。例如:listen "/var/sockets/unicorn.[app name].sock",然后将 Nginx 配置为代理到您的服务器的所有连接到该套接字文件,例如 server unix:/var/sockets/unicorn.[app name].sock fail_timeout=0;
      • 只是添加了一个 googleable 注释,说明我是通过 nginx 来这里的,在使用上游 puma 服务器时报告了 504 Gateway Timeout 错误。我偶然发现这个答案的唯一原因是日志表明正在探索同样奇怪的 http://unix:///tmp… 路径。所以,是的,如果其他人使用 puma 或任何其他服务器发现这个问题,肯定不是独角兽特有的错误。 Ubuntu 14.04 显然展示了与 Fedora 相同的安全协议。
      • @mczepiel 我也有同样的issue 你能帮忙吗?
      • @mczepiel 我遇到了同样的问题,它正在寻找带有 http:// 前缀的 unix 套接字。套接字文件肯定存在,nginx 用户肯定可以访问(使用 sudo -u 验证),并且位于不是 /tmp 的用户自定义位置。更奇怪的是,这可以在另一台具有几乎完全相同配置的服务器上运行。你有没有弄清楚是什么原因导致它将 unix 套接字解释为 http?
      猜你喜欢
      • 2014-12-02
      • 1970-01-01
      • 1970-01-01
      • 2022-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-13
      • 2019-01-22
      相关资源
      最近更新 更多