
Tengo nginx como servidor http con tomcat como backend (usando proxy_pass). Funciona muy bien, pero quiero definir mis propias páginas de error (404, 500, etc.) y que sean atendidas por nginx y no por tomcat. Por ejemplo tengo el siguiente recurso:
https://domain.com/resource
que no existe. Si [OBTENGO] esa URL, recibo un mensaje No encontrado de Tomcat y no de nginx.
Lo que quiero es que cada vez que Tomcat responda con un 404 (o cualquier otro mensaje de error) nginx se envíe un mensaje al usuario: algún archivo html accesible por nginx.
La forma en que tengo configurado mi servidor nginx es muy fácil, solo:
location / {
proxy_pass http://localhost:8080/<webapp-name>/;
}
Y configuré el puerto 8080, que es Tomcat, como no accesible desde fuera de esta máquina.
No creo que location
funcione usar diferentes directivas en la configuración de nginx, porque hay algunos recursos que dependen de la URL:
https://domain.com/customer/<non-existent-customer-name>/[GET]
Siempre devolverá 404 (o cualquier otro mensaje de error), mientras que:
https://domain.com/customer/<existent-customer>/[GET]
Devolverá cualquier cosa diferente a 404 (el cliente existe).
¿Hay alguna forma de enviar mensajes de error de Tomcat (servidor de aplicaciones) con Nginx (servidor http)? ¿Verificar el mensaje enviado por la proxy_pass
directiva y actuar en consecuencia?
Respuesta1
Bien, lo encontré. En la server
sección de configuración del sitio nginx estoy usando:
error_page 404 /404.html;
location = /404.html {
root /var/www/nginx;
}
location / {
proxy_pass http://localhost:8080/api/;
proxy_intercept_errors on;
}
Necesitas agregar proxy_intercept_errors on
para nginx ainterceptarlos. Nginx solo interceptará los errores que hayas definido con error_page
.