Ошибка Apache mod_proxy_fcgi и PHP-FPM (php-cgi.exe) (не указан входной файл.) В Windows

Ниже приведен PHP-FPM (PHP 5.5)

php-cgi.exe -b 127.0.0.1:9000

Ниже приведен mod_proxy_fcgi (Apache 2.4)

Первый способ

<Files ~ "\.(php|phtml)$">
    SetHandler "proxy:fcgi://127.0.0.1:9000/"
</Files>

Второй способ

<LocationMatch ^(.*\.(php|phtml))$>
    ProxyPass fcgi://127.0.0.1:9000/$1
</LocationMatch>

Третий способ

<IfModule mod_rewrite.c>
    RewriteCond %{REQUEST_FILENAME} -f
    RewriteRule ^([^\.]+\.(php|phtml))$ fcgi://127.0.0.1:9000/$1 [P,L]
</IfModule>

Вышеуказанные три способа получат сообщение об ошибке "Нет указанного входного файла". Кто-нибудь знает, почему? Как мне сделать, чтобы решить эту проблему?

Ответ 1

Необъяснимо, простое изменение конечного / на # похоже на проблему:

<Files ~ "\.(php|phtml)$">
    SetHandler "proxy:fcgi://127.0.0.1:9000#"
</Files>

В попытке понять это я установил Apache в LogLevel debug (временная метка/модуль/данные процесса удалены для краткости):

  • Использование / дает:

    mod_proxy_fcgi.c(911): [client ::1:60730] AH01076: url: fcgi://127.0.0.1:9000/E:/test/webroot/test.php proxyname: (null) proxyport: 0
    mod_proxy_fcgi.c(920): [client ::1:60730] AH01078: serving URL fcgi://127.0.0.1:9000/E:/test/webroot/test.php
    proxy_util.c(2154): AH00942: FCGI: has acquired connection for (*)
    proxy_util.c(2208): [client ::1:60730] AH00944: connecting fcgi://127.0.0.1:9000/E:/test/webroot/test.php to 127.0.0.1:9000
    proxy_util.c(2417): [client ::1:60730] AH00947: connected /E:/test/webroot/test.php to 127.0.0.1:9000
    
  • Использование # дает:

    mod_proxy_fcgi.c(911): [client ::1:60738] AH01076: url: fcgi://127.0.0.1:9000#E:/test/webroot/test.php proxyname: (null) proxyport: 0
    mod_proxy_fcgi.c(920): [client ::1:60738] AH01078: serving URL fcgi://127.0.0.1:9000#E:/test/webroot/test.php
    proxy_util.c(2154): AH00942: FCGI: has acquired connection for (*)
    proxy_util.c(2208): [client ::1:60738] AH00944: connecting fcgi://127.0.0.1:9000#E:/test/webroot/test.php to 127.0.0.1:9000
    proxy_util.c(2417): [client ::1:60738] AH00947: connected  to 127.0.0.1:9000
    

Важное различие, по-видимому, находится в последней строке, где второй (рабочий) метод не отображает ничего как значение, переданное процессу PHP.

Я затрудняюсь это объяснить и не могу найти упоминания об этом в любом месте. (Возможно, более смелая душа, чем я был бы готов вникать в источник Apache и/или PHP для исследования.)

Обратите внимание, что я не тестировал это за пределами phpinfo(), поэтому не рекомендовал бы его для производственного сервера.


Edit

Это работает для PHP 7.0, но с PHP 5.6 я все еще получаю ошибку "Нет входного файла".

Изменить 2

И работа с Apache 2.4.25, но не недавно выпущенный 2.4.26!

Это похоже на минное поле несовместимости, которое явно упоминается в файле CHANGES_2.4.26:

mod_proxy_fcgi: вернитесь к 2.4.20-и-более раннему поведению ухода      префикс "proxy: fcgi://" в переменной среды SCRIPT_FILENAME      по умолчанию. Добавьте ProxyFCGIBackendType, чтобы разрешить тип бэкэнд      что эти типы исправлений могут быть восстановлены без      FPM. PR60576 [Эрик Ковенер, Джим Ягельский]

Документация была обновлена, чтобы отразить это:

Одним из примеров значений, которые изменяются в зависимости от настройки этой директивы, является SCRIPT_FILENAME. При использовании mod_proxy_fcgi исторически SCRIPT_FILENAME имеет префикс строки "proxy: fcgi://". Эта переменная - это то, что некоторые общие приложения FastCGI читают как их вход script, но PHP-FPM лишит префикс, а затем помнит, что он разговаривал с Apache. В 2.4.21 - 2.4.25 этот префикс был автоматически лишен сервером, нарушив способность PHP-FPM обнаруживать и взаимодействовать с Apache в некоторых сценариях.

Ответ 2

Я думаю, что это ошибка в mod_proxy_fcgi, связанная с проблемой, решаемой в Apache 2.4.12 и далее:

mod_proxy_fcgi: Удалить префикс proxy: balancer://из SCRIPT_FILENAME, переданного в бэкэнды fastcgi. [Эрик Ковенер]

Вот ссылка

К сожалению, это не было достаточно хорошо, поскольку Apache отправляет SCRIPT_FILENAME с начальной косой чертой, аналогичной \ c:\fileName.php, которая не разрешается как локальное имя файла и никогда не выполняется. Вы можете проверить это, используя сетевой сниффер (Wireshark), прослушивающий ваш порт FastCGI.

Я буду более чем счастлив увидеть, что эта проблема будет официально решена, поскольку я не уверен в том, что самостоятельно перекомпилирую Apache и поэтому использую дистрибутивы из apachelounge.

Ответ 3

Может, ты меня не понял.

До исправления это было: прокси: балансир://\ c:\fileName.php

После исправления это: \c:\fileName.php

Каковы оба недопустимых имени файла в Windows, и, думая, что Linux там нет буквы диска, он становится \fileName.php, который действителен. Исправление будет состоять в том, чтобы удалить начальную косую черту и перекомпилировать.

Ответ 4

Я получал эту ошибку при выполнении шагов, указанных здесь, для запуска PHP под Apache в Windows через FastCGI:

https://www.orbitale.io/2017/11/11/apache-and-php-fpm-in-windows.html

После настройки php-cgi.exe в качестве службы на порту 9000 (с использованием NSSM) и настройки httpd.conf для обработки файлов php следующим образом:

<IfModule dir_module>
    DirectoryIndex index.php index.html
</IfModule>

<Files ~ "\.php$">
    SetHandler "proxy:fcgi://127.0.0.1:9000#"
</Files>

Я получал эту же ошибку при переходе на localhost (который содержал index.php с простым <?php phpinfo();?>.

Я волновался, пока не попытался отредактировать свой php.ini, где я определил директиву doc_root:

doc_root = C:\Apache24\htdocs

Сделав это и перезапустив мой сервис Apache, вуаля, я получил страницу с информацией о php! Я использую PHP 7.3.5 NTS x64 с Apache 2.4 x64.