使用nginx将Rails应用程序移至生产环境

时间:2013-03-11 04:32:17

标签: ruby-on-rails-3 nginx

我正在使用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命名空间内。)< / p>

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

好的我发现了这个:config.consider_all_requests_local是一面旗帜。如果为true,那么任何错误都会导致详细的调试信息被转储到HTTP响应中,Rails :: Info控制器将在/ rails / info / properties中显示应用程序运行时上下文。默认情况下,在开发和测试环境中为True,在生产模式下为false。对于更细粒度的控制,将其设置为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应用程序无效。所以我想我会放弃然后去睡觉。

3 个答案:

答案 0 :(得分:0)

您忘了添加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;
}

同时检查乘客和导轨是否在相同的环境(生产或开发)中工作。

答案 1 :(得分:0)

对于将来可能遇到此问题的用户,请先检查服务器中的生产日志。

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

答案 2 :(得分:-1)

我也面临同样的问题,但由于许可我后来发现病房,我们的应用程序无法访问特定文件夹。

尝试此命令:

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