Назад | Перейти на главную страницу

Сигнал выхода Apache Ошибка сегментации, когда mod_rewrite и fcgi используются вместе

Я использую Ubuntu 15.04, Apache / 2.4.10. Я включил mod_rewrite и mod_proxy_fcgi.

Моя конфигурация apache для fcgi:

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/foo Сбой Apache с этой ошибкой:

[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 и, конечно, загружается исходный файл. Я считаю, что что-то идет не так со смесью rewrite и fcgi

У нас была такая же проблема в Ubuntu 16.04 при попытке перенести конфигурацию, которая отлично работала в CentOS.

Я нашел полезный обходной путь - изменив 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 segfault с допустимой конфигурацией, я ожидаю, что это будет разрешено для конфигурации RewriteRule / ProxyPassMatch, сообщив об этом разработчикам пакета ubuntu, которым потенциально необходимо перестроить их с измененной средой .

У меня была похожая проблема. Оказывается, в Apache 2.4 вы не можете установить для параметра mod_geoip «GeoIPScanProxyHeaders» значение «Вкл.» Одновременно с включенным параметром «mod_remoteip». «GeoIPScanProxyHeaders» - это параметр для получения IP-адреса клиента для использования «mod_geoip». Вместо этого следует использовать mod_remoteip, а mod_geoip будет использовать результаты, полученные с помощью mod_remoteip. Одновременная установка «GeoIPScanProxyHeaders» и «mod_remoteip» нарушает работу mod_rewite, по крайней мере в том, что касается php-fpm.

Кажется вероятным, что наши собственные проблемы возникли из-за того, что наша конфигурация Chef установила httpd, PHP-FPM и сам PHP из двух разных источников (EPEL против IUS).