如何覆盖nginx上游响应代码?

如何覆盖nginx上游响应代码?,nginx,Nginx,我有一些nginx框用作我们的应用程序infra的反向代理,每个应用程序的正常配置基本上是: geo $fooapp { default fooapp; } upstream fooapp { server ... ... } server { listen 443; ... location / { proxy_pass https://$fooapp; ... } } 现在,当我们需要关闭应用程序进行维护时,我们有一个maintenance.

我有一些nginx框用作我们的应用程序infra的反向代理,每个应用程序的正常配置基本上是:

geo $fooapp {
  default fooapp;
}

upstream fooapp {
  server ...
  ...
}

server {
  listen 443;
  ...
  location / {
    proxy_pass https://$fooapp;
    ...
  }
}
现在,当我们需要关闭应用程序进行维护时,我们有一个
maintenance.conf
,它当前仅定义:

upstream maintenance {
  server 1.2.3.4:443;
}
其中1.2.3.4是一个简单的HTTP服务器,提供静态维护页面。有一个小的后台逻辑可以拉入状态消息,但它只会覆盖静态服务的普通HTML页面

然后我们更新每个应用程序的
geo
块,如下所示:

geo $fooapp {
  default maintenance;
  10.0.0.0/16 fooapp;
  ...
}
这使得我们的员工可以运行测试,并在应用程序不公开的情况下随意使用

现在我们遇到的麻烦是,其中一些代理路由本身包含API端点,如果有人在我们打开维护模式之前打开了我们的一个应用程序,客户端代码仍将发出API请求。现在,这些API请求在全面维护中被捕获,路由到
维护
上游,并得到一个
200
响应,其中包含一个HTML主体,而不是他们期望的JSON

我想做的是将
维护
上游提供的响应代码更改为503。这将向浏览器/爬虫程序等发送应用程序暂时不可用的适当信号,并在客户端代码中触发适当的错误处理

我知道这肯定超出了
上游
块配置的范围,因此我考虑了以下几点:

upstream maintenance_actual {
  server 1.2.3.4:443;
}

server {
  listen 127.0.0.1:8443;
  location / {
    override_status_code 503; #totally made up
    proxy_pass https://maintenance_actual
  }
}

upstream maintenance {
  server 127.0.0.1:8443;
}
但我似乎找不到这样修改响应代码的方法

我并不特别倾向于更改为维护页面提供服务的服务器上的配置,使其始终返回503,因为这会模糊服务器本身是否存在问题