Nginx在与Unicorn配合时找不到Unix套接字文件(没有这样的文件或目录)

52

我正在使用Nginx和Unicorn将一个Rails 4应用部署到一个Fedora 19 x64服务器。但问题是,当我访问该地址时,我会收到一个错误:“很抱歉,发生了一些错误。”

我的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

无论我如何修改独角兽配置文件或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

独角兽日志和生产日志都没有相关信息。这个设置似乎很简单,有人以前遇到过这种情况吗?感谢您能提供的任何帮助。

顺便说一下,我最初是在按照这个教程进行操作:https://www.digitalocean.com/community/articles/how-to-deploy-rails-apps-using-unicorn-and-nginx-on-centos-6-5

2个回答

103

经过几个小时和总计三杯啤酒的努力,我终于找到了问题。在挖掘了几个小时之后,我终于找到了这个Server Fault答案

简单来说,似乎只有在/tmp(或者我所发现的/var/tmp)中创建文件的程序才能看到该目录中的文件。 Unicorn正在创建UNIX套接字文件,但Nginx无法看到它。

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


你是如何让独角兽改变它用来存储套接字的目录的? - Nick Res
3
只需在您的独角兽配置文件中修改listen变量。例如:listen "/var/sockets/unicorn.[app name].sock",然后配置Nginx将所有连接代理到该套接字文件,例如 server unix:/var/sockets/unicorn.[app name].sock fail_timeout=0; - jamsesso
8
只是附加一个可以在谷歌上搜索的注释,我通过nginx报告了“504网关超时”错误,并使用上游puma服务器。我之所以找到这个答案,是因为日志指示探索了相同奇怪的“http://unix:///tmp…”路径。所以,如果有任何其他人使用puma或任何其他服务器发现此类问题,那肯定不是仅限于unicorn的bug。 Ubuntu 14.04 显然展示了与 fedora 相同的安全协议。 - mczepiel
@mczepiel 我遇到了同样的问题,你能帮忙吗? - Shalafister's
1
@mczepiel,我遇到了同样的问题,它误认为 Unix 套接字有 http:// 前缀。套接字文件确实存在,nginx 用户绝对可以访问(用 sudo -u 验证),并且位于一个用户自定义位置而不是 /tmp。更奇怪的是,在另一台几乎完全相同配置的服务器上可以正常运行。您是否弄清楚了是什么原因导致它将 Unix 套接字解释为 http? - fields

20

在将nginx更改为使用systemd启动服务(基于其模板)后,我突然遇到了类似的情况。

问题实际上是由于PrivateTmp=true引起的,这会使得nginx 无法访问由gunicorn创建的套接字文件。一旦我将其更改为PrivateTmp=false,错误就得以解决。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接