Windows上的Apache mod_proxy_fcgi和PHP-FPM(php-cgi.exe)问题(未指定输入文件。)

时间:2016-04-05 02:09:23

标签: php apache

以下是PHP-FPM(PHP 5.5)

with closure (obj_1, obj_2) as (
 SELECT distinct t.obj_1, t.obj_2 
   FROM temp4 t
 UNION ALL 
 SELECT c.obj_1, t.obj_2 
   FROM closure c, temp4 t 
   WHERE c.obj_2=t.obj_1)
SELECT * FROM closure

以下是mod_proxy_fcgi(Apache 2.4)

第一种方式

php-cgi.exe -b 127.0.0.1:9000

第二种方式

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

第三种方式

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

以上三种方式都会出现错误&#34;没有指定输入文件。&#34;谁知道为什么?我该怎么做才能解决这个问题?

5 个答案:

答案 0 :(得分:7)

令人费解的是,只是将结尾/更改为#似乎可以解决问题:

<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()之外,我没有对此进行测试,因此不建议将其用于生产服务器。

<强> 修改

这适用于PHP 7.0,但是使用PHP 5.6,我仍然会收到“未指定输入文件”错误。

编辑2

使用Apache 2.4.25,但不是最近发布的2.4.26!

这似乎是CHANGES_2.4.26文件中明确提到的不兼容雷区:

  

mod_proxy_fcgi:返回2.4.20及之前的离开行为        SCRIPT_FILENAME环境变量中的“proxy:fcgi://”前缀        默认。添加ProxyFCGIBackendType以允许后端类型        指定这样可以在不影响的情况下恢复这些类型的修正        FPM。 PR60576 [Eric Covener,Jim Jagielski]

documentation已更新,以反映这一点:

  

根据此指令的设置更改的值的一个示例是SCRIPT_FILENAME。历史上使用mod_proxy_fcgi时,SCRIPT_FILENAME的前缀是字符串“proxy:fcgi://”。这个变量是一些通用的FastCGI应用程序将读取的脚本输入,但PHP-FPM会删除前缀,然后记住它正在与Apache交谈。在2.4.21到2.4.25中,服务器自动剥离了这个前缀,破坏了PHP-FPM在某些情况下检测和与Apache互操作的能力。

答案 1 :(得分:5)

我认为这是mod_proxy_fcgi中的一个错误,与Apache 2.4.12中解决的问题有关:

mod_proxy_fcgi:从SCRIPT_FILENAME中删除代理:balancer://前缀传递给fastcgi后端。 [Eric Covener]

Here is a link

不幸的是,它不够好,因为Apache正在向SCRIPT_FILENAME发送一个起始斜杠,类似于 \ c:\ fileName.php ,它不会被解析为本地文件名并且永远不会被执行。您可以使用在FastCGI端口上侦听的网络嗅探器(Wireshark)来验证这一点。

我很高兴看到这个问题正式解决,因为我不自信地重新编译Apache,所以我使用的是 apachelounge 的发行版。

答案 2 :(得分:2)

也许你没有把我弄好。

在修复之前,它是:代理:balancer:// \ c:\ fileName.php

修复后,它是: \ c:\ fileName.php

在Windows中哪些都是无效的文件名,而在认为Linux中没有驱动器号,因此它变为 \ fileName.php ,这是有效的。解决方法是删除起始斜杠并重新编译。

答案 3 :(得分:0)

按照以下指示的步骤通过FastCGI在Windows上的Apache下运行PHP时,我收到此错误:

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(其中包含带有简单<?php phpinfo(); ?>的index.php)时,我也遇到相同的错误。

在尝试编辑定义了doc_root指令的php.ini之前,我一直很担心:

doc_root = C:\Apache24\htdocs

这样做并重新启动了我的Apache服务,瞧,我得到了php信息页面! 我正在使用PHP 7.3.5 NTS x64和Apache 2.4 x64。

答案 4 :(得分:0)

ProxyFCGIBackendType GENERIC 在httpd.conf中解决了我的问题!谢谢