【问题标题】:Apache mod_proxy_fcgi and PHP-FPM (php-cgi.exe) issue (No input file specified.) on WindowsWindows 上的 Apache mod_proxy_fcgi 和 PHP-FPM (php-cgi.exe) 问题(未指定输入文件。)
【发布时间】:2016-07-24 18:40:51
【问题描述】:

以下是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>

以上三种方式都会报错“No input file specified”。有人知道为什么吗?我该如何解决这个问题?

【问题讨论】:

  • 你能用 LogLevel 调试 proxy_fcgi:trace8 运行和/或向这个虚拟调试 FCGI 发送请求吗? bz.apache.org/bugzilla/show_bug.cgi?id=51517#c3
  • 如果你使用telnet localhost 9000,你会通过吗?端口真的开放了吗?
  • 你解决了吗?我使用的是 ApacheLounge 2.4.26,我遇到了同样的问题。
  • 我遇到了同样的问题。这三种方法都不适合我。是否可以仅将 ProxyPass 用于特定文件夹?不允许在 部分中使用此指令。

标签: php apache


【解决方案1】:

在我的例子中,apache 不会正确设置 SCRIPT_FILENAME。 这修复了它:

ProxyFCGISetEnvIf "true" SCRIPT_FILENAME "%{reqenv:DOCUMENT_ROOT}%{reqenv:SCRIPT_NAME}"

原因可能是这个变量通常以斜杠开头,这会在 Windows 中创建无效的路径字符串,因为这里的绝对路径不以斜杠开头。然后 PHP 会生成完全无用的“未指定输入文件”错误,而不是更具描述性的未找到错误。

注意没有无条件的ProxyFCGISetEnv,所以我们使用ProxyFCGISetEnvIf,条件为true

【讨论】:

    【解决方案2】:

    按照此处指示的步骤通过 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 时我遇到了同样的错误(其中包含一个 index.php 和一个简单的 &lt;?php phpinfo(); ?&gt;

    我开始担心,直到我尝试编辑我定义 doc_root 指令的 php.ini:

    doc_root = C:\Apache24\htdocs
    

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

    【讨论】:

    • 这是为我解决的问题。这适用于 PHP 5.6.40、Apache HTTPD 2.4.48 x64、Windows 10。谢谢,John!
    【解决方案3】:

    莫名其妙地,只需将结尾的 / 更改为 # 似乎就可以解决问题:

    <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
      

    关键的区别似乎在最后一行,其中第二个(工作)方法似乎没有将 anything 记录为传递给 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 互操作的能力。

    【讨论】:

    【解决方案4】:

    也许你没听懂我的意思。

    在修复之前是:proxy:balancer://\c:\fileName.php

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

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

    【讨论】:

    • 请不要为每个答案创建新帐户。编辑相同的答案
    【解决方案5】:

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

    mod_proxy_fcgi:从传递给 fastcgi 后端的 SCRIPT_FILENAME 中删除 proxy:balancer:// 前缀。 [埃里克·科文纳]

    Here is a link

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

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

    【讨论】:

    • 我也这么认为,但我的 Apache 版本是 Apache Lounge 的 2.4.18
    • 修复了吗?有报告的错误吗?还是在windows的mod_proxy_fcgi中仍然无法处理盘符?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-29
    • 2015-11-22
    • 2017-07-18
    • 2014-11-24
    • 1970-01-01
    • 2015-03-14
    • 2015-10-05
    相关资源
    最近更新 更多