如何摆脱 CGI 输出上的 TCP 或 lighttpd 4KB 缓冲?

如何摆脱 CGI 输出上的 TCP 或 lighttpd 4KB 缓冲?

我在运行于 EC2 上的 Amazon Linux AMI 上安装了原装 lighttpd。我所做的唯一配置更改是启用 CGI 支持。

然后有一个自定义 CGI 工具(用 C 编写)放在 /cgi-bin/ 中,由外部调用并输出 gzip 压缩的 JSON。此工具定期输出数据,例如每 10-20 秒一次,但每次只有几百字节。

问题在于,在 CGI 标准输出和 lighttpd 返回给客户端的数据之间的某个地方,数据被缓冲,每次到达的数据量约为 4KB。不幸的是,该系统位于 Amazon Elastic Load Balancer 后面,它不允许空闲连接超过 60 秒。由于缓冲,服务器在前 60 秒内似乎什么都没有返回,因此连接被终止,客户端什么也得不到。

那么我该如何追踪这个缓冲设置并显著减少它呢?我尝试更改一些 lighttpd 配置参数,甚至更改内核中的“net.ipv4.tcp_wmem”,但似乎没有任何效果。

答案1

启用 follow 后,对 lighttpd 进程进行 strace 操作:

strace -f -tt -p PIDOFLIGHTTPD

您将获得显示 lighttpd 和 CGI​​ 进行的每个系统调用的输出。微秒时间戳应指示 CGI 何时返回数据以及 lighttpd 何时将其写回客户端。这还将回答问题是否来自上游(如果您看到 lighttpd 几乎立即发回数据等)。

答案2

当我用 Perl 编写 cgi 时,我必须在 perl 脚本中包含一个设置。在 perl 中是$|=1。您可能需要在 C 中执行等效操作。您可能想询问堆栈溢出反而。

答案3

Lighttpd 默认缓冲输出。您需要server.stream-response-body = 1按照讨论这里. 官方文档是https://redmine.lighttpd.net/projects/lighttpd/wiki/Server_stream-response-bodyDetails

相关内容