在生产中显示的错误消息 - Ruby on Rails 3.1,Nginx,Unicorn

时间:2012-05-03 16:57:33

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1 nginx unicorn

我有一个使用Nginx和Unicorn在生产中运行的Rails 3.1应用程序。由于某种原因,我的自定义404和500 html错误页面没有显示。相反,我收到了实际的错误消息(例如,“路由错误”)。

在我的production.rb文件中,我有config.consider_all_requests_local = false

在配置几乎完全相同的服务器上,我有一个“暂存”网站,运行得很好。据我所知,唯一的区别是生产者有SSL,而分期没有。

以下是制作应用的Nginx配置:

upstream unicorn_myapp_prod {
  server unix:/tmp/unicorn.myapp_prod.sock fail_timeout=0;
}

server {
  listen 80;

  server_name myapp.com;

  root /home/deployer/apps/myapp_prod/current/public;

  location ^~ /assets/ {
    gzip_static on;
    expires max;
    add_header Cache-Control public;
  }

  try_files $uri/index.html $uri @unicorn;
  location @unicorn {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_pass http://unicorn_myapp_prod;
  }

  error_page 500 502 503 504 /500.html;
  client_max_body_size 4G;
  keepalive_timeout 10;
}


server {
  listen 443 default;
  ssl on;
  ssl_certificate /home/deployer/apps/myapp_prod/shared/ssl_certs/myapp_prod.crt;
  ssl_certificate_key /home/deployer/apps/myapp_prod/shared/ssl_certs/myapp_prod.key;


  server_name myapp.com;

  root /home/deployer/apps/myapp_prod/current/public;

  location ^~ /assets/ {
    gzip_static on;
    expires max;
    add_header Cache-Control public;
  }

  try_files $uri/index.html $uri @unicorn;
  location @unicorn {
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_pass http://unicorn_myapp_prod;
  }

  error_page 500 502 503 504 /500.html;
  client_max_body_size 4G;
  keepalive_timeout 10;
}

有什么想法吗?谢谢!

3 个答案:

答案 0 :(得分:2)

https监听器的location @unicorn块缺少X-Forwarded-For指令。

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

它位于您的http侦听器中,但不是https侦听器。

假设Rails的force_ssl成功重定向所有http请求,并且您的唯一错误发生在https请求上,似乎可以解释它。

另外,非常清楚,Rack / Rails3中存在一个与路由错误有关的问题,您特别提到。

https://rails.lighthouseapp.com/projects/8994/tickets/4444-can-no-longer-rescue_from-actioncontrollerroutingerror

答案 1 :(得分:2)

如果你正在使用haproxy以及nginx和unicorn(例如你在Engineyard),这个修复是不够的。您需要使用 覆盖Rails,如下所示:

class ActionDispatch::Request
  def local?
    Rails.env != 'production'
  end
end
祝你好运!

答案 2 :(得分:0)

不确定这是否适用但我们的nginx配置中有一个链接在error_page行之后处理/500.html页面的位置

location = /500.html {root / path / to / rails / app / public; }

显然用您的路径替换rails应用程序部分的路径。