Servir mensagens de erro de aplicativos da web do servidor Http

Servir mensagens de erro de aplicativos da web do servidor Http

Eu tenho o nginx como um servidor http com o Tomcat como backend (usando proxy_pass). Funciona muito bem, mas quero definir minhas próprias páginas de erro (404, 500, etc.) e que elas sejam atendidas pelo nginx e não pelo tomcat. Por exemplo, tenho o seguinte recurso:

https://domain.com/resource

o que não existe. Se eu [OBTER] esse URL, recebo uma mensagem Not Found do Tomcat e não do nginx.

O que eu quero é que toda vez que o Tomcat responder com um 404 (ou qualquer outra mensagem de erro), o nginx envie uma mensagem para o usuário: algum arquivo html acessível pelo nginx.

A maneira como configuro meu servidor nginx é muito fácil, apenas:

location / {
    proxy_pass   http://localhost:8080/<webapp-name>/;
}

E configurei a porta 8080, que é Tomcat, como não acessível de fora desta máquina.

Não creio que usar locationdiretivas diferentes na configuração do nginx funcione, pois existem alguns recursos que dependem da URL:

https://domain.com/customer/<non-existent-customer-name>/[GET]

Sempre retornará 404 (ou qualquer outra mensagem de erro), enquanto:

https://domain.com/customer/<existent-customer>/[GET]

Retornará algo diferente de 404 (o cliente existe).

Existe alguma maneira de enviar mensagens de erro do Tomcat (servidor de aplicativos) com o Nginx (servidor http)? Para verificar a mensagem enviada pela proxy_passdiretiva e agir de acordo com ela?

Responder1

Ok, eu encontrei. Na serverseção de configuração do site nginx que estou usando:

error_page 404 /404.html;
location = /404.html {
    root /var/www/nginx;
}

location / {
    proxy_pass http://localhost:8080/api/;
    proxy_intercept_errors on;
}

Você precisa adicionar proxy_intercept_errors onpara nginx parainterceptá-los. O Nginx interceptará apenas erros que você definiu com error_page.

informação relacionada