Benutzerdefinierte interne Nginx-Fehlerseite, wenn der Upstream ausgefallen ist

Benutzerdefinierte interne Nginx-Fehlerseite, wenn der Upstream ausgefallen ist

Ich bin neu bei Nginx und habe einen Reverse-Proxy zu einem Upstream-Glassfish-Server. Ich versuche, eine benutzerdefinierte 503-Seite für den Fall einzurichten, dass die App wegen Wartungsarbeiten nicht erreichbar ist. Das gelingt mir seit mehreren Stunden nicht. Die Seite maintenance.html enthält einen CSS- und einen JPG-Link. Diese werden angezeigt, wenn ich auf die Wartungsseite weitergeleitet werde. Ich erhalte lediglich den Text der Seite und ein defektes Bild.

CentOS 6.5 nginx 1.4.4 (aus dem Nginx-Repository)

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

Der im access.log angezeigte Fehler lautet

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

Ich habe überprüft, ob /etc/nginx/html/static/header-logo.jpg existiert

Ich bin sicher, dass es ziemlich einfach ist, aber ich komme einfach nicht dahinter!

Antwort1

Ich wollte vor Kurzem dasselbe tun (eine schönere Wartungs-/Fehlerseite mit Bildern, CSS und benutzerdefinierten Schriftarten anzeigen).

Letztendlich habe ich einen internen Standortblock wie diesen verwendet:

server {

  error_page 502 = @maintenance;

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

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

Ich schrieb eineBlogeintragdarüber, wenn Sie weitere Einzelheiten benötigen (war ausgefallen, weil ich meine Infrastruktur neu aufgebaut habe, ist aber wieder aktiv).

Antwort2

Sie sagen, Sie tun Folgendes:

location ~ ^/static/ {
    internal;
}

Das internalSchlüsselwort bedeutet, dass dies locationnur für interne Anfragen sichtbar ist, also error_pagefür Ihre Anfragen.

/static/Wenn Sie direkt vom Webbrowser aus zugreifen möchten , was zum Bereitstellen der von den Fehlerseiten referenzierten Bilder erforderlich erscheint, müssen Sie die internalDirektive aus dem besagten entfernen location.

Antwort3

Ich denke, der beste Ansatz besteht darin, Folgendes zu tun:

  • Verwendeninline CSS
  • Konvertieren Sie Ihre Bilder inBase64

Anschließend können Sie den generierten Base64-String background-imagewie folgt in die CSS-Regel einbetten:

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

<img>Sie können die Zeichenfolge auch mit den Tags verwenden . Übergeben Sie sie dazu einfach srcwie folgt an das Attribut:

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

Auf diese Weise können Sie die internalNginx-Regel einhalten.

Prost!

verwandte Informationen