Linode 更新 - 在使用 Rails 和 Passenger Nginx 时出现 403 Forbidden 错误

3
你好,我的应用程序一直运行正常,直到Linode在服务器上进行了某种硬件更新。服务器上的所有文件仍然存在,而且一切似乎与以前相同。我联系了Linode,他们提到可能是权限问题(但我找不到),并且他们无法提供更多帮助。
Nginx错误日志显示如下:
2015/06/21 18:07:23 [error] 2870#0: *19684 directory index of
"/home/aurelplouf/apps/myapp/current/public/" is forbidden, 
client: XXX.XXX.XXX.XXX, server: XXX.XXX.XX.XX, request: "GET / HTTP/1.1", 
host: "myapp.com"

我有点茫然,因为我的部分没有任何变化。

我检查了passenger-config --root

/home/aurelplouf/.rvm/gems/ruby-2.1.2@rails3.2/gems/passenger-4.0.53

查看Ruby版本

/home/aurelplouf/.rvm/rubies/ruby-2.1.2/bin/ruby

并且使用以下设置的 nginx.conf:

http {
    passenger_root /home/aurelplouf/.rvm/gems/ruby-2.1.2@rails3.2/gems/passenger-5.0.11;
    passenger_ruby /home/aurelplouf/.rvm/gems/ruby-2.1.2@rails3.2/wrappers/ruby;

    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    server {
        listen       80;
        server_name  xxx.xxx.xx.xx myapp.com www.myapp.com *.myapp.com
        root /home/aurelplouf/apps/myapp/current/public;
        passenger_enabled on;

        location / {
            #root   html;
            # root /home/aurelplouf/apps/myapp/current/public;
            # index  index.html index.htm;
            passenger_enabled on;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

更新最终我检查了公共文件夹中的文件权限。

aurelplouf@ruby:~/apps/myapp/current$ ls -al public
total 32
drwxrwxr-x  2 aurelplouf aurelplouf 4096 Jun 21 17:15 .
drwxrwxr-x 15 aurelplouf aurelplouf 4096 Jun 21 17:15 ..
-rw-rw-r--  1 aurelplouf aurelplouf  728 Feb 15  2014 404.html
-rw-rw-r--  1 aurelplouf aurelplouf  711 Feb 15  2014 422.html
-rw-rw-r--  1 aurelplouf aurelplouf  643 Feb 15  2014 500.html
lrwxrwxrwx  1 aurelplouf aurelplouf   51 Jun 21 17:13 assets -> /home/aurelplouf/apps/myapp/shared/assets
-rw-rw-r--  1 aurelplouf aurelplouf 1150 Feb 15  2014 favicon.ico
-rw-rw-r--  1 aurelplouf aurelplouf  431 Oct 21  2014 robots.txt
-rw-rw-r--  1 aurelplouf aurelplouf  340 Oct 21  2014 sitemap.xml.gz
lrwxrwxrwx  1 aurelplouf aurelplouf   51 Jun 21 17:15 system -> /home/aurelplouf/apps/myapp/shared/system
lrwxrwxrwx  1 aurelplouf aurelplouf   52 Jun 21 17:15 uploads -> /home/aurelplouf/apps/myapp/shared/uploads

在您的公共目录上运行 ls -al 命令。如果没有 -a 标志,则不包括该目录本身的权限。 - Andrew Marshall
谢谢你,安德鲁。我刚刚更新了我的答案。 - Zedrian
你能否添加你的站点在 nginx.conf 中的 server 部分? - sjaime
@sjaime,我更新了帖子并添加了更多的nginx.conf。谢谢!我还在公共文件夹中添加了一个index.html,我可以访问它,但是由于某种奇怪的原因,似乎Rails路由没有生效。 - Zedrian
1个回答

3
passenger_enabled指令在配置文件中只能出现一次。请将其保留在服务器级别并删除location /块。
此外,您可能需要在server部分中添加一个资产块,以允许浏览器对静态资源进行缓存(只要您使用rails资产管道),这样可以提高性能。
http {
  passenger_root /home/aurelplouf/.rvm/gems/ruby-2.1.2@rails3.2/gems/passenger-5.0.11;
  passenger_ruby /home/aurelplouf/.rvm/gems/ruby-2.1.2@rails3.2/wrappers/ruby;

  include       mime.types;
  default_type  application/octet-stream;
  sendfile        on;
  keepalive_timeout  65;

  server {
    listen       80;
    server_name  xxx.xxx.xx.xx myapp.com www.myapp.com *.myapp.com;
    root /home/aurelplouf/apps/myapp/current/public;
    passenger_enabled on;

    location ~ ^/(assets)/  {
            root /home/aurelplouf/apps/myapp/current/public;
            gzip_static on;
            expires max;
            add_header Cache-Control public;
            gzip_vary on;
            etag off;
    }


    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }
  }
}

我解决了这个问题,原来不是我的配置有问题,虽然我注意到了你的评论。权限和Nginx配置都没有问题。然而,Linode进行了硬件维护,这是问题的根源。尽管重启和重新加载Nginx服务,但都没有帮助。在重新安装Passenger gem、Passenger-nginx-module后,我找到了nginx.pid,发现重启并不能杀死pid,所以我只运行了“kill pid”命令,现在它可以工作了。感谢您的帮助! - Zedrian
我已经更新了您的答案,并将为您颁发奖励。在 Stack Overflow 上,我找不到与我的问题相关的 PID 的任何内容,因此这对于其他遇到此类问题的人会很有帮助。如果需要,请批准我的编辑或重新格式化它。 - Zedrian
很高兴最终你解决了问题。我认为我不能批准您的编辑,因为它会进入审核队列,任何具有足够声望的 SO 成员可以投票批准或拒绝它(需要多个投票)。 - sjaime

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