Apache 退出信号 mod_rewrite 和 fcgi 一起使用时出现分段错误

Apache 退出信号 mod_rewrite 和 fcgi 一起使用时出现分段错误

我正在使用 Ubuntu 15.04,Apache/2.4.10。我启用了 mod_rewrite 和 mod_proxy_fcgi。

我的 fcgi 的 apache 配置是:

ProxyPassMatch ^/(.+\.(hh|php)(/.*)?)$ fcgi://127.0.0.1:9000/var/www/html/myapp/$1

当我请求http://127.0.0.1/index.php它运行完美

我添加了这样的重写规则:

RewriteRule ^foo index.php?country=de&handle=cleanmaster&offer=3

现在当我请求http://127.0.0.1/fooApache 崩溃并出现以下错误:

[pid 4242:tid 140535432255360] AH00051: child pid 4539 exit signal Segmentation fault (11), possible coredump in /tmp/apache2-gdb-dump

如果我查看核心转储,这是堆栈跟踪:

Program terminated with signal SIGSEGV, Segmentation fault.
#0  strlen () at ../sysdeps/x86_64/strlen.S:106

warning: Source file is more recent than executable.
106     movdqu  (%rax), %xmm12
(gdb) where
#0  strlen () at ../sysdeps/x86_64/strlen.S:106
#1  0x00007fd0f461ed37 in ap_fcgi_encoded_env_len ()
#2  0x00007fd0f03b328d in ?? () from /usr/lib/apache2/modules/mod_proxy_fcgi.so
#3  0x00007fd0f05c0653 in proxy_run_scheme_handler () from /usr/lib/apache2/modules/mod_proxy.so
#4  0x00007fd0f05c161c in ?? () from /usr/lib/apache2/modules/mod_proxy.so
#5  0x00007fd0f46182a0 in ap_run_handler ()
#6  0x00007fd0f46187e9 in ap_invoke_handler ()
#7  0x00007fd0f462dfac in ap_internal_redirect ()
#8  0x00007fd0eff98ea2 in ?? () from /usr/lib/apache2/modules/mod_rewrite.so
#9  0x00007fd0f46182a0 in ap_run_handler ()
#10 0x00007fd0f46187e9 in ap_invoke_handler ()
#11 0x00007fd0f462e682 in ap_process_async_request ()
#12 0x00007fd0f462b1f0 in ?? ()
#13 0x00007fd0f4621b10 in ap_run_process_connection ()
#14 0x00007fd0f09e1b0b in ?? () from /usr/lib/apache2/modules/mod_mpm_event.so
#15 0x00007fd0f3abc6aa in start_thread (arg=0x7fd0e77fe700) at pthread_create.c:333
#16 0x00007fd0f37f1eed in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:109

顺便说一句,如果我禁用 fcgi,重写规则可以正常工作,并显示正确的文件。在这种情况下,它只是不通过 fcgi,当然源文件会被下载。我相信重写和 fcgi 的混合存在问题

答案1

我们自己的问题很可能源于我们的 Chef 配置从两个不同的来源(EPEL 与 IUS)安装 httpd、PHP-FPM 和 PHP 本身。

答案2

我遇到过类似的问题。事实证明,在 Apache 2.4 中,您不能在启用“mod_remoteip”的同时将 mod_geoip 选项“GeoIPScanProxyHeaders”设置为“On”。“GeoIPScanProxyHeaders”是用于获取“mod_geoip”使用的客户端 IP 地址的设置。相反,应该优先使用“mod_remoteip”,而“mod_geoip”将使用“mod_remoteip”的结果。同时设置“GeoIPScanProxyHeaders”和“mod_remoteip”会破坏 mod_rewite,至少与 php-fpm 相关。

答案3

当我们尝试迁移在 CentOS 上运行良好的配置时,我们在 Ubuntu 16.04 上遇到了同样的问题。

我发现了一个有用的解决方法 - 改变RewriteRule使用处理程序标志将目标 fcgid 服务器设置为代理,而不是使用ProxyPassMatch,以允许请求按最初设计的方式运行:

RewriteEngine On
# Force all non-files to go via fcgi proxy bootstrap file
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ "-" [QSA,L,H=proxy:fcgi://127.0.0.1:9000/var/www/html/public/index.php]
# Force all php files to go via fcgi proxy verbatim
RewriteCond "%{REQUEST_FILENAME}" ".php$"
RewriteRule ^ "-" [QSA,L,H=proxy:fcgi://127.0.0.1:9000%{REQUEST_FILENAME}]

请注意,上述配置处理传递给 fcgi 的环境设置与 ProxyPass 配置略有不同,您可能需要调整接收端的环境处理,以使应用程序正确解释路径。例如,我们发现将以下内容添加到我们的接收文件中对我们的设置index.php很有用:PHP-FPM

$_SERVER['SCRIPT_NAME'] = '/' . __FILE__;

如上所述,鉴于 apache 进程在有效配置下发生分段错误,我希望可以通过将此问题报告给 ubuntu 包的维护人员来解决 RewriteRule/ProxyPassMatch 配置问题,他们可能需要在改变的环境下重建这些问题。

相关内容