简体   繁体   English

Rails 3 - 生产模式中的开发错误

[英]Rails 3 - development errors in production mode

Im using Rails, Passenger (both are 3.0.5) and Nginx on my production server. 我在生产服务器上使用Rails,Passenger(均为3.0.5)和Nginx。 As I heard, Rails should show public/404.html or public/500.html instead of development errors like ActiveRecord::RecordNotFound or Unknown action but that doesn't happen. 正如我所听到的,Rails应该显示public/404.htmlpublic/500.html而不是像ActiveRecord::RecordNotFoundUnknown action那样的开发错误,但这不会发生。 I've tried to delete config.ru file and set rack_env or rails_env in nginx.conf but nothing helped. 我试图删除config.ru文件并在nginx.conf中设置rack_env或rails_env,但没有任何帮助。

Here is my nginx.conf: 这是我的nginx.conf:

worker_processes  1;

events {
    worker_connections  1024;
}

http {
    passenger_root /home/makk/.rvm/gems/ruby-1.9.2-p0/gems/passenger-3.0.5;
    passenger_ruby /home/makk/.rvm/bin/passenger_ruby;
    #passenger_ruby /home/makk/.rvm/wrappers/ruby-1.9.2-p0/ruby;

    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    keepalive_timeout  65;

    server {
        listen       80;
        server_name  localhost;

        location / {
            root   /home/makk/projects/1server/deploy/current/public;
            index  index.html index.htm;
            passenger_enabled on;
            rack_env production;

            recursive_error_pages on;

            if (-f /home/makk/projects/1server/maintenance.html) {
              return 503;
            }

            error_page 404 /404.html;
            error_page 500 502 504 /500.html;
            error_page 503 @503;
        }

        location @503 {
            error_page 405 = /maintenance.html;

            # Serve static assets if found.
              if (-f $request_filename) {
              break;
            }
            rewrite ^(.*)$ /maintenance.html break;
        }

        location ~ ^(\/phpmyadmin\/)(.*)$ {
        fastcgi_pass    127.0.0.1:9000;
        fastcgi_index   index.php;
        fastcgi_split_path_info         ^(\/phpmyadmin\/)(.*)$;
        fastcgi_param   SCRIPT_FILENAME /usr/share/phpmyadmin/$fastcgi_path_info;
        include         fastcgi_params;
        }
    }
}

It seems that this question duplicates this one but there are no working suggestions. 看来,这个问题重复这一个 ,但没有工作的建议。

UPD : I have both development and production apps on same PC. UPD :我在同一台PC上同时拥有开发和生产应用程序。 In production Rails ignores config.consider_all_requests_local = false (in /config/environments/production.rb) due to local_request? 在生产中,由于local_request? Rails会忽略config.consider_all_requests_local = false (在/config/environments/production.rb中) local_request? method. 方法。 So one of possible solutions is listed below (taken from here ): 因此下面列出了一种可能的解决方案(取自此处 ):

# config/initializers/local_request_override.rb
module CustomRescue
  def local_request?
    return false if Rails.env.production? || Rails.env.staging?
    super
  end
end

ActionController::Base.class_eval do
  include CustomRescue
end

Or for Rails 3: 或者对于Rails 3:

class ActionDispatch::Request
 def local?
   false
 end
end

To get this working in Rails 3 you'll have to do the following: 要在Rails 3中使用它,您必须执行以下操作:

First, create your 404 and 500 error pages. 首先,创建404和500错误页面。 I put mine in app/views/errors/404.html.erb and app/views/errors/500.html.erb . 我把我放在app/views/errors/404.html.erbapp/views/errors/500.html.erb

Second, add the following to application_controller.rb: 其次,将以下内容添加到application_controller.rb:

unless Rails.application.config.consider_all_requests_local
  rescue_from Exception, :with => :render_error
  rescue_from ActiveRecord::RecordNotFound, :with => :render_not_found
  rescue_from AbstractController::ActionNotFound, :with => :render_not_found
  rescue_from ActionController::RoutingError, :with => :render_not_found
  rescue_from ActionController::UnknownController, :with => :render_not_found
  rescue_from ActionController::UnknownAction, :with => :render_not_found
end

def render_error exception
  Rails.logger.error(exception)
  render :template => "/errors/500.haml", :status => 500
end

def render_not_found exception
  Rails.logger.error(exception)
  render :template => "/errors/404.haml", :status => 404
end

Finally, make your production.rb not consider all requests local: 最后,让你的production.rb不考虑所有本地请求:

config.consider_all_requests_local = false

PS: Keep in mind that when a complete routing error happens - ie when there is absolutely no route match, not just an ActiveRecord NotFound error, the public/404.html will get displayed, so it's good to have that in place. PS:请记住,当发生完整的路由错误时 - 即绝对没有路由匹配,而不仅仅是ActiveRecord NotFound错误,public / 404.html将会显示,因此最好将其设置到位。 I usually just re-direct it to my errors_controller, which ensures that any 404 errors not caught by the latter mentioned exceptions are still properly redirected to ErrorsController. 我通常只是将它重定向到我的errors_controller,这可以确保后面提到的任何404错误都没有被正确地重定向到ErrorsController。

<script type="text/javascript">
<!--
window.location = "<%= request.host_with_port %>/errors/404"
//-->
</script>

To get errors only in certain controllers 仅在某些控制器中获取错误

class AdminController < ApplicationController
  rescue_from Exception, :with => :render_simple_error if Rails.env.production?
  def render_simple_error(e)
    render :text => "#{e.message} -- #{e.class}<br/>#{e.backtrace.join("<br/>")}"
  end
end

Move your root declaration up to the "server" block so the server can use the Rails app defined error handling pages when it receives a 5XX, 4XX error. root声明移动到“服务器”块,以便服务器在收到5XX,4XX错误时可以使用Rails应用程序定义的错误处理页面。

Or add error_page directives to the location block where passenger is being used so the error handlers can resolve the public/5xx.html in the Rails app public directory when needed. 或者将error_page指令添加到正在使用乘客的位置块,以便错误处理程序可以在需要时解析Rails app公共目录中的public/5xx.html

If your app is not serving up the page and nginx has no visibility to the static page then it can't serve the page you want. 如果您的应用没有提供该页面,并且nginx无法看到静态页面,则它无法提供您想要的页面。

在apache乘客上,我使用了apache配置选项PassengerFriendlyErrorPages

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM