【问题标题】:404 Not Found error in deploying rails 3.2.12 app (with engines) to SUB URI on nginx/passenger将 rails 3.2.12 应用程序(带引擎)部署到 nginx/passenger 上的 SUB URI 时出现 404 Not Found 错误
【发布时间】:2013-05-08 02:02:47
【问题描述】:

我们需要在ubuntu 12.04 服务器上部署rails 3.2.12 appsub uri nbhyrails app 有 3 个engines,其中一个是authentify,用于用户身份验证。主应用程序的根指向 authentify 的登录页面。这是主应用程序中的 routes.rb:

  root :to => "authentify::sessions#new"
  match '/signin',  :to => 'authentify::sessions#new'
  match '/signout', :to => 'authentify::sessions#destroy'
  match '/user_menus', :to => 'user_menus#index'
  match '/view_handler', :to => 'authentify::application#view_handler'

应用程序部署到基础 uri nbhy,在 ubuntu 12.04passenger and nginx 上运行。在同一台服务器上,另一个 Rails 应用程序在其自己的子 uri 中运行。这是 nginx.conf 中sub uri nbhy 的配置:

server {
   listen 80;
   server_name 6.95.225.93;
   root /var/www/;
   passenger_enabled on;
   rails_env production;
   passenger_base_uri /by;
   passenger_base_uri /nbhy;

   #for rails >=3.1, assets pipeline
   location ~ ^/assets/ {
     expires max;
     add_header Cache-Control public;
     add_header ETag "";
     break;
   }
}

还在document root /var/www 上创建一个symlink nbhy 指向/var/www/nbhyop/current/public。这是root /var/www/的输出:

total 8
lrwxrwxrwx 1 cjadmin www-data   28 Nov  3  2012 by -> /var/www/byop/current/public
drwxrwsr-x 4 cjadmin www-data 4096 Nov  4  2012 byop
lrwxrwxrwx 1 cjadmin www-data   30 May 16 21:27 nbhy -> /var/www/nbhyop/current/public
drwxrwsr-x 4 cjadmin www-data 4096 May 14 15:21 nbhyop

by 是部署到 sub URIfirst rails 应用程序,并且运行良好。

在输入http://6.95.225.93/nbhy 后会显示login page。输入用户名和密码后,页面被重定向到http://6.95.225.93/authentify/session,出现404 Not Found 错误。在nginxerror.log发现错误:

2013/05/13 16:29:25 [error] 2384#0: *1 open() "/var/www/authentify/session" failed (2: No such file or directory), client: 192.168.1.1, server: 6.95.225.93, request: "POST /authentify/session HTTP/1.1", host: "6.95.225.93", referrer: "http://6.95.225.93/nbhy/"

显然/var/www/authentify/session 不会点击正确的页面,因为它缺少wwwauthentify 之间的base uri nbhy。根据我们的分析,authentify session controller 中的create 没有被命中,即使http://6.95.225.93/nbhy 的用户名和密码正确,用户也没有通过身份验证。

还发现用户可以在http://6.95.225.93/nbhy/authentify/session/new login 进行一些改动。登录后页面将被重定向到http://6.95.225.93/user_menus,这将抛出404 Not Found 错误。但是,如果我们在两者之间插入nbhy 为:http://6.95.225.93/nbhy/user_menus,那么它将成功调出user menus page。对于任何进一步点击链接,手动插入nbhy 将使链接工作(如果nbhy 缺失)。

在没有sub uri 的情况下部署时,rails 应用运行良好。

为什么路由中缺少 sub uri?有没有办法让nbhy 留在此处并消除错误?感谢您的帮助。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 ubuntu nginx passenger


    【解决方案1】:

    很可能authentify 引擎正在重定向到/user_menus,而不是/nbhy/authentify。这是您编写的自定义 Rails 或 Sinatra 应用程序吗?如果是这样,您需要更改/配置 authentify 的代码以始终附加当前托管 Rails 应用程序的子目录。您可以通过在代码中输入 ENV['RAILS_RELATIVE_URL_ROOT'] 从乘客那里获得。

    【讨论】:

    • redirect_to '/user_menus' 。你说的对。用户被授权后,authentify 会重定向到 /user_menus,如上。我们可以这样做:redirect_to ENV['RAILS_RELATIVE_URL_ROOT']+'/user_menus'?上面的行在开发中可以吗?
    • 我们还需要把这个相对 url 根放在应用程序的每个重定向中吗?我们仍然不太明白为什么最后 2 次部署到 sub uri 工作正常(仅使用 nginx.conf 中的配置和上面的符号链接),而这个使用引擎的部署变得如此困难。
    • 很遗憾,您需要使用ENV['RAILS_RELATIVE_URL_ROOT'] + '/user/menus'。如果您使用的是 Rails 路径助手(如user_pathlogin_path 等),那么您没有问题,它们会自动附加相对 URL 根。但是,如果您要自己重定向到自定义路径,那么您需要自己执行此操作。
    • 我建议创建一个像 def redirect_relative_to 这样的辅助函数,如果给定的 URL 以 / 开头,它会自动附加 ENV['RAILS_RELATIVE_URL_ROOT']。然后你可以在任何地方使用这个函数,而不是普通的redirect_to
    • 在应用程序中定义了一个常量 SUBURI,它等于 '/nbhy' 用于生产和 '' 用于开发/测试。 SUBURI 以 url 为前缀。在之前的部署中,我们注意到不需要将 SUBURI 前缀到常规路径,例如 users_path。只有自定义路由需要 SUBURI。在此部署中仍然如此吗? (我们对 Rails 中的路由知之甚少)。
    【解决方案2】:

    Rails 直接从http://6.95.225.93 生成路径,而不是http://6.95.225.93/nbhy

    您可能需要将所有路由范围限定为“/nbhy”。

    config/routes.rb

    scope "/nbhy" do
      ...
    end
    

    【讨论】:

    • 将再次尝试范围。我们还需要在 nginx 和 symlink 中保留当前配置吗?
    • 关于 routes.rb 中范围的另一个问题:如何在没有 nbhy 的情况下处理开发中的路由?我们可以做范围“/nbhy”|| "/" 做什么?
    • 使用 sope '/nbhy' 后,手动插入一个额外的 /nbhy 后,用户菜单页面将显示为 6.95.225.93/nbhy/nbhy/user_menus。我们可以登录6.95.225.93/nbhy/nbhy/authentify/session/new。似乎在没有范围的情况下具有相同的路由行为。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-14
    • 2014-03-11
    • 2013-02-20
    • 2018-10-01
    • 1970-01-01
    • 2021-07-20
    • 1970-01-01
    相关资源
    最近更新 更多