【问题标题】:Nginx return an empty json object with fake 200 status codeNginx 返回一个带有假 200 状态码的空 json 对象
【发布时间】:2023-03-14 19:17:01
【问题描述】:

我们有一个在 Nginx 上运行的 API,应该返回 JSON 对象。这个服务器有很多负载,所以我们做了很多性能改进。

API 从客户端接收一个 ID。服务器有一堆代表这些 ID 的文件。因此,如果 ID 作为文件被发现,则该文件的内容(即 JSON)将由后端返回。如果文件不存在,则不调用后端,Nginx 简单地为此发送 404,因此我们节省了性能(无需运行后端系统)。

现在我们偶然发现了一个问题。由于我们仍然需要支持旧系统,我们不能为客户分发 404 页面,因为这会导致问题。我想出的是返回一个空的 JSON 字符串({}),并带有一个“假”200 状态码。这需要一个高性能的解决方案才能仍然能够处理所有负载。

这有可能吗,如果可以,怎么做?

【问题讨论】:

  • 如果您已经返回 404(基于文件是否存在的条件),为什么不返回所需的响应(空 JSON 对象)和状态码 200。跨度>

标签: json performance nginx


【解决方案1】:
error_page 404 =200 @empty_json;

location @empty_json {
     return 200 "{}";
}

参考:

【讨论】:

  • 如何返回从代理服务器得到的具体响应?如果我使用了模块 auth_subrequest
  • 在您的示例中,Content-Type 标头设置为 application/octet-stream。我无法弄清楚如何更改内容类型。 add_header 添加另一个 Content-Type 而不是替换它
  • @jmcollin92 检查文档:nginx.org/en/docs/http/ngx_http_core_module.html#default_type 似乎您已在配置中的某处将此指令设置为 application/octet-stream
  • 不,我没有。我找到了这个行的解决方案: more_set_headers -t 'application/octet-stream' 'Content-Type: application/json';需要添加 nginx-extras 包(apt-get install nginx-extras)
  • @jmcollin92 您应该设置default_type 指令。而已。你不需要任何额外的东西。
【解决方案2】:

您始终可以在文档根目录中创建一个文件,例如empty.json 只包含一个空对象 {}

然后在你的 nginx 配置中,在你的 location 块中添加这一行

try_files $uri /empty.json;

(阅读更多关于try_files的信息)

这将检查客户端请求的文件是否存在,如果不存在则显示 empty.json。这会产生 200 HTTP OK 并向发出请求的客户端显示 {}

【讨论】:

    猜你喜欢
    • 2018-02-06
    • 2022-08-02
    • 2018-11-23
    • 2017-07-10
    • 1970-01-01
    • 2011-08-13
    • 2019-02-21
    • 2012-07-07
    相关资源
    最近更新 更多