max_fails for 404s?
Maxim Dounin
mdounin at mdounin.ru
Thu May 19 00:00:46 MSD 2011
Hello!
On Wed, May 18, 2011 at 02:35:49PM -0500, Steven Deobald wrote:
> Hey folks,
>
> We've got the following scenario occurring in production. The solution is
> non-obvious... to me, at least.
>
> [client] ==> [nginx] ==> [service S]
>
> * nginx fronting 2 application servers which provide a service S. (Primary
> and backup, both running Trinidad. Trinidad is a JRuby/Rails wrapper for
> Tomcat.)
Do you mean "backup" as in "server ... backup;" in upstream
definition?
> * hot-deploying a rails (jruby) app into Trinidad causes Trinidad to return
> a 404 to nginx
> * nginx returns the 404 to the application. In this particular case, the
> client is another service which expects service S to remain live during
> deployments
>
> So, nginx does provide an "http_404" case for the "proxy_next_upstream"
> directive. However, this would require the "max_fails" setting to pertain to
> 404s, which it doesn't... otherwise legitimate 404s produce an infinite
> loop.
>
> Is there something like "max_fails" for 404s?
> Is there another solution to this problem?
> Is it Trinidad's fault for returning 404s and not 503s? (I would say it is
> but I can't find a solution to that problem just yet.)
Parameter max_fails is to mark backends down, and you probably
don't want to mark backends down just because of some
real/legitimate 404's.
On the other hand, using "server ... backup" indeed will cause
infinite loop with "proxy_next_upstream http_404". It's a bug, it
should only ask each backend once.
Workaround is to don't use "server ... backup" but use either
"weight=" instead (big one for real server, small one for backup
one) or use error_page-based fallback instead.
Maxim Dounin
More information about the nginx
mailing list