apache + proxy_fcgi_module + php-fpm:大的POST Payload为空

时间:2018-04-06 13:47:56

标签: php apache post payload

我在我的网络服务器上使用apache 2.4.10与proxy_fcgi结合使用php-fpm(7.0.29)。

<IfModule proxy_fcgi_module>
  <FilesMatch ".+\.ph(p[3457]?|t|tml)$">
    SetHandler "proxy:unix:/var/www/xxx/php/php7.0-fpm.sock|fcgi://localhost"
  </FilesMatch>
</IfModule>

当我发送带有大量有效负载(> 1MB)的POST请求时,我在Apache的错误日志中得到以下行

[Fri Apr 06 15:33:51 2018] [proxy_fcgi:error] [pid 24162:tid (32)Broken pipe: [client 84.63.x.x:37536] AH01075: Error dispatching request to : (sending stdin), referer: -, request: /index.php, querystring: -

在我的PHP代码中,当我从stdin读取它时,我得到了一个空的有效负载:

$payload =file_get_contents('php://input');

一切都适用于较小的有效载荷。有什么想法有什么不对?我无法找到proxy_fcgi的任何限制设置...

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

我现在已经发现问题在于没有发送Content-Length Header的分块传输(Transfer-Encoding:chunked)。 mod_proxy_fcgi似乎没有正确支持。

所以唯一可行的解​​决方案似乎是使用mod_php,它直接在apache进程中运行,而不是通过FastCGI或切换到NginX ......

阅读本文以获取更多信息:https://www.jeffgeerling.com/blog/2017/apache-fastcgi-proxyfcgi-and-empty-post-bodies-chunked-transfer

另一个解决方法似乎是强制协议HTTP / 1.0,它不支持分块传输,迫使客户端在一个请求中发送整个数据。但是这 - 在我的情况下 - 打破了我的git客户端中的TLS握手。

当我使用我的PHP脚本代理到Git服务器时,我的解决方案是提升git客户端的http缓冲区,直到我能够切换到NginX。

git config http.postBuffer 524288000