Ich habe kürzlich Apache 2.4 zusammen mit PHP 5.4.8 mit PHP-FPM auf meinem lokalen Rechner installiert.
Alles verlief reibungslos (nach einer Weile ...), aber es gibt immer noch einen merkwürdigen Fehler:
Ich habe Apache für PHP-FPM folgendermaßen konfiguriert:
<VirtualHost *:80>
ServerName localhost
DocumentRoot "/Users/apfelbox/WebServer"
ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/Users/apfelbox/WebServer/$1
</VirtualHost>
Es funktioniert zum Beispiel, wenn ich anrufe, http://localhost/info.php
bekomme ich die richtige phpinfo()
(es ist nur eine Testdatei).
Wenn ich jedoch ein Verzeichnis aufrufe, erhalte ich eine 404 mit body File not found.
und im Fehlerprotokoll:
[Tue Nov 20 21:27:25.191625 2012] [proxy_fcgi:error] [pid 28997] [client ::1:57204] AH01071: Got error 'Primary script unknown\n'
Aktualisieren
Ich habe jetzt versucht, das Proxying mit mod_rewrite durchzuführen:
<VirtualHost *:80>
ServerName localhost
DocumentRoot "/Users/apfelbox/WebServer"
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/Users/apfelbox/WebServer/$1 [L,P]
</VirtualHost>
Das Problem ist aber: Es wird immer umgeleitet, weil http://localhost/
automatisch http://localhost/index.php
ein angefordert wird, wegen
DirectoryIndex index.php index.html
Update 2
Ok, also denke ich "vielleicht zuerst prüfen, ob es eine Datei gibt, die dem Proxy übergeben werden kann:
<VirtualHost *:80>
ServerName localhost
DocumentRoot "/Users/apfelbox/WebServer"
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/Users/apfelbox/WebServer/$1 [L,P]
</VirtualHost>
Jetzt funktioniert das komplette Umschreiben nicht mehr ...
Update 3
Jetzt habe ich diese Lösung:
<VirtualHost *:80>
ServerName localhost
DocumentRoot "/Users/apfelbox/WebServer"
RewriteEngine on
RewriteCond /Users/apfelbox/WebServer/%{REQUEST_FILENAME} -f
RewriteRule ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/Users/apfelbox/WebServer/$1 [L,P]
</VirtualHost>
Überprüfen Sie zuerst, ob es eine Datei gibt, die an PHP-FPM übergeben werden muss (mit dem vollständigen und absoluten Pfad), und führen Sie dann das Neuschreiben durch.
Dies funktioniert nicht, wenn das URL-Umschreiben in einem Unterverzeichnis verwendet wird. Bei URLs wie " http://localhost/index.php/test/
Also back to square one" schlägt dies ebenfalls fehl .
Irgendwelche Ideen?
quelle
config.php
Dateien im Klartext verfügbar machen könnte, wenn sie sich in Alias-Verzeichnissen befinden und daher in% {DOCUMENT_ROOT} /% {REQUEST_URI} nicht vorhanden sind.Ich bin gestern auch auf dieses Problem gestoßen - Apache 2.4 ist von Debian / experimental nach Debian / unstable übergegangen und hat mich gezwungen, mit diesem neuen Zeug umzugehen; natürlich nicht auf unseren produktionsservern;).
Nachdem ich gelesen hatte, was sich wie Millionen von Websites anfühlt, Apache-Dokumente, Fehlerberichte und Debugging-Ausgaben im Fehlerprotokoll, habe ich es endlich zum Laufen gebracht. Nein, FPM mit Sockets wird noch nicht unterstützt. Die Standard-Debian-Konfiguration verwendet seit einiger Zeit Sockets, daher müssen auch Debian-Benutzer dies ändern.
Hier ist, was für eine CakePHP-Site und PHPMyAdmin funktioniert (letzteres benötigt allerdings eine Konfiguration, wenn Sie die Debian-Pakete verwenden), damit ich bestätigen kann, dass es
mod_rewrite
immer noch wie erwartet funktioniert, um ausgefallene URLs umzuschreiben.Beachten Sie
DirectoryIndex index.php
, dass möglicherweise keine Ihrer Konfigurationen für "Ordner" funktioniert hat (zumindest hat dies hier nicht funktioniert).Ich bekomme immer noch
File not found.
für Verzeichnisse, aber nur wenn es keine Indexdatei gibt, kann es analysieren. Würde das auch gerne loswerden, aber es ist im Moment nicht so kritisch.Der obige vhost funktioniert perfekt mit einem .htaccess im root wie folgt:
Ich verstehe aber nicht ganz, was du meinst
URL rewriting inside a subdirectory
(ich schreibe nur in die index.php des Roots).(Oh, und Sie müssen sicherstellen, dass Xdebug nicht mit FPM auf Ihrem System in Konflikt steht, da diese standardmäßig dieselben Ports verwenden möchten.)
quelle
DirectoryIndex index.html
im fraglichen vhost das Problem behoben. Wenn jaDirectoryIndex index.php
, dann scheinen andere PHP-Dateien den Fehler "Datei nicht gefunden" und "Primäres Skript unbekannt" zu verursachen. In meinem Fall habe ichindex.html
aber eine PHP-Dateitest.php
.Alles was Sie tun müssen, ist einzustellen:
Und vergessen Sie nicht, die Kundenseite wie folgt einzustellen:
quelle
Das habe ich. Es scheint in Ordnung zu funktionieren. Ich habe Drupal in ein Unterverzeichnis gestellt, und seine Umschreibungen, Verzeichnisindizes und PATH_INFO funktionieren.
Ich habe versucht, so etwas zu tun, ohne es neu zu schreiben ("If" und so weiter), aber ich konnte nichts zum Laufen bringen.
BEARBEITEN: Beachten Sie, dass dies ein Sicherheitsproblem sein kann, wenn Sie dies als Shared Hosting-Anbieter implementieren. Es würde Benutzern erlauben, PHP-Skripte an einen beliebigen fcgi-Proxy zu übergeben. Wenn Sie für jeden Benutzer einen eigenen Pool hätten, könnten Sie die Rechte für Angriffe erhöhen.
quelle
Noch eine andere Lösung (benötigt Apache> = 2.4.10) - Im vhost:
In diesem Fall wird der fcgi-Handler für PHP nur festgelegt, wenn die Datei vorhanden ist und der Name mit der PHP-Dateierweiterung übereinstimmt.
Übrigens: Für diejenigen, die die Idee haben, ProxyErrorOverride auf On zu setzen, ist dies eine wirklich schlechte Idee. Die Verwendung dieser Richtlinie ist nicht ohne Probleme. Beispielsweise würde jede PHP-Anwendung, die HTTP-Code wie 503 sendet, zu einem unerwarteten Ergebnis führen. Standardfehlerbehandlungsroutine würde in jedem Fall beteiligt sein und für PHP-Anwendungen, die API bereitstellen, ist das wirklich ein schlechtes Verhalten.
quelle
Die beste Möglichkeit, dies zu lösen, besteht darin, die Debugging-Protokolle für mod_proxy und mod_rewrite sowie für php-fpm zu aktivieren. In Apache 2.4 können Sie jetzt das Debuggen von Protokollen nur für bestimmte Module aktivieren. http://httpd.apache.org/docs/current/mod/core.html#loglevel Die Konfiguration pro Modul und pro Verzeichnis ist in Apache HTTP Server 2.3.6 und höher verfügbar
Möglicherweise erhalten Sie einen doppelten Schrägstrich auf Verzeichnissen?
Folgendes verwende ich und es funktioniert einwandfrei:
quelle
Eine Sache, auf die ich bei meinem Umgang mit diesem Problem gestoßen bin, ist, dass, wenn Sie die Kombination von:
Übergeben Sie in Ihrer fpm-Pool-Konfiguration nicht den vollständigen Pfad zur
ProxyPass
Direktive.Aber -NUR- wenn der Pool an diesem Port gechrootet ist.
quelle
Ich bin mir nicht sicher, ob das Problem damit zusammenhängt, aber ich habe hier eine teilweise funktionierende Lösung gefunden:
https://stackoverflow.com/questions/44054617/mod-rewrite-in-2-4-25-triggering-fcgi-primary-script-unknown-error-in-php-fpm
Der Trick scheint das Hinzufügen eines? char in der .htaccess RewriteRule, zB mit:
anstatt:
Die Ursache des Problems scheint eine Änderung in mod_rewrite von Apache 2.4.25 zu sein. Ich habe Apache trace1 log level verwendet, um eine "Schleife" zu beobachten, die $ 1 an php-fpm übergibt, nachdem index.php / $ 1 übergeben wurde. Die $ 1 erzeugen den Fehler "AH01071: Got error 'Primäres Skript unbekannt \ n'".
Hoffe, dass dieser kleine Leckerbissen jemandem hilft, seine Probleme zu lösen.
quelle
Linode hat ein großartiges Tutorial zu diesem Thema
Grundsätzlich richten Sie einen Handler für den gesamten Server ein, der alle PHP-Skripte abfängt und an fast-cgi weiterleitet.
quelle
ich habe den fehler auch nach dem umstieg auf php-fpm + apache 2.4.6 für drupal instanzen
aber ich benutze mpm event mod
einfach einstecken
DirectoryIndex index.php
funktioniert bei mirdann sehen meine Vhost Einstellungen so aus
Vielen Dank
Die Standard-.htaccess-Datei von Drupal muss nicht überarbeitet werden
quelle
Ich habe die gleichen Probleme mit meinem Server (Docker Centos 7.3.16). Nach dem Verfolgen des PHP-FPM-Protokolls habe ich eine sys-lib verpasst.
WARNING: [pool www] child 15081 said into stderr: "php-fpm: pool www: symbol lookup error: /lib64/libnsssysinit.so: undefined symbol: PR_GetEnvSecure"
dann stelle ich das nspr wieder her, es funktioniert. Wenn Sie die Lösungen nicht finden können, nachdem Sie eine Methode ausprobiert haben, können Sie dies versuchen.yum -y install/reinstall nspr
quelle
Dies funktioniert mit Wordpress 5.1.1 und neuer zusammen mit PHP 7.3, FastCGI, Proxy, auch MariaDB / MySQL. Auf meinen Servern zweimal überprüft. Klappt wunderbar.
Zuerst unter CentOS / Fedora / Red Hat
Bearbeiten Sie diese Datei:
Fügen Sie dies ein:
Sollte srw-rw-rw- geben.
Oder wie man sich auf Debian / Ubuntu einrichtet
Tutorial:
Quelle: https://emi.is/?page=articles&article=php-7-installation-und-konfiguration-für-apache-2.4-mit-php-fpm-(debian,-repository)
Das Problem ist, dass PHP 7.3 von Ondrej Repo nur mit mpm_prefork Modus funktioniert. Er hat Git Repo, also kannst du ihn im Netz finden und ihn fragen, ob er PHP 7.3 für mpm_worker und mpm_event machen wird. Der Rest der Konfiguration für Debian-Familiendistrikte ist unten:
Einfügen
Einfügen
Einfügen
Kopieren Sie diese in die TXT-Datei:
entferne es und füge es statt oben ein:
Direktive hinzufügen
Dann aktiviere die Seite:
Nächste Bearbeitung der SSL-Site (In diesem Fall wurde certbot von Let's Encrypt bereits zu Beginn der SSL-Zertifizierungskonfiguration installiert und konfiguriert.)
Denken Sie daran, einer Firewall unter Debian / Ubuntu einen Port 9000 hinzuzufügen
Auf CentoOS / Fedora / Red Hat
quelle