Parece que o que você está procurando é proxy_next_upstream e proxy_connect_timeout . Então você faria algo como:
proxy_next_upstream error timeout invalid_header http_500;
proxy_connect_timeout 2;
Basicamente, se uma falha for detectada, o back-end será marcado como inativo por x segundos e tentará novamente. O Nginx tentará a próxima entrada no bloco upstream, assim que o upstream downed retornar, ele deverá ser reativado automaticamente no pool upstream.