如何在apache2和mod_proxy_fcgi中禁用缓冲?

7
我在debian Jessie上使用带有libfcgipp的C++应用程序和apache 2.4中的mod_proxy_fcgi。我做ServerSentEvents, 但是apache仍然缓冲我的响应数据。我使用了Wireshark确认libfcgipp库没有缓冲,通过使用spawn-fcgi启动fcgi应用程序后,数据尽可能快地发送到apache web服务器。但在我的浏览器中(我用于测试,稍后会有一个C++客户端),仅在我“终止”/关闭服务器应用程序中的发送请求后才出现数据。所以我认为我需要禁用apache或mod_proxy_fcgi(或两者)的缓冲。但我找不到适当的文档说明如何做到这一点。

你是否有 mod_cache 模块? - umka
它只存在于“mods-available”中,而不在“mods-enabled”中,所以我猜它没有被启用。 - musicmatze
你尝试过使用ProxyIOBufferSizeProxyReceiveBufferSize指令吗? - umka
我该如何使用它们?零表示系统默认值,所以我不能通过这些禁用缓冲,对吗? - musicmatze
缓冲是传递数据所必需的,因此您不能将其设置为零。但是,您可以将其设置为此位置的最小可接受值。 - umka
显示剩余2条评论
2个回答

6
由于在httpd-dev邮件列表上的后续讨论,mod_proxy_fcgi的支持已添加flushpacketsflushwait,并在r1802040中加入,并在Apache 2.4.31中进行了后向移植r1825765。 如果您使用的是Apache 2.4.31或更高版本,则可以使用<Proxy flushpackets = on>来禁用缓冲,如BigPipe文档中所述:BigPipe documentation
<FilesMatch "\.php$">
    # Note: The only part that varies is /path/to/app.sock
    SetHandler  "proxy:unix:/path/to/app.sock|fcgi://localhost/"
</FilesMatch>

# Define a matching worker.
# The part that is matched to the SetHandler is the part that
# follows the pipe. If you need to distinguish, "localhost; can
# be anything unique.
<Proxy "fcgi://localhost/" enablereuse=on flushpackets=on max=10>
</Proxy>

注意: 目前只有在Apache mod_proxy_fcgi文件的trunk中才包含了flushpacketsflushwait,因为r1808129并没有被回溯到2.4.x分支。


5
一些注意事项,因为我刚刚花了几个小时进行实验以找到这个问题的答案:
  1. 在使用 mod_proxy/mod_proxy_fcgi 时,无法完全禁用输出缓冲区,但仍然可以将响应分块流式传输。
  2. 基于我的实验,似乎必须至少有4096字节的块才能将输出刷新到浏览器。
  3. 您可以使用 mod_fastcgimod_fcgi 模块禁用输出缓冲,但这些模块在 Apache 2.4 中不像其他模块那样受欢迎/广泛使用。
  4. 如果启用了 mod_deflate 并且没有为正在流式传输数据的虚拟主机/目录等设置 SetEnv no-gzip 1,则 gzip 将不允许缓冲区在请求完成之前刷新。
我正在测试如何最好地使用 Drupal 8 的新 BigPipe 功能来流式传输请求到客户端,并在此 GitHub 问题中发布了一些更多的注释。

一个解决方法是使用"\n"将你的SSE响应右填充到4096。 - Zakaria

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