Ich habe einige Stunden mit diesem Thema verbracht und trotz der hohen Anzahl an damit zusammenhängenden Beiträgen kann ich es nicht lösen. Ich habe eine Fedora 20-Box mit Nginx + PHP-FPM, die bis heute recht gut funktioniert hat (nachdem ich php-fpm.service neu geladen habe, denke ich). Nginx liefert statische Dateien ohne Probleme, aber jede PHP - Datei löst einen Fehler 403 aus.
Die Berechtigungen sind in Ordnung, nginx und php-fpm laufen unter dem Benutzer "nginx":
root 13763 0.0 0.6 490428 24924 ? Ss 15:47 0:00 php-fpm: master process (/etc/php-fpm.conf)
nginx 13764 0.0 0.1 490428 7296 ? S 15:47 0:00 php-fpm: pool www
nginx 13765 0.0 0.1 490428 7296 ? S 15:47 0:00 php-fpm: pool www
nginx 13766 0.0 0.1 490428 7296 ? S 15:47 0:00 php-fpm: pool www
nginx 13767 0.0 0.1 490428 7296 ? S 15:47 0:00 php-fpm: pool www
nginx 13768 0.0 0.1 490428 6848 ? S 15:47 0:00 php-fpm: pool www
Die bereitgestellten Dateien wurden ebenfalls auf nginx user gesetzt. Ich beendete sogar das Chmoding dieser Dateien, versuchte es aber noch immer "Zugriff verweigert" für alle PHP Dateien.
Unten ist ein Server meiner Nginx-Konfiguration:
server {
listen 80;
server_name localhost;
root /var/www/html;
location ~ \.php$ {
fastcgi_intercept_errors on;
try_files $uri =404;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
Der PHP-FPM-Pool:
[www]
...
listen = 127.0.0.1:9000
user = nginx
group = nginx
...
Für die Versionen:
php-5.5.11 (sowie php-fpm-5.5.11 natürlich)
nginx-1.4.7
Ich füge das Nginx-Fehlerprotokoll hinzu:
FastCGI sent in stderr: "Access to the script '/var/www/html' has been denied (see security.limit_extensions)" while reading response header from upstream, client: xxx.xxx.xxx.xxx, server: localhost, request: "GET /index.php HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", Host: "xxx.xxx.xxx.xxx"
Und genau, dass security.limit_extensions
korrekt ist, setzen Sie auf: security.limit_extensions = .php
.
Über die Pfadberechtigungen kann/var/www/html durchlaufen werden .. Was fehlt mir?
Hier sind einige mögliche Lösungen:
Setzen Sie in Ihrer php-fpm www.conf security.limit_extensions
auf .php
oder .php5
oder was auch immer in Ihre Umgebung passt. Für einige Benutzer war es nur möglich, alle Werte vollständig zu entfernen oder auf FALSE
zu setzen.
In Ihrer Nginx-Konfigurationsdatei setzen Sie fastcgi_pass
auf Ihre Socket-Adresse (z. B. unix:/var/run/php-fpm/php-fpm.sock;
) anstelle von Serveradresse und Port.
Überprüfen Sie Ihren SCRIPT_FILENAME
fastcgi param und stellen Sie ihn entsprechend dem Speicherort Ihrer Dateien ein.
Fügen Sie in Ihrer Nginx-Konfigurationsdatei fastcgi_split_path_info ^(.+\.php)(/.+)$;
in den Standortblock ein, in dem alle anderen fastcgi-Parameter definiert sind.
In Ihrer php.ini setzen Sie cgi.fix_pathinfo
auf 1
Bitte beachten Sie, dass die obige Lösung (cgi.fix_pathinfo
auf 1
setzen) eine Idee von terrible ist. Siehe https://nealpoole.com/blog/2011/04/setting-up-php-fastcgi-and-nginx-dont-trust-the-tutorials-check-your-configuration/ für einen guten Überblick.
Das Problem liegt wahrscheinlich an Ihrer Anwendung, die auf PATH_INFO angewiesen ist. Aktivieren Sie die Zugriffsprotokollierung für PHP, um weitere Informationen zum Aufruf Ihrer Anwendung zu erhalten, um das Problem zu beheben.
Noch einmal, nur um sicher zu gehen - die akzeptierte Lösung ist eine schreckliche - Idee und wird Ihre Website wahrscheinlich hacken lassen.
Vergessen Sie nicht, den php5-fpm-Dienst neu zu starten, nachdem Sie die php.ini geändert haben !!
service php5-fpm neu starten oder service php5-fpm reload
fpm startet php5 neu, daher reicht es nicht aus, nginx neu zu starten, damit die Änderungen übernommen werden.
Dies kann auch passieren, wenn sich in Ihrem vhost-Dokumentstamm kein index.php
befindet.
Überprüfen Sie den Parameter www_root
in Ihrer nginx-Konfiguration sorgfältig. Dann überprüfen Sie noch einmal, ob sich die PHP-Datei, die Sie treffen möchten, tatsächlich dort befindet.
In meinem Fall habe ich den vhost doc root-Pfad falsch eingetippt und auf ein leeres Verzeichnis verwiesen.
Als Referenz für diejenigen, die später kommen: Fügen Sie im Conf für Ihre Site Folgendes hinzu: Fastcgi_param PATH_INFO $ fastcgi_path_info; Schauen Sie sich auch an, was SELinux macht. Um es auszuschalten: setenforce 0 Stellen Sie dann fest, welches Skript das Problem ist, und setzen Sie es auf setenforce 1 zurück
Es kann sich um selinux handeln. Wenn Sie den shared folder von Virtual Box verwenden, können Sie die Zugriffsberechtigungen in diesem Ordner unter Linux nicht ändern. Daher können Sie es nach dem Schließen von selinux lösen.