Mensajes de error que se muestran en producción - Ruby on Rails 3.1, Nginx, Unicorn

Tengo una aplicación Rails 3.1 ejecutándose en producción usando Nginx y Unicorn. Y por alguna razón, mis páginas de error html 404 y 500 personalizadas no se muestran. En cambio, recibo el mensaje de error real ("Error de enrutamiento", por ejemplo).

En mi archivo production.rb, tengo config.consider_all_requests_local = false

Y en el mismo servidor con una configuración casi idéntica, tengo un sitio de 'puesta en escena' que funciona bien. La única diferencia, por lo que puedo decir, es que la producción tiene SSL mientras que la puesta en escena no.

Aquí está la configuración de Nginx para la aplicación de producción:

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;
}

¿Algunas ideas? ¡Gracias!

preguntado el 03 de mayo de 12 a las 17:05

¿Se aseguró de iniciar el proceso Unicornio para el sitio de producción usando la opción? -E production, como en $APP_ROOT/bin/unicorn -D -c $APP_ROOT/config/unicorn.rb -E production ¿por ejemplo? -

Sí, la aplicación definitivamente se está ejecutando en modo de producción. -

Usted especificó config.force_ssl = true en tu production.rb expediente ? -

Sí, lo tengo en production.rb y SSL parece funcionar bien. -

3 Respuestas

El oyente https location @unicorn al bloque le falta el X-Forwarded-For Directiva.

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

Está en su oyente http, pero no en el oyente https.

Asumiendo que el force_ssl de Rails está redirigiendo con éxito todas las solicitudes http y sus únicos errores están ocurriendo en las solicitudes https, parece que eso lo explicaría.

Además, para que quede muy claro, hay un problema bien conocido en Rack/Rails3 con respecto a los errores de enrutamiento, que mencionas específicamente.

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

contestado el 09 de mayo de 12 a las 00:05

El uso de $proxy_add_x_forwarded_for me dio errores de redirección, pero el uso de $scheme funcionó. ¡Gracias! - adam albrecht

Si está utilizando haproxy junto con nginx y unicorn (por ejemplo, está en Engineyard), esta solución no será suficiente. Deberá anular Rails con algo Me gusta esto:

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

¡Buena suerte!

respondido 07 nov., 12:18

no estoy seguro de si esto es aplicable, pero también tenemos un enlace en nuestra configuración de nginx después de la línea error_page que maneja la ubicación de las páginas /500.html

ubicación = /500.html { root /path/to/rails/app/public; }

obviamente, sustituya la parte de la aplicación de la ruta a los rieles con su ruta.

contestado el 10 de mayo de 12 a las 16:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.