为Rails配置nginx.conf显示文件目录不是索引

时间:2011-12-07 22:16:43

标签: ruby-on-rails ruby linux nginx passenger

以下是我在nginx.conf中的内容:

#user  nobody;
worker_processes  1;
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
#pid        logs/nginx.pid;
events {
    worker_connections  1024;
     }
http {
    passenger_root /usr/lib/ruby/gems/1.9.1/gems/passenger-3.0.11;
    passenger_ruby /usr/bin/ruby;
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    #tcp_nopush     on;
    #keepalive_timeout  0;
    keepalive_timeout  65;

    gzip  on;
    gzip_http_version 1.1;
    gzip_comp_level 2;
    gzip_types    text/plain text/html text/css
                  application/x-javascript text/xml
                  application/xml application/xml+rss
                  text/javascript;
    server {
        listen       80;
        server_name  domain.com www.domain.com;

        # autoindex on;
        passenger_enabled on;
        rails_env production;

        access_log  logs/mrfs.access.log;

        location / {
            root   /opt/nginx/html/mrfs/public; #line updated per suggestion below
        }

        }
  }

我可以打开和关闭自动索引,当它被注释掉时会显示403错误,或者当它被打开时会显示目录列表。当我可以访问目录列表时,我可以浏览它们并下载各种文件。在我看来,这不是一个权限问题。当我禁用自动索引时,我在错误日志中得到一个无法列出目录错误。我想我需要做的是告诉nginx如何加载我的index.html.erb文件?我怎么做?这有什么不对吗?

更新

我在/ opt / nginx / html / mrfs / public文件夹中放了一个'index.html',然后加载它。那么什么会导致rails / nginx / passenger在公共场合加载index.html文件,而不是在我的路由中加载home.html.erb文件?我可以运行'rails s',然后执行一个wget http://localhost,它会拉下正确的html文件。

3 个答案:

答案 0 :(得分:3)

您需要将root设置为项目的public目录:

server {
    ...
    passenger_enabled on;
    rails_env production;
    root   /opt/nginx/html/mrfs/public;
}

答案 1 :(得分:2)

以下是我必须将其更改为:

server {
        listen       80;
        server_name  domain.com www.domain.com;
        rails_env production;
        passenger_use_global_queue on;
        access_log  logs/mrfs.access.log;
         root   /opt/nginx/html/mrfs/public;
        passenger_enabled on;
       error_page  404              /404.html;
       error_page   500 502 503 504  /50x.html;
    }

}

如果location /中有nginx.conf,那么您必须启用passenger_enabled;在其中或者删除location /块。我选择删除它。

答案 2 :(得分:1)

除了另一个答案中的“公共”文件夹更正外,我觉得包含您的应用程序的文件夹的权限/所有权存在问题。 nginx.conf中应该有一行像...

user websrv;

定义了nginx在其下运行的用户。您的rails应用程序的文件夹应归该用户所有,并且应正确设置权限。