首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我在nginx下的乘客与辛纳特拉有404个错误?

为什么我在nginx下的乘客与辛纳特拉有404个错误?
EN

Stack Overflow用户
提问于 2011-05-26 22:22:09
回答 2查看 3K关注 0票数 2

我有一个基于Sinatra的应用程序,在本地运行良好。

我把它移到了一个基于nginx的带有乘客的服务器上,现在我所有指向我应用程序中的文件的链接都返回了404个错误。主应用程序运行时,能够访问/view中的HAML模板,该模板将正确呈现。文件存在并且权限是正确的;我可以打开和编辑它们,这样我就知道它们在那里了。

在我的HAML模板中,我指的是无法像这样访问的文件:

代码语言:javascript
复制
%script{ :src => 'js/jquery.js' }
%link{ "rel" => "stylesheet", "href" => "styles/input.css" }

在我试图找出问题的时候,我的config.ru经历了很多变异。目前我有:

代码语言:javascript
复制
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/

代码语言:javascript
复制
/home/webapps/
`-- peering_template -> /home/apps/peering_template/public/

用于此配置的nginx.conf的相关部分是:

代码语言:javascript
复制
server {
    listen      3000;
    server_name my_servers_name;
    root        /home/webapps;

    passenger_enabled  on;
    passenger_base_uri /peering_template;
}

显然,我的服务器的名称是不同的。

nginx‘error.log的相关部分如下:

代码语言:javascript
复制
"/home/webapps/js/jquery.js" failed (2: No such file or directory), request: "GET /js/jquery.js HTTP/1.1"

据我所知,这符合"nginx和使用子URI的乘客配置“的说明。我遗漏了什么?

代码语言:javascript
复制
/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.0passenger (3.0.7)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-06-04 16:05:23

我在最初的问题中写道:

我把它移到了一个基于nginx的带有乘客的服务器上,现在我所有指向我应用程序中的文件的链接都返回了404个错误。主应用程序运行时,能够访问/view中的HAML模板,该模板将正确呈现。文件存在并且权限是正确的;我可以打开和编辑它们,这样我就知道它们在那里了。

这是我的线索。在我第四次通过旅客证件时,我遇到了一个讨论/public资产错误的部分:

第二种也是强烈推荐的方法是始终使用Rails助手方法输出静态资产的标记。这些帮助器方法会自动处理部署应用程序的基本URI之前的问题。对于图像,有image_tag,对于JavaScript,有javascript_include_tag,对于CSS,有stylesheet_link_tag。在上面的示例中,您只需删除HTML标记,并将其替换为内联Ruby,如下所示:

所以,这让我为辛纳特拉寻找了类似的帮手。我在Sinatra的扩展页面找到的

西纳屈-url-for为Sinatra应用程序中的操作构造绝对路径和完整URL。 sinatra-静态资产实现了image_tag、stylesheet_link_tag、javascript_script_tag和link_tag帮助程序。这些帮助程序为分派到子URI的应用程序构造正确的绝对路径。

这让我搜索了辛纳特拉的文档,因为它激发了我的记忆,我重新学习了西纳屈的内置"url“方法:

生成URL 为了生成url,您应该使用url助手方法,例如,在Haml中: %a{:href => url('/ foo ')} foo 如果存在,它会考虑反向代理和Rack路由器。 此方法也被别名为to (示例见下文)。

通过使用静态资产方法或Sinatra自己的url助手,它解决了问题。

票数 4
EN

Stack Overflow用户

发布于 2011-05-26 22:34:04

nginx配置中的根目录应该是公共(或其他)目录,而不是整个rails应用程序的根目录:

代码语言:javascript
复制
root        /home/webapps/public;

现在,将所有静态文件放入该目录中,乘客将足够聪明地自动解析父目录中的config.ru Rack向上文件,但如果这些文件存在于nginx中,则从公共目录中提供这些文件。

至于它的价值,您应该不需要任何东西,只需要您的应用程序ruby文件的要求,以及您的机架文件中的Sinatra init方法。下面是我在另一个应用程序中使用的一个:

代码语言:javascript
复制
require 'application'
run Sinatra::Application

另一个小注意,最好的做法是在引用这些静态文件的URL前面放置一个/,以确保无论页面URL在哪里都可以访问它们,例如。...:src => '/js/jquery.js'...

编辑:

我认为在服务器上安装应用程序的方式有一个根本的问题。在我看来,应该是这样的:

代码语言:javascript
复制
/app
  whatever.rb
  /public
    ...

nginx配置应该指向app/public作为根,而public目录不应该是一个符号链接。

考虑到所有这些,也许应该直接将根设置为/home/apps/peering_template/public

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6145819

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档