
У меня есть nginx как http-сервер с tomcat как бэкендом (используя proxy_pass). Он отлично работает, но я хочу определить свои собственные страницы ошибок (404, 500 и т. д.) и чтобы они обслуживались nginx, а не tomcat. Например, у меня есть следующий ресурс:
https://domain.com/resource
которого не существует. Если я [ПОЛУЧАЮ] этот URL, то получаю сообщение Not Found от Tomcat, а не от nginx.
Мне нужно, чтобы каждый раз, когда Tomcat отвечает кодом 404 (или любым другим сообщением об ошибке), nginx отправлял пользователю сообщение: какой-то html-файл, доступный nginx.
Мой сервер nginx настроен очень просто:
location / {
proxy_pass http://localhost:8080/<webapp-name>/;
}
И я настроил порт 8080, который принадлежит tomcat, как недоступный извне этой машины.
Я не думаю, что использование различных location
директив в конфигурации nginx сработает, поскольку есть некоторые ресурсы, которые зависят от URL:
https://domain.com/customer/<non-existent-customer-name>/[GET]
Всегда будет возвращать 404 (или любое другое сообщение об ошибке), в то время как:
https://domain.com/customer/<existent-customer>/[GET]
Вернет все, что отличается от 404 (клиент существует).
Есть ли способ обслуживания сообщений об ошибках Tomcat (сервера приложений) с помощью Nginx (http-сервера)? Чтобы проверить сообщение, отправленное директивой, proxy_pass
и отреагировать на него?
решение1
Ок, я нашел. В server
разделе конфигурации сайта nginx я использую:
error_page 404 /404.html;
location = /404.html {
root /var/www/nginx;
}
location / {
proxy_pass http://localhost:8080/api/;
proxy_intercept_errors on;
}
Вам нужно добавить proxy_intercept_errors on
для nginxперехватите их. Nginx будет перехватывать только те ошибки, которые вы определили с помощью error_page
.