Página de erro interno personalizada do Nginx quando o upstream está inativo

Página de erro interno personalizada do Nginx quando o upstream está inativo

Sou novo no Nginx e tenho um proxy reverso para um servidor glassfish upstream. Estou tentando configurar uma página 503 personalizada para quando o aplicativo estiver fora do ar para manutenção. Não consigo fazer isso há várias horas. A página Maintenance.html contém um link CSS e JPG. Eles estão aparecendo quando sou encaminhado para a página de manutenção. Tudo que recebo é o texto da página e uma imagem quebrada.

CentOS 6.5 nginx 1.4.4 (do repositório 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;
 }
}

O erro que aparece no access.log é

[19/dez/2013:17:49:17 -0500] "OBTER /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:///

Eu verifiquei se /etc/nginx/html/static/header-logo.jpg existe

Tenho certeza de que é bastante simples, mas simplesmente não consigo entender!

Responder1

Recentemente, quis fazer a mesma coisa (mostrar uma página de manutenção/erro melhor com imagens, CSS e fontes personalizadas).

O que acabei fazendo foi usar um bloco de localização interno como este:

server {

  error_page 502 = @maintenance;

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

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

Eu escrevi umpostagem no blogsobre isso, se precisar de mais detalhes (foi desativado porque estava reconstruindo minha infraestrutura, mas está de volta).

Responder2

Você diz que está fazendo isso:

location ~ ^/static/ {
    internal;
}

A internalpalavra-chave significa que isso locationsó é visível para solicitações internas, que error_pagesão as suas solicitações.

Se você quiser acessar /static/diretamente do navegador da web, o que parece necessário para servir imagens referenciadas nas páginas de erro, então você terá que remover a internaldiretiva do referido arquivo location.

Responder3

Acho que a melhor abordagem é fazer o seguinte:

  • Usarinline CSS
  • Converta suas imagens paraBase64

Depois de fazer isso, você pode incorporar a string Base64 gerada na background-imageregra CSS da seguinte maneira:

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

<img>Você também pode usar a string com as tags, basta passá-la para o srcatributo da seguinte forma:

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

Dessa forma, você pode manter a internalregra nginx.

Saúde!

informação relacionada