错误信息显示在生产 - Ruby on Rails的3.1,Nginx的,独角兽(Error Me

2019-09-17 00:03发布

我已经在生产中使用的Nginx和独角兽一个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;
}

有任何想法吗? 谢谢!

Answer 1:

HTTPS侦听器的location @unicorn块丢失的X-Forwarded-For指令。

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

它在你的HTTP侦听器,而不是HTTPS侦听器。

假设Rails的force_ssl成功重定向所有的HTTP请求和你的唯一错误是发生在HTTPS请求,似乎可以解释它。

此外,要很清楚,有机架中众所周知的问题/ Rails3中关于路由的错误,你特别提到。

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



Answer 2:

如果您使用HAProxy的nginx的和麒麟一起(如你在EngineYard的),此修复程序是不够的。 你需要重写Rails的像这样的东西

class ActionDispatch::Request
  def local?
    Rails.env != 'production'
  end
end

祝好运!



Answer 3:

不知道这是适用的,但我们也有error_page线后,我们的nginx的配置一个链接,处理/500.html页的位置

位置= /500.html {根/路径/到/轨道/应用程序/公共; }

显然与替代路径,以Rails应用程序部分的路径。



文章来源: Error Messages Showing in Production - Ruby on Rails 3.1, Nginx, Unicorn