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

Ruby on rails 为Rails配置nginx.conf显示文件目录而不是索引,ruby-on-rails,ruby,linux,nginx,passenger,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_

以下是我的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文件,而不在我的routes中加载home.html.erb文件呢?我可以运行“rails s”,然后执行wget,它会下拉出正确的html文件。

您需要将
根目录设置为项目的
公共
目录:

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

除了另一个答案中的“public”文件夹更正之外,在我看来,包含应用程序的文件夹的权限/所有权似乎存在问题。nginx.conf中应该有一行,比如

user websrv;

它定义了nginx在其下运行的用户。rails应用程序所在的文件夹应为该用户所有,并应适当设置权限。

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

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;
    }

}

如果您的
nginx.conf
中有一个
位置/
,则必须启用乘客_;在该块中,或者删除
位置/
块。我选择删除它。

公共是否有特殊含义?我意识到这样做可能是传统的做法,我将添加一个公共目录并将其全部放在那里。但我所做的只是在github上完成我的rails repo的git操作。你的rails应用程序应该有一个名为
public
的目录,它是由
rails new
生成的。它基本上是所有rails应用程序的web根。谢谢。我在想一些类似public_html的东西。我把它添加到我的配置中,它仍然做同样的事情:
autoindex on会导致公用文件夹的目录列表,如果我将其关闭,则会出现403禁止错误。好的-该回购看起来不错。我想不出你现在描述的行为还有什么其他原因。我已经把配置中的用户行添加到了上面的原始问题中。默认值为“nobody”,但root是所有者。我可以通过设置
自动索引来访问文件。如果权限设置错误,有什么方法可以这样做吗?好的,我理解你说的是nginx是以名为“nobody”的用户的身份运行的,这很好,但是文件夹归root所有,这不好。如果我误解了,请纠正我。否则,请更正所有权。我不知道autoindex在这些情况下会做什么,也不知道autoindex会做什么。我将整个/html目录的所有权更改为“nobody”,并通过在html目录、mrfs目录和公用文件夹上运行
ls-l
来确认这一点。我重新启动了nginx服务器,但仍然得到403禁止的错误。。。好的,现在“nobody”拥有/opt/nginx/html中的所有文件夹和文件。所有文件夹的权限应为RWXR-x,所有文件的权限应为rw-rw-r。我不认为将应用程序安装在/opt/nginx/html中应该是一个问题,但也许nginx认为这是为静态html文件保留的???我们将Rails应用程序放在/var/Rails/[appname]中。另一个建议是设置Capistrano进行部署。一旦配置
cap deploy:setup
将在服务器上准备所有正确的文件夹,并确保它们具有正确的权限和所有权。好吧,那我就不知所措了。这条线可能有助于好运!