【问题标题】:Moving Rails app to production with nginx使用 nginx 将 Rails 应用程序迁移到生产环境
【发布时间】:2018-03-19 04:44:15
【问题描述】:

我在 VPS 上。我用rails new rails_app -d mysql 创建了一个新的rails 应用程序。 我正在与乘客一起运行 nginx。我正在运行 Rails 3.2.12 和 Ruby 1.9.3。在我的 nginx.conf 文件中,我将以下内容添加到 server 指令中:

listen       80;
server_name  www.mydomain.com;
passenger_enabled on;
root /home/mike/www/rails_app/public;
rails_env production;

当我指向 www.mydomain.com 时,我看到欢迎加入您正在使用 Ruby on Rails!。当我单击关于您的应用程序的环境时,我收到此错误:

The page you were looking for doesn't exist.

当我检查我的 production.log 时,我看到了这个错误并且不知道如何处理它:

ActionController::RoutingError (No route matches [GET] "/rails/info/properties")

我彻夜未眠,阅读了所有与此类似的 SO 问题,但我仍然无法解决我的问题。如果我在开发中运行它,一切正常。

编辑

我找到了 Rails 2.3.4 问题的解释:该链接触发了对 rails/info/properties 的 AJAX 请求。属性操作在 Rails::InfoController 中定义,它位于 /rails/railties/builtin/rails_info/rails/info_controller.rb 中。

路由不需要显式定义,因为它符合 Rails 的默认路由 :controller/:action/:id (尽管在这种情况下没有 ID 并且控制器位于 Rails 命名空间中。)

但我在任何地方都没有看到info_controller.rb

好的,我发现了这个:config.consider_all_requests_local 是一个标志。如果为 true,那么任何错误都会导致详细的调试信息转储到 HTTP 响应中,并且 Rails::Info 控制器将在 /rails/info/properties 中显示应用程序运行时上下文。在开发和测试环境中默认为真,在生产模式下为假。对于更细粒度的控制,将其设置为 false 并实现 local_request?在控制器中指定哪些请求应提供有关错误的调试信息。

但将其设置为 false 不会执行任何操作。

编辑 2 好吧,我是个白痴。在某处找到这个:You're clicking the "About your application’s environment" link on the Rails default index.html page. This link only works in development environment, not in production.

整个晚上我都认为我的 Rails 应用程序无法正常工作。所以我想我会放弃并去睡觉。

【问题讨论】:

    标签: ruby-on-rails-3 nginx


    【解决方案1】:

    您忘记添加passenger_base_uri:

    server {
        listen 80;
        server_name domain.com;
        charset utf-8;
        root /www/domain.com/public_html;
        passenger_enabled on;
        passenger_base_uri /blog;
        rails_spawn_method smart;
        rails_env production;
    }
    

    还要检查乘客和铁路是否在相同的环境(生产或开发)中工作。

    【讨论】:

    • 开发工作正常。我添加了passenger_base_uri 仍然是同样的错误。我不明白什么是试图路由到 /rails/info/properties
    【解决方案2】:

    对于以后可能遇到此问题的人,请先检查服务器中的生产日志。

    1. ssh 进入你的服务器,ssh username@serverIP
    2. 检查最后20条左右的错误消息tail -20 /home/username/appname/current/log/production.log
    3. 如果这是您代码中的错误(我的代码由于空 db 而返回空数组),请修复该错误并再次运行 cap production deploy
    4. 重复以检查更多错误。

    【讨论】:

      【解决方案3】:

      我也遇到了同样的问题,但是后来我发现由于权限问题,我们的应用程序无法访问特定的文件夹。

      试试这个命令:

      chmod -R 777 {name of your project folder}/
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-17
        • 2010-12-29
        • 1970-01-01
        相关资源
        最近更新 更多