使用HTTP/1.1,在NGINX 204响应中删除“Connection: keep-alive”响应头

10
在任何由NGINX提供的响应中,如何删除“Connection: keep-alive”头?
我们每月为基于RTB的广告服务从NGINX向不到10个客户端提供100B+/month的子100字节响应。我们试图最小化开销(数据大小)以节省带宽成本。我们不想让NGINX关闭连接,只是从标头中删除它。客户端不是浏览器,并将根据HTTP/1.1规范保持连接打开状态。
我们已成功使用HttpHeadersMoreModule从我们的“无操作”响应(204)中删除了默认响应标头。它看起来像这样:
HTTP/1.1 204 No Content
Connection: keep-alive

我们希望删除其他标题,使其看起来像这样:
HTTP/1.1 204 No Content

我们的keepalive_timeout没有设置第二个值。根据NGINX HttpCoreModule documentation,如果没有这个[第二个]参数,nginx不会发送Keep-Alive头部信息。我们的设置是:
keepalive_timeout 60s;

我们已经尝试使用并设置了http://wiki.nginx.org/HttpHeadersMoreModule#more_clear_headershttp://wiki.nginx.org/HttpHeadersMoreModule#more_clear_input_headers

more_clear_headers 'Connection';
more_clear_input_headers 'Connection';

我们也尝试过:

rewrite_by_lua '
    ngx.req.clear_header("Connection")
    ';

甚至连:

more_clear_headers 'Connection*';

但我们仍然看到了头部信息。我们发送了很多响应,以至于连接头部实际上每个月会花费我们200美元。

非常感谢您的帮助。

相关和有用的链接: Nginx和原始头部


3
在这里,@agentzh指出:“实际上删除Connection头的唯一方法是修补Nginx核心,即编辑src /http/ngx_http_header_filter_module.c文件中的C函数ngx_http_header_filter。” - Michael Orlando
忽略Connection头部是违反HTTP/1.1协议的。虽然在HTTP/1.0中这样做是合法的。但是,如果客户端在超时之前发起多个请求,额外的TCP握手流量将消耗比头部几个字节更多的带宽和服务器资源。但是,如果坚持这样做,您也可以通过设置reset_timedout_connection onkeepalive_requests 1来不优雅地终止TCP会话,以避免4次TCP关闭。然而,这都是对协议的滥用。 - undefined
1个回答

1

我不知道这是否适用于你的情况,但我遇到了同样的问题,并使用keepalive_requests解决了它:

    location xxx {
      keepalive_requests 1;
 
      ....

    }

1
这将禁用保持活动状态。从keepalive_requests文档中可以看到:“达到最大请求数后,连接将被关闭。”。 - pba

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接