1

NginxとUnicornを使用してRails3.1アプリを本番環境で実行しています。そして、何らかの理由で、カスタム404および500htmlエラーページが表示されません。代わりに、実際のエラーメッセージ(「ルーティングエラー」など)が表示されます。

私のproduction.rbファイルには、config.consider_all_requests_local = false

そして、ほぼ同じ構成の同じサーバー上に、正常に機能する「ステージング」サイトがあります。私が知る限り、唯一の違いは、本番環境にはSSLがあり、ステージングには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;
}

何か案は?ありがとう!

4

3 に答える 3

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

于 2012-05-08T03:41:54.140 に答える
2

nginxおよびunicornと一緒にhaproxyを使用している場合(たとえば、Engineyardを使用している場合)、この修正では不十分です。Railsを次のようなものでオーバーライドする必要があります。

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

幸運を!

于 2012-11-07T18:29:49.250 に答える
0

これが適用可能かどうかはわかりませんが、/500.htmlページの場所を処理するerror_page行の後にnginx構成にリンクがあります

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

明らかに、Railsアプリ部分へのパスをパスに置き換えてください。

于 2012-05-10T15:39:26.503 に答える