连接到Unicorn时,Nginx获取权限被拒绝

时间:2014-03-05 17:48:38

标签: ruby-on-rails ruby ruby-on-rails-3 nginx

我在网上尝试了很多建议,但没有任何效果。我有unicorn和nginx在CentOS 6.5服务器上的rails app上部署ruby。它以前工作过但现在我在尝试拉起网站时遇到了错误的网关错误。我正在使用的两个主要文件是unicorn.rb配置文件和nginx的default.conf文件。这些文件的位置是:/home/myuser/myApp/config/unicorn.rb和/etc/nginx/conf.d/default.conf。以下是它们的内容:

unicorn.rb

Set the working application directory
# working_directory "/path/to/your/app"
working_directory "/home/myuser/myApp"

# Unicorn PID file location
# pid "/path/to/pids/unicorn.pid"
pid "/home/myuser/myApp/pids/unicorn.pid"

# Path to logs
# stderr_path "/path/to/log/unicorn.log"
# stdout_path "/path/to/log/unicorn.log"
stderr_path "/home/myuser/myApp/log/unicorn.log"
stdout_path "/home/myuser/myApp/log/unicorn.log"

# Unicorn socket
# listen "/tmp/unicorn.[app name].sock"
listen "/home/myuser/myApp/tmp/unicorn.myApp.sock"

# Number of processes
# worker_processes 4
worker_processes 2

# Time-out
timeout 30

default.conf

upstream app {
        # Path to Unicorn SOCK file, as defined previously
        server unix:/home/myuser/myApp/tmp/unicorn.myApp.sock fail_timeout=0;
}

server {


    listen 80;
    server_name localhost;

    # Application root, as defined previously
    root /root/myApp/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;
}

我正在尝试从myuser运行这些东西,所以我不想移动unicorn文件或myApp。为了进行设置,我遵循https://www.digitalocean.com/community/articles/how-to-deploy-rails-apps-using-unicorn-and-nginx-on-centos-6-5但更改了某些步骤的目录。我知道该教程在我不更改目录时有效但我真的需要它在我的用户家中运行。任何帮助表示赞赏。

看起来问题出在nginx上。在查看nginx error.log时,我得到了这个:

2014/03/05 14:53:04 [crit] 5756#0: *1 stat() "/home/myuser/myApp/public/tasks/index.html" failed (13: Permission d$
2014/03/05 14:53:04 [crit] 5756#0: *1 stat() "/home/myuser/myApp/public/tasks" failed (13: Permission denied), cli$
2014/03/05 14:53:04 [crit] 5756#0: *1 connect() to unix:/home/myuser/myApp/tmp/unicorn.myApp.sock failed (13: Per$
2014/03/05 14:53:04 [crit] 5756#0: *1 stat() "/home/myuser/myApp/public/500.html/index.html" failed (13: Permissio$
2014/03/05 14:53:04 [crit] 5756#0: *1 stat() "/home/myuser/myApp/public/500.html" failed (13: Permission denied), $
2014/03/05 14:53:04 [crit] 5756#0: *1 connect() to unix:/home/myuser/myApp/tmp/unicorn.myApp.sock failed (13: Per$
2014/03/05 14:53:04 [crit] 5756#0: *1 stat() "/home/myuser/myApp/public/favicon.ico/index.html" failed (13: Permis$
2014/03/05 14:53:04 [crit] 5756#0: *1 stat() "/home/myuser/myApp/public/favicon.ico" failed (13: Permission denied$
2014/03/05 14:53:04 [crit] 5756#0: *1 connect() to unix:/home/myuser/myApp/tmp/unicorn.myApp.sock failed (13: Per$
2014/03/05 14:53:04 [crit] 5756#0: *1 stat() "/home/myuser/myApp/public/500.html/index.html" failed (13: Permissio$
2014/03/05 14:53:04 [crit] 5756#0: *1 stat() "/home/myuser/myApp/public/500.html" failed (13: Permission denied), $
2014/03/05 14:53:04 [crit] 5756#0: *1 connect() to unix:/home/myuser/myApp/tmp/unicorn.myApp.sock failed (13: Per$

我在网上找到的解决方案之一是禁用SELinux。我试过,但没有帮助。这些文件的权限都是777,因此不应该发生这种情况。有什么想法吗?

3 个答案:

答案 0 :(得分:3)

我发现了问题。 unicorn.myapp.sock的路径必须转到root上的/ tmp目录而不是myuser目录中。另外,我的nginx default.conf文件中的根路径需要是root / myApp / public而不是我的。我不知道最后一部分意味着什么,但它有效,我很高兴。感谢所有帮助我来到这里的人。

答案 1 :(得分:0)

昨天我在Ubuntu 12.10以及nginx和独角兽上遇到了502 Bad Gateway问题。这些类型的错误过于通用,因此我能做的最好的事情是帮助您找到有关潜在错误的更多详细信息。在我的例子中,我能够通过查看我的独角兽日志文件的结尾来确定原因。

tail -n 100 /home/unicorn/log/unicorn.log

你的独角兽日志可能位于其他地方,我在使用rails app设置的Digital Ocean服务器上。但我认为你会发现你在unicorn日志文件中收到错误的原因。如果没有,请检查您的nginx错误日志。

在我的情况下,我在系统宝石和我的应用程序之间存在冲突的宝石版本(独角兽没有在我的待办事项下运行在bundle exec下),但你的问题可能是别的。日志将帮助您找出502 Bad Gateway的原因。

答案 2 :(得分:0)

我最近遇到了这个问题。 Unicorn正在被正确执行,其错误的日志很好。 Nginx的错误日志显示“失败13:权限被拒绝”消息。和许多其他用户一样,我检查了unicorn.sock文件的权限,它们是正确的。

问题是不仅unicorn.sock文件需要正确的权限;同样,unicorn文件的整个路径也需要具有可读权限。

chmod o+r

更改这些文件夹的权限后,神奇发生了。