
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 location
diretivas 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_pass
diretiva e agir de acordo com ela?
Responder1
Ok, eu encontrei. Na server
seçã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 on
para nginx parainterceptá-los. O Nginx interceptará apenas erros que você definiu com error_page
.