我使用 proxy_fcgi 在 Apache 2.4 上设置了 PHP-FPM,一切正常,但每 4-6 次请求,Apache 都会返回一个空白页。这种情况发生在我的主要网站上http://danielhe.com/,但不是子域虚拟主机。
这将显示 Apache 的错误日志,[客户端 x] AH01070:解析脚本头时出错
最后,有时 Apache 会出现段错误 AH00052: child pid 9740 exit signal 段错误 (11)
我可以通过刷新页面几次来轻松重现“解析脚本头错误”,但在几次“解析脚本头错误”之后,段错误会随机发生
更新 我找到了一个修复 seg 错误的方法,WSOD 显然已经自行修复。mod_deflate 有一些问题,但 Apache 文档中的这个配置已经修复了它
SetOutputFilter DEFLATE
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
# Don't compress images
SetEnvIfNoCase Request_URI \
\.(?:gif|jpeg|jpg|png)$ no-gzip dont-vary
# Make sure proxies don't deliver the wrong content
Header append Vary User-Agent env=!dont-vary
答案1
解决方案是使用此配置
SetOutputFilter DEFLATE
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
# Don't compress images
SetEnvIfNoCase Request_URI \
\.(?:gif|jpeg|jpg|png)$ no-gzip dont-vary
# Make sure proxies don't deliver the wrong content
Header append Vary User-Agent env=!dont-vary
答案2
我可以确认上述解决方案对我有用,但我还必须修复我的 ProxyPassmatch 设置。
旧配置
<IfModule proxy_module>
ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/home/YOURDOMAIN/public_html/$1
</IfModule>
新的配置 - 不同的重写过滤器,加上上面的代码
<IfModule proxy_module>
ProxyPassMatch ^(.*\.php)$ fcgi://127.0.0.1:9000/home/YOURDOMAIN/public_html/$1
</IfModule>
<IfModule mod_deflate.c>
SetOutputFilter DEFLATE
...code from above
</IfModule>
答案3
这里的问题是 phpList 的响应没有填满整个包。如果 php-fpm 的响应没有填满至少一个缓冲区,它会过早地断开与 Apache 的连接。作为一种解决方法,您可以暂时切换到 mod_php 或用一些随机生成的文本填充响应。