Nginx找不到unix的unix socket文件(没有这样的文件或目录)

jam*_*sso 43 unix sockets nginx unicorn ruby-on-rails-4

我正在使用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"
Run Code Online (Sandbox Code Playgroud)

据我所知,Nginx并不知道套接字存在.但是,查看/tmp,它确实:

[root@localhost tmp]# ls
unicorn.[app name].sock
Run Code Online (Sandbox Code Playgroud)

无论我如何修改我的Unicorn配置文件或我的Nginx配置文件,我都会一直陷入困境.两者都被吸引:

/ var/www/[app name] /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
Run Code Online (Sandbox Code Playgroud)

/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;
}
Run Code Online (Sandbox Code Playgroud)

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

unicorn_rails -c /var/www/[app name]/config/unicorn.rb -D -E production
service nginx start
Run Code Online (Sandbox Code Playgroud)

Unicorn日志不包含相关信息,生产日志也不包含相关信息.这个设置似乎很简单,有没有人经历过这个?感谢您的任何帮助,您可以提供.

顺便说一下,我最初遵循这个教程:https://www.digitalocean.com/community/articles/how-to-deploy-rails-apps-using-unicorn-and-nginx-on-centos-6-5

jam*_*sso 84

经过几个小时和一共三瓶啤酒,我已经设法找出问题所在.经过几个小时的挖掘,我终于遇到了这个服务器故障的答案

通俗地说,似乎在/tmp(或/var/tmp我发现)创建文件的程序是唯一能够查看该目录中文件的程序.Unicorn正在创建UNIX套接字文件,但是Nginx无法看到它.

我使用的解决方案是让Unicorn创建套接字/var/sockets.

  • 只是添加一个googleable注释,我通过nginx来到这里报告使用上游puma服务器时出现"504 Gateway Timeout"错误.我偶然发现这个答案的唯一原因是日志显示了同样奇怪的`http:// unix:/// tmp ...`路径正在被探索.所以是的,当然任何其他人使用puma或任何其他服务器发现这一点时,肯定不是一个独角兽特定的错误.Ubuntu 14.04显然表现出与fedora相同的安全协议. (7认同)
  • 只需修改Unicorn配置文件中的listen变量即可.例如:`listen"/var/sockets/unicorn.[app name] .sock"`,然后配置Nginx将服务器的所有连接代理到该套接字文件,例如`server unix:/ var/sockets/unicorn.[app name] .sock fail_timeout = 0;` (3认同)
  • 你能分享用来解决问题的命令吗? (2认同)

n8h*_*rie 13

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

最终问题出在了PrivateTmp=true,这使得nginx 无法访问 gunicorn创建的套接字文件.一旦我改变了这个PrivateTmp=false错误就解决了.