Почему я получаю 404 ошибки с Sinatra с Passenger под nginx? - PullRequest
2 голосов
/ 27 мая 2011

У меня есть приложение на основе Sinatra, которое отлично работает локально.

Я переместил его на сервер nginx с Passenger, и теперь все мои ссылки на файлы в моих приложениях /public возвращают 404 ошибки. Основное приложение работает, имеет возможность доступа к шаблонам HAML в /view, которые отображаются правильно. Файлы существуют, и разрешения правильны; Я могу открывать и редактировать их, чтобы я знал, что они там.

В моих шаблонах HAML я имею в виду файлы, к которым у меня нет доступа, вот так:

%script{ :src => 'js/jquery.js' }
%link{ "rel" => "stylesheet", "href" => "styles/input.css" }

Мой config.ru претерпел множество мутаций, пока я пытаюсь найти проблему. В настоящее время у меня есть:

require 'sinatra'
require './peering_template.rb'

root_dir = File.dirname(__FILE__)

# disable :run
# set :root, root_dir
# set :views, File.join(File.dirname(__FILE__), 'views')
# set :environment, (ENV['RACK_ENV'] ? ENV['RACK_ENV'].to_sym : :development)

run Sinatra::Application 

Приложение существует в /home/apps/peering_template.

Веб-пространство /home/webapps.

В /home/webapps есть софт-ссылка, например: peering_template -> /home/apps/peering_template/public/.

/home/webapps/
`-- peering_template -> /home/apps/peering_template/public/

Соответствующая часть nginx.conf для этого конфига:

server {
    listen      3000;
    server_name my_servers_name;
    root        /home/webapps;

    passenger_enabled  on;
    passenger_base_uri /peering_template;
}

Очевидно, что имя моего сервера другое.

Соответствующая часть из nginx 'error.log выглядит так:

"/home/webapps/js/jquery.js" failed (2: No such file or directory), request: "GET /js/jquery.js HTTP/1.1"

Насколько я могу судить, это соответствует указаниям для " nginx и конфигурации пассажира с использованием под-URI ". Чего мне не хватает?


/home/apps/peering_template/
|-- config.ru
|-- lib
|   |-- bgp-config.rb
|   |-- ios-xr-config.rb
|   |-- ipv4_ipv6_grammar.rb
|   `-- ipv4_ipv6_grammar.treetop
|-- nginx.conf
|-- peering_template.rb
|-- public
|   |-- js
|   |   |-- jquery-1.6.min.js
|   |   |-- jquery-ui-1.8.12.custom.zip
|   |   |-- jquery.js -> jquery-1.6.min.js
|   |   `-- scripts.js
|   |-- peering_template_tool.htm
|   `-- styles
|       `-- input.css
|-- spreadsheets
|   |-- Peering Template-AMS-IX.xlsx
|   `-- Peering Template-IOS-XR-ASH1.xlsx
|-- tmp
|   `-- always_restart.txt
`-- views
    |-- index.haml
    `-- output.haml

Я не уверен, имеет ли это значение, но это на хосте CentOS release 5.3 (Final), работающем с nginx/1.0.0 и passenger (3.0.7).

Ответы [ 2 ]

4 голосов
/ 04 июня 2011

В исходном вопросе я написал:

Я переместил его на сервер nginx с помощью Passenger, и теперь все мои ссылки на файлы в моих приложениях / общедоступных возвращают 404 ошибки.Основное приложение работает, имеет возможность доступа к шаблонам HAML в / view, которые отображаются правильно.Файлы существуют, и разрешения правильны;Я могу открыть и отредактировать их, чтобы знать, что они там.

Это была моя подсказка.На четвертом проходе или около того через Документы для пассажиров я натолкнулся на раздел, в котором говорилось об ошибках с /public активами:

Второй и очень рекомендуемый способ - всегда использоватьRails вспомогательные методы для вывода тегов для статических ресурсов.Эти вспомогательные методы автоматически позаботятся о добавлении базового URI, на котором вы развернули приложение.Для изображений есть image_tag, для JavaScript - javascript_include_tag, а для CSS - stylesheet_link_tag.В приведенном выше примере вы просто удалили бы тег HTML и заменили его встроенным Ruby следующим образом:

Итак, я получил поиски похожих помощников для Синатры.Я нашел на странице расширений Sinatra :

sinatra-url-for для создания абсолютных путей и полных URL-адресов к действиям в приложении Sinatra

sinatra-static-assets реализует помощники image_tag, stylesheet_link_tag, javascript_script_tag и link_tag.Эти помощники создают правильные абсолютные пути для приложений, отправляемых на подчиненный URI.

И это заставило меня искать документы Синатры, потому что это вызвало воспоминания, и я переучил встроенный «URL» Синатры method:

Генерация URL

Для генерации URL вы должны использовать вспомогательный метод url, например, в Haml:

% a {: href =>url ('/ foo')} foo

Принимает во внимание обратные прокси-серверы и маршрутизаторы Rack, если они присутствуют.

Этот метод также имеет псевдоним to (см. пример ниже).

Используя методы статического ресурса или собственный помощник Синатры, он устранил проблему.

1 голос
/ 27 мая 2011

Корень в вашей конфигурации nginx должен быть общедоступным (или каким-либо другим) каталогом, а не корнем всего приложения rails:

root        /home/webapps/public;

Теперь поместите все ваши статические файлы в этот каталог, и Passengerбудет достаточно умен, чтобы автоматически найти файл config.ru Rack up из родительского каталога, но обслуживать файлы из общего каталога, если они существуют через nginx.

Для чего бы это ни стоило, вам не следуетне нужно ничего, кроме требования вашего ruby-файла приложения и метода init Sinatra в вашем файле стойки.Вот один из них, который я использую в другом приложении:

require 'application'
run Sinatra::Application

Еще одна небольшая заметка, рекомендуется прикреплять / перед любыми URL-адресами, которые ссылаются на эти статические файлы, чтобы обеспечить их доступность везде, где находится URL-адрес страницы.заканчивается, например....:src => '/js/jquery.js'...

Редактировать:

Я думаю, что существует фундаментальная проблема с настройкой вашего приложения на сервере.На мой взгляд, это должно выглядеть примерно так:

/app
  whatever.rb
  /public
    ...

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

Имея это в виду, возможно, корень должен быть просто установлен прямо на /home/apps/peering_template/public?

...