如何使用 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_fastcgi
或 mod_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 的结果,对flushpackets
和flushwait
的支持已添加到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>
注意: flushpackets
和 flushwait
目前仅包含在 Apache mod_proxy_fcgi
documentation for trunk
中,因为 r1808129 尚未向后移植到 2.4.x 分支。
【讨论】:
以上是关于如何使用 apache2 和 mod_proxy_fcgi 禁用缓冲?的主要内容,如果未能解决你的问题,请参考以下文章
使用 Apache 2.4 mod_proxy 和基本身份验证在 Docker 容器中运行 Portainer
如果用户未通过身份验证,Apache 2.x 和 mod_proxy 会产生重定向循环