у меня есть 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