Назад | Перейти на главную страницу

Rails 3 показывает ошибку 404 вместо index.html (nginx + unicorn)

у меня есть index.html в общественные / который должен загружаться по умолчанию, но вместо этого я получаю ошибку 404 при попытке доступа http://example.com/

Страница, которую вы искали, не существует.

Возможно, вы ошиблись при вводе адреса или страница могла быть перемещена.

Это как-то связано с nginx и единорог что я использую для власти Рельсы 3

Когда вы извлекаете единорога из файла конфигурации nginx, проблема исчезает, и index.html загружается нормально.

Вот мой nginx Файл конфигурации:

upstream unicorn {
    server unix:/tmp/.sock fail_timeout=0;
}

server {
    server_name example.com;
    root /www/example.com/current/public;
    index index.html;

    keepalive_timeout 5;

    location / {
        try_files $uri @unicorn;
    }

    location @unicorn {
        proxy_pass http://unicorn;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_redirect off;
    }
}

Мой config / routes.rb почти пусто:

Advertise::Application.routes.draw do |map|
  resources :users
end

В index.html файл находится в public / index.html и загружается нормально, если я запрашиваю его напрямую: http://example.com/index.html

Повторюсь, когда я удаляю все ссылки на единорога из nginx conf, index.html загружается без каких-либо проблем, мне трудно понять, почему это происходит, потому что nginx по умолчанию должен пытаться загрузить этот файл самостоятельно.

-

Вот стек ошибок из production.log:

Started GET "/" for 68.107.80.21 at 2010-08-08 12:06:29 -0700
  Processing by HomeController#index as HTML
Completed   in 1ms

ActionView::MissingTemplate (Missing template home/index with {:handlers=>[:erb, :rjs, :builder, :rhtml, :rxml, :haml], :formats=>[:html], :locale=>[:en, :en]} in view paths
"/www/example.com/releases/20100808170224/app/views", 
"/www/example.com/releases/20100808170224/vendor/plugins/paperclip/app/views", 
"/www/example.com/releases/20100808170224/vendor/plugins/haml/app/views"):
/usr/local/rvm/gems/ruby-1.9.2-rc2/gems/actionpack-3.0.0.beta4/lib/action_view/paths.rb:14:in `find'
  /usr/local/rvm/gems/ruby-1.9.2-rc2/gems/actionpack-3.0.0.beta4/lib/action_view/lookup_context.rb:79:in `find'
  /usr/local/rvm/gems/ruby-1.9.2-rc2/gems/actionpack-3.0.0.beta4/lib/action_view/base.rb:186:in `find_template'
  /usr/local/rvm/gems/ruby-1.9.2-rc2/gems/actionpack-3.0.0.beta4/lib/action_view/render/rendering.rb:45:in `_determine_template'
  /usr/local/rvm/gems/ruby-1.9.2-rc2/gems/actionpack-3.0.0.beta4/lib/action_view/render/rendering.rb:23:in `render'
  /usr/local/rvm/gems/ruby-1.9.2-rc2/gems/haml-3.0.15/lib/haml/helpers/action_view_mods.rb:13:in `render_with_haml'
  etc...

-

Журнал ошибок nginx для этого виртуального хоста оказывается пустым:

2010/08/08 12:40:22 [info] 3118#0: *1 client 68.107.80.21 closed keepalive connection

Я предполагаю, что единорог перехватывает запрос к index.html до того, как nginx сможет его обработать.

Проблема здесь:

    try_files $uri @unicorn;

Это должно читаться так:

    try_files $uri $uri/ @unicorn;

Что также избавляет от необходимости использовать зло if, и не требует, чтобы Rails обслуживал статические файлы (что медленно).

это кажется работать. Мне пришлось отредактировать конфигурационный файл nginx: /etc/nginx/servers/appname.conf

location / {
  ...stuff...

  # check for index.html for directory index
  # if its there on the filesystem then rewite 
  # the url to add /index.html to the end of it
  # and then break to send it to the next config rules.
  if (-f $request_filename/index.html) {
    rewrite (.*) $1/index.html break;
  }

  ...other stuff..

}

С помощью config.serve_static_assets = true придумал только около половины запросов в секунду, как я получаю после добавления этого и наличия config.serve_static_assets = false

Rails 3 по умолчанию не обслуживает статические ресурсы. Вы должны настроить свой веб-сервер для обслуживания общедоступного сервера или добавить

config.serve_static_assets = true

в вашу производственную среду http://docs.heroku.com/rails3