webentwicklung-frage-antwort-db.com.de

Zugriff verweigert (403) für PHP Dateien mit Nginx + PHP-FPM

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?

19
feub

Hier sind einige mögliche Lösungen:

  1. 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. 

  2. 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.

  3. Überprüfen Sie Ihren SCRIPT_FILENAME fastcgi param und stellen Sie ihn entsprechend dem Speicherort Ihrer Dateien ein.

  4. Fügen Sie in Ihrer Nginx-Konfigurationsdatei fastcgi_split_path_info ^(.+\.php)(/.+)$; in den Standortblock ein, in dem alle anderen fastcgi-Parameter definiert sind.

  5. In Ihrer php.ini setzen Sie cgi.fix_pathinfo auf 1

37
VF_

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.

8
mdekkers

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.

2

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.

0
joe_flash

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

0
Cong IT

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.

0
筱枫泠