<p>在Apache中有两种方法可以解决这个问题。在</p>
<p>您可以使用<code>>=2.3</code>中提供的<a href="http://httpd.apache.org/docs/trunk/mod/mod_buffer.html" rel="nofollow noreferrer">mod_buffer</a>,并将{<cd2>}更改为预期的最大负载大小。这将使Apache将请求保存在内存中,直到它完成发送或到达缓冲区。在</p>
<p>对于较旧的Apache版本<code>< 2.3</code>,可以将<a href="http://httpd.apache.org/docs/trunk/mod/mod_proxy.html" rel="nofollow noreferrer">mod_proxy</a>与<code>ProxyIOBufferSize</code>、<code>ProxyReceiveBufferSize</code>和环回vhost结合使用。这涉及到将您的真实vhost放在环回接口上,并公开一个连接回真实vhost的代理vhost。这样做的缺点是它使用了两倍多的套接字,并且可能使<a href="http://nls.io/how-do-i-calculate-apache-maxclients/" rel="nofollow noreferrer">resource calculation</a>变得困难。在</p>
<p>然而,最理想的选择是在<a href="https://serverfault.com/questions/233402/layer-4-vs-layer-7-load-balancing">L4/L7</a>负载平衡器上启用请求/响应缓冲。例如,<code>haproxy</code>允许您基于<code>req_len</code>添加<a href="http://haproxy.1wt.eu/download/1.3/doc/configuration.txt" rel="nofollow noreferrer">rules</a>,对{a6}也是如此。大多数好的商业负载平衡器也有一个选项,在发送请求之前缓冲请求。在</p>
<p>这三种方法都依赖于缓冲完整的请求/响应有效负载,并且根据您的用例和可用的资源,还有一些性能方面的考虑因素。您可以将整个负载缓存在内存中,但这可能会显著降低最大并发连接数。您可以选择将有效负载写入本地存储(最好是SSD),但随后会受到IO容量的限制。在</p>
<p>您还需要考虑文件上传,因为这些文件不适合基于内存的有效负载缓冲。在大多数情况下,您将在Web服务器中处理上载请求,例如<a href="http://wiki.nginx.org/HttpUploadModule" rel="nofollow noreferrer">HttpUploadModule</a>,然后查询nginx中的<a href="http://wiki.nginx.org/HttpUploadProgressModule" rel="nofollow noreferrer">upload progress</a>,而不是直接在<a href="https://stackoverflow.com/questions/18255309/uwsgi-for-uploading-and-processing-files">WSGI</a>中处理它。如果您在负载平衡器上进行缓冲,那么您可能希望从缓冲规则中排除文件上载。在</p>
<p>您需要了解<a href="http://azgtech.wordpress.com/2011/06/15/php-echo-function-performance-issue/" rel="nofollow noreferrer">why this is happening</a>,并且在发送响应和接收请求时都存在此问题。有这些保护也是一个好主意,不仅仅是为了可伸缩性,而且是为了<a href="https://community.qualys.com/blogs/securitylabs/2011/11/02/how-to-protect-against-slow-http-attacks" rel="nofollow noreferrer">security reasons</a>。在</p>