Ok, maybe not so beautiful solution but upstream can be used with one server makred as down.
http {
upstream backend-jail {
server 0.0.0.0 down;
}
server {
listen 80;
underscores_in_headers on;
recursive_error_pages on;
error_page 597 = @jail;
location / {
if ($http_x_backend_down = "1") {
return 597;
}
proxy_pass http://lcoalhost:8080;
proxy_set_header Host $host;
proxy_cache my-cache;
proxy_cache_valid 200 302 1h;
proxy_cache_valid 404 1m;
proxy_cache_key $uri$is_args$args;
}
location @jail {
# dont need to log error about 'no live upstreams'
error_log /dev/null crit;
# backend-jail always return 502, want 404 to be returned.
error_page 502 =404 /;
proxy_pass http://backend-jail;
}
}
}