首页 > 解决方案 > 如何覆盖 nginx 上游响应代码?

问题描述

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

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 请求在全面维护中被捕获,被路由到上游,并使用 HTML 正文而不是他们期望的 JSONmaintenance获得响应。200

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

我知道这绝对超出了upstream块配置的范围,所以我在想一些类似的东西:

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,因为这会掩盖该服务器本身是否存在问题。

标签: nginx

解决方案


推荐阅读