2016-04-05 6 views
11

Hier finden Sie PHP-FPM (PHP 5,5)Apache mod_proxy_fcgi und PHP-FPM (php-cgi.exe) Ausgabe (keine Eingabedatei angegeben.) Unter Windows

php-cgi.exe -b 127.0.0.1:9000 

Das Folgende ist mod_proxy_fcgi (Apache 2.4)

Der erste Weg

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

Der zweite Weg

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

Der dritte Weg

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

Die drei oben genannten Möglichkeiten, einen Fehler erhalten „Keine Eingabedatei angegeben.“ Jeder weiß warum? Wie soll ich dieses Problem lösen?

+0

Können Sie mit LogLevel debuggen proxy_fcgi: trace8 und/oder senden Sie Anfragen an diese Dummy-Debug FCGI? https://bz.apache.org/bugzilla/show_bug.cgi?id=51517#c3 – covener

+0

Wenn Sie 'telnet localhost 9000' verwenden, kommen Sie dann durch? Ist der Port tatsächlich offen? – h2ooooooo

+0

Haben Sie es geschafft, es zu beheben? Ich bin mit ApacheLounge 2.4.26 und ich habe das gleiche Problem. –

Antwort

4

Ich denke, dies ein Fehler in mod_proxy_fcgi ist, um ein Problem in Apache aufgelöst verbunden 2.4.12 ab:

mod_proxy_fcgi: Entfernen Sie Proxy: Balancer: // Präfix von SCRIPT_FILENAME zu fastcgi Backends geben. [Eric Covener]

Here is a link

Leider war es nicht gut genug, um als Apache die SCRIPT_FILENAME mit einem Startstrich, ähnlich wie \ c sendet: \ filename.php, die nicht als eine lokale Datei behoben Name und wird nie ausgeführt. Sie können dies überprüfen, indem Sie einen Netzwerk-Sniffer (Wireshark) auf Ihrem FastCGI-Port abhören.

Ich werde mehr als glücklich sein zu sehen, dieses Problem offiziell gelöst, da ich nicht sicher bin Apache von mir neu kompilieren und so verwende ich Distributionen von apachelounge.

+0

Ich denke auch, aber meine Apache-Version ist 2.4.18 von Apache Lounge – Jasper

2

Vielleicht haben Sie mich nicht richtig verstanden.

Vor dem Update war es: proxy: Balancer: // \ c: \ filename.php

Nach dem Update ist es: \ c: \ filename.php

Welche sind beide ungültigen Dateinamen in Windows, während Linux dort denken, ist kein Laufwerksbuchstabe dort, also wird es \ fileName.php, das gültig ist. Der Fix wäre, den Start-Schrägstrich zu entfernen und neu zu kompilieren.

+0

Bitte erstellen Sie kein neues Konto für jede Antwort. Bearbeiten Sie die gleiche Antwort –

5

Unerklärlich, einfaches Ändern der Hinter / zu einem # scheint das Problem zu beheben:

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

Bei dem Versuch, dies zu verstehen Ich habe Apache zu LogLevel debug (Zeitstempel/module/Prozessdetails der Kürze entfernt):

  • / Verwendung gibt:

    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 
    
  • Mit # gibt:

    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 
    

Der entscheidende Unterschied in der letzten Zeile zu sein scheint, wo die zweite (Arbeits-) Methode scheint nicht etwas als Wert übergeben anmelden zu der PHP-Prozess.

Ich bin nicht in der Lage dies zu erklären und kann nirgends davon erwähnt werden. (Vielleicht eine mutigere Seele als ich wäre bereit, in die Apache und/oder PHP-Quelle zu untersuchen.)

Beachten Sie, dass ich dies nicht über den Lauf phpinfo() getestet habe so würde es nicht für einen Produktionsserver empfehlen.


bearbeiten

Dies funktioniert für PHP 7.0, aber mit PHP 5.6 ich immer noch die 'No Eingabedatei angegeben' Fehler.

bearbeiten 2

Und die Arbeit mit Apache 2.4.25, nicht aber die vor kurzem 2.4.26 veröffentlicht!

Dies scheint eine Inkompatibilität Minenfeld zu sein, die explizit in der CHANGES_2.4.26 Datei erwähnt wird:

mod_proxy_fcgi: Zurück zum 2.4.20-und-einem früheren Verhalten von ein „Proxy verlassen: fcgi:// "Präfix in der Umgebungsvariablen SCRIPT_FILENAME von Standard. Fügen Sie ProxyFCGIBackendType hinzu, damit der Backend-Typ angegeben werden kann, damit diese Arten von Korrekturen ohne Auswirkungen auf FPM wiederhergestellt werden können. PR60576 [Eric Covener, Jim Jagielski]

Die documentation wurde aktualisiert, dies zu reflektieren:

Ein Beispiel für Werte, die von der Einstellung dieser Richtlinie basiert Änderung ist SCRIPT_FILENAME. Bei der historischen Verwendung von mod_proxy_fcgi wurde SCRIPT_FILENAME der Präfix "proxy: fcgi: //" vorangestellt. Diese Variable würden einige generische FastCGI-Anwendungen als Skripteingabe lesen, aber PHP-FPM würde das Präfix entfernen und sich dann daran erinnern, dass es mit Apache gesprochen hat. In 2.4.21 bis 2.4.25, wurde dieses Präfix automatisch vom Server entfernt, wodurch die Fähigkeit von PHP-FPM zur Erkennung und Interoperation mit Apache in einigen Szenarien durchbrochen wurde.

+0

Danke @timclutton! Lange Rede, kurzer Sinn: in einer Produktionsumgebung ist das nicht wirklich machbar :-( –

+0

Das wäre mein Fazit, ja. Ich persönlich benutze ['mod_fcgid'] (http://httpd.apache.org/mod_fcgid/) anstelle von' mod_proxy_fcgi 'und das funktioniert gut. – timclutton

Verwandte Themen