如何使用 apache2 和 mod_proxy_fcgi 禁用缓冲?

Posted

技术标签:

【中文标题】如何使用 apache2 和 mod_proxy_fcgi 禁用缓冲?【英文标题】:How to disable buffering with apache2 and mod_proxy_fcgi? 【发布时间】:2015-08-22 20:09:07 【问题描述】:

我在 debian Jessie 上使用带有 apache 2.4 的 mod_proxy_fcgi 和我的 C++ 应用程序,该应用程序使用 libfcgipp 执行 ServerSentEvents。

我的问题是,apache 仍然缓冲我的响应数据。我通过使用wireshark确认libfcgipp库没有缓冲它:通过spawn-fcgi启动fcgi应用程序后,数据会尽快发送到apache Web服务器。但在我的浏览器(我用于测试,稍后会有一个 C++ 客户端)中,它仅在我“杀死”/关闭服务器应用程序中的发送请求后才会显示。

所以我假设我需要禁用 apache 或 mod_proxy_fcgi(或两者)的缓冲。但我找不到有关如何执行此操作的适当文档。

【问题讨论】:

你有mod_cache模块吗? 它只在mods-available而不在mods-enabled,所以我猜它没有启用。 我想我在这里使用了错误的术语。我的意思是“缓冲”,而不是“缓存”。 你试过ProxyIOBufferSize和ProxyReceiveBufferSize指令吗? 我应该如何使用它们?零表示系统默认值,所以我不能通过这些禁用缓冲,可以吗? 【参考方案1】:

一些笔记,因为我刚刚花了几个小时来尝试找到这个问题的答案:

    使用mod_proxy/mod_proxy_fcgi 时,无法完全禁用输出缓冲,但是,您仍然可以将响应分块传输。 根据我的实验,似乎在将输出刷新到浏览器之前,块必须至少为 4096 字节。 您可以使用 mod_fastcgimod_fcgi 模块禁用输出缓冲,但这些模块在 Apache 2.4 中并不流行/广泛使用。 如果您启用了mod_deflate 并且没有为虚拟主机/目录/等设置SetEnv no-gzip 1。那是流数据,那么 gzip 将不允许缓冲区刷新,直到请求完成。

我正在测试以了解如何最好地使用 Drupal 8 的新 BigPipe 功能来将请求流式传输到客户端,我在 this GitHub issue 中发布了更多注释。

【讨论】:

一种解决方法是用“\n”正确填充您的 SSE 对 4096 的响应【参考方案2】:

作为a subsequent discussion on the httpd-dev mailing list 的结果,对flushpacketsflushwait 的支持已添加到r1802040 中的mod_proxy_fcgi,并在r1825765 中为Apache 2.4.31 向后移植。如果您使用的是 Apache 2.4.31 或更高版本,您可以使用 <Proxy flushpackets=on> 禁用缓冲,如 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>

注意: flushpacketsflushwait 目前仅包含在 Apache mod_proxy_fcgi documentation for trunk 中,因为 r1808129 尚未向后移植到 2.4.x 分支。

【讨论】:

以上是关于如何使用 apache2 和 mod_proxy_fcgi 禁用缓冲?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Apache 2.4 mod_proxy 和基本身份验证在 Docker 容器中运行 Portainer

centos7下apache2.4反向代理

Mod_Proxy 502-代理错误间歇性

如果用户未通过身份验证,Apache 2.x 和 mod_proxy 会产生重定向循环

在 Apache 2 代理 (mod_proxy) 后面的 Tomcat Web 应用程序中发送重定向

Apache配置反向代理负载均衡和集群(mod_proxy方式)