Nginx: код 503 в конфиге по факту оказывается 302. Почему?
Так как у вас URL в error_page указан с http и доменом - подразумевается внешний редирект. Отсюда и 302. Для получения того, что вы хотите, пишитеerror_page 503 /maintrance.html;
Так же, если вы хотите получить 200 в ответе, не обязательно описывать отдельный локейшн, можно решить все той же error_page, это будет такerror_page 503 =200 /maintrance.html;
И тогда location = /maintrance.html можно выкинуть.
UPD: Да, ступил. Так как error_page делает внутренний редирект, то если нет отдельного location /maintrance.html - сервер снова попадает в location / и получается бесконечный цикл редиректов. Так что в таком случае location  /maintrance.html нужен.
Попутно хочу акцентировать внимание на другом способе, более популярном, особенно если нам не нужно выдавать 503.location / {
    root   /usr/share/nginx/html;
    index index.html index.htm;
    try_files /maintrance.html $uri $uri/ =404;
}
try_files перебирает указанные аргументы пока не встретит существующий на диске. Т.е. в такой конфигурации достаточно создать /usr/share/nginx/html/maintrance.html - начинает выдаваться он, если его удалить - начинают работать обычные запросы (параметр $uri и $uri/).
Может это внутреннее? Как-бы 503 - это Service Unaviable, а вы вместо отдачи на /maintrance.html отправляете.
А он уже 200 отдает.
Попробуйте удалить:location = /maintrance.html {
return 200;
}
Будет ли подобный результат ?