我正在使用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
无论我如何修改我的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
/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
答案 0 :(得分:80)
经过几个小时和总共3瓶啤酒,我已经设法找出问题所在。经过几个小时的挖掘,我终于遇到了这个Server Fault answer
通俗地说,在/tmp
(或我发现的/var/tmp
)中创建文件的程序似乎是唯一能够查看该目录中文件的程序。 Unicorn正在创建UNIX套接字文件,但Nginx无法看到它。
我使用的解决方案是让Unicorn在/var/sockets
中创建套接字。
答案 1 :(得分:11)
在更改nginx以使用systemd启动服务based on their template后,我突然遇到了类似的情况。
最终问题出在PrivateTmp=true
,这使得nginx由gunicorn创建unable to access the socket file。将此更改为PrivateTmp=false
后,错误已解决。