我正在使用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
无论如何修改我的Unicornconfiguration文件或我的Nginxconfiguration文件,我一直在这个问题上陷入困境。 两者都被提出:
/ 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
几个小时后,总共有三杯啤酒,我已经设法弄清楚了这个问题。 经过数小时的挖掘,我终于遇到了这个服务器故障的答案
用外行的话来说,在/tmp
(或者我发现的/var/tmp
)中创建文件的程序似乎是唯一能够看到那个目录中的文件的程序。 Unicorn正在创建UNIX套接字文件,但Nginx无法看到它。
我使用的解决方案是让Unicorn在/var/sockets
创建/var/sockets
。
在将nginx改为使用基于模板的systemd启动服务之后,我突然出现了类似的情况。
最后问题是PrivateTmp=true
,这使得nginx 无法访问由gunicorn创建的套接字文件 。 一旦我改变这个到PrivateTmp=false
,错误解决了。
我遇到的问题之一是nginx错误日志没有正确的路径:
这个命令将会派上用场来知道确切的nginx错误
tail -f /var/log/nginx/error.log