我在我的网络服务器上使用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的任何限制设置...
感谢您的帮助!
答案 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