Выходной сигнал 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

3 ответа

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

У меня была похожая проблема. Оказывается, что в 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.

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

Другие вопросы по тегам