如何覆盖nginx上游响应代码?
我有一些nginx框用作我们的应用程序infra的反向代理,每个应用程序的正常配置基本上是:如何覆盖nginx上游响应代码?,nginx,Nginx,我有一些nginx框用作我们的应用程序infra的反向代理,每个应用程序的正常配置基本上是: geo $fooapp { default fooapp; } upstream fooapp { server ... ... } server { listen 443; ... location / { proxy_pass https://$fooapp; ... } } 现在,当我们需要关闭应用程序进行维护时,我们有一个maintenance.
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,因为这会模糊服务器本身是否存在问题