Página de error interna personalizada de Nginx cuando el flujo ascendente está inactivo

Página de error interna personalizada de Nginx cuando el flujo ascendente está inactivo

Soy nuevo en Nginx y tengo un proxy inverso para un servidor Glassfish ascendente. Estoy intentando configurar una página 503 personalizada para cuando la aplicación esté inactiva por mantenimiento. Llevo varias horas sin poder hacerlo. La página de mantenimiento.html contiene un enlace css y jpg. Estos aparecen cuando me reenvían a la página de mantenimiento. Todo lo que obtengo es el texto de la página y una imagen rota.

CentOS 6.5 nginx 1.4.4 (del repositorio de nginx)

upstream glassfish {
server <upstream IP>:8181 max_fails=1;
}

server {
 listen       80;
 server_name  localhost;

#charset koi8-r;
#access_log  /var/log/nginx/log/host.access.log  main;

error_page  404 502   /static/error.html;
error_page  503      /static/maintenance.html;

location ~ ^/static/ {
    internal;
}

 location / {
 proxy_set_header X-Real-IP  $remote_addr;
 proxy_set_header X-Forwarded-For $remote_addr;
 proxy_set_header Host $host;
 proxy_pass https://glassfish;
 port_in_redirect off;
 }
}

El error que aparece en access.log es

[19/dic/2013:17:49:17 -0500] "GET /static/main.css HTTP/1.1" 404 1136 "http:/// [19/dic/2013:17:49:18 -0500] "OBTENER /static/header-logo.jpg HTTP/1.1" 404 1136 "http:///

He comprobado que /etc/nginx/html/static/header-logo.jpg existe

Estoy seguro de que es bastante simple, ¡pero no puedo entenderlo!

Respuesta1

Recientemente quise hacer lo mismo (mostrar una página de error/mantenimiento más agradable con imágenes, CSS y fuentes personalizadas).

Lo que terminé haciendo fue usar un bloque de ubicación interno como este:

server {

  error_page 502 = @maintenance;

  location @maintenance {
    root /path/to/maintenance-site;

    if (!-f $request_filename) {
      rewrite ^ /index.html break;
    }
  }
}

escribí unentrada en el blogal respecto, si necesita más detalles (ha estado inactivo porque estaba reconstruyendo mi infraestructura pero ha vuelto a funcionar).

Respuesta2

Dices que estás haciendo esto:

location ~ ^/static/ {
    internal;
}

La internalpalabra clave significa que esto locationsolo es visible para solicitudes internas, que error_pageson sus solicitudes.

Si desea poder acceder /static/directamente desde el navegador web, lo que parecería necesario para mostrar imágenes a las que se hace referencia en las páginas de error, entonces deberá eliminar la internaldirectiva de dicho archivo location.

Respuesta3

Creo que el mejor enfoque es hacer las siguientes cosas:

  • Usarinline CSS
  • Convierte tus imágenes aBase64

Después de hacer esto, puede incrustar la cadena Base64 generada en la background-imageregla CSS de la siguiente manera:

background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEADI.....==)

También puedes usar la cadena con las <img>etiquetas, simplemente pásala al srcatributo de la siguiente manera:

<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEADI.....==" />

De esta manera puedes mantener la internalregla nginx.

¡Salud!

información relacionada