it-swarm.com.de

Nginx 403 ist für alle Dateien verboten

Ich habe nginx mit PHP-FPM auf einer CentOS 5-Box installiert, aber ich habe Schwierigkeiten, eine meiner Dateien zu liefern - ob PHP oder nicht.

Nginx läuft als www-data: www-data und die Standard-Site "Welcome to nginx on EPEL" (im Besitz von root: root mit 644 Berechtigungen) wird ordnungsgemäß geladen.

Die Nginx-Konfigurationsdatei hat eine Include-Direktive für /etc/nginx/sites-enabled/*.conf, und ich habe eine Konfigurationsdatei example.com.conf , also:

server {
 listen 80;

 Virtual Host Name
 server_name www.example.com example.com;


 location / {
   root /home/demo/sites/example.com/public_html;
   index index.php index.htm index.html;
 }

 location ~ \.php$ {
  fastcgi_pass   127.0.0.1:9000;
  fastcgi_index  index.php;
  fastcgi_param  PATH_INFO $fastcgi_script_name;
  fastcgi_param  SCRIPT_FILENAME  /home/demo/sites/example.com/public_html$fastcgi_script_name;
  include        fastcgi_params;
 }
}

Obwohl public_html im Besitz von www-data ist: www-data mit 2777 Dateiberechtigungen, kann diese Site keinen Inhalt bereitstellen.

 [error] 4167#0: *4 open() "/home/demo/sites/example.com/public_html/index.html" failed (13: Permission denied), client: XX.XXX.XXX.XX, server: www.example.com, request: "GET /index.html HTTP/1.1", Host: "www.example.com"

Ich habe zahlreiche andere Posts mit Benutzern gefunden, die 403s von Nginx erhalten, aber die meisten, die ich gesehen habe, beinhalten entweder komplexere Setups mit Ruby/Passenger (was mir in der Vergangenheit tatsächlich gelungen ist) oder sie erhalten nur Fehler beim Upstream-PHP -FPM ist involviert, daher scheinen sie wenig hilfreich zu sein.

Habe ich hier etwas Dummes gemacht?

167
Angus Ireland

Eine häufig übersehene Berechtigungsanforderung ist, dass ein Benutzer x Berechtigungen in jedem übergeordneten Verzeichnis einer Datei benötigt, um auf diese Datei zuzugreifen. Überprüfen Sie die Berechtigungen für /,/home,/home/demo usw. für den Zugriff auf www-data x. Meine Vermutung ist, dass/home wahrscheinlich 770 ist und www-data nicht durchlaufen kann, um zu einem beliebigen Unterverzeichnis zu gelangen. Wenn ja, versuchen Sie es mit chmod o + x/home (oder was auch immer Ihnen die Anfrage verweigert).

BEARBEITEN: Um alle Berechtigungen für einen Pfad anzuzeigen, können Sie namei -om /path/to/check verwenden.

305
kolbyjack

Wenn nach der Überprüfung der Berechtigungen der übergeordneten Ordner weiterhin permission denied angezeigt wird, kann es sein, dass SELinux den Zugriff einschränkt. 

So prüfen Sie, ob SELinux läuft:

# getenforce

So deaktivieren Sie SELinux bis zum nächsten Neustart:

# setenforce Permissive

Starten Sie Nginx neu und prüfen Sie, ob das Problem weiterhin besteht. Damit nginx Ihr WWW-Verzeichnis bereitstellen kann (stellen Sie sicher, dass Sie SELinux wieder einschalten, bevor Sie dies testen. D., setenforce Enforcing)

# chcon -Rt httpd_sys_content_t /path/to/www

Siehe meine Antwort hier für weitere Details

263
Kurt

Ich habe dieses Problem durch Hinzufügen von Benutzereinstellungen gelöst.

in nginx.conf

worker_processes 4;
user username;

Ändern Sie den 'Benutzernamen' mit dem Linux-Benutzernamen.

47
Anderson

Ich habe diesen Fehler und habe ihn schließlich mit dem folgenden Befehl gelöst.

restorecon -r /var/www/html

Das Problem tritt auf, wenn Sie etwas von einem Ort zum anderen bewegen. Es behält den Selinux-Kontext des Originals bei, wenn Sie es verschieben. Wenn Sie also etwas in/home oder/tmp entpacken, erhält es einen Selinux-Kontext, der seinem Standort entspricht. Jetzt müssen Sie das Verzeichnis nach/var/www/html ändern, und der Kontext sagt, dass es zu/tmp oder/home gehört, und httpd darf laut Richtlinie nicht auf diese Dateien zugreifen. 

Wenn Sie die Dateien statt mit mv cp speichern, wird der Selinux-Kontext nach dem Speicherort zugewiesen, in den Sie kopieren, nicht nach dem Ort, an den er kommt. Das Ausführen von restorecon setzt den Kontext auf seinen Standard zurück und behebt ihn auch.

26
jsina

Ich habe verschiedene Fälle ausprobiert und erst als der Besitzer auf nginx (chown -R nginx:nginx "/var/www/myfolder") gesetzt war, begann es wie erwartet zu arbeiten.

21
Andron

Alte Frage, aber ich hatte das gleiche Problem. Ich habe jede Antwort oben ausprobiert, nichts hat funktioniert. Das Problem wurde jedoch behoben, indem die Domäne entfernt und erneut hinzugefügt wurde. Ich verwende Plesk und installierte Nginx, nachdem die Domäne bereits vorhanden war. 

Es wurde jedoch zuerst eine lokale Sicherung in/var/www/backups durchgeführt. So konnte ich die Dateien leicht zurückkopieren.

Seltsames Problem ....

1
David

Ich habe mich in eine kleine Variante dieses Problems eingegraben, indem ich versehentlich den Befehl setfacl ausgeführt habe. Ich rannte:

Sudo setfacl -m user:nginx:r /home/foo/bar

Ich habe diese Route zugunsten des Hinzufügens von nginx zur Gruppe foo aufgegeben, aber diese benutzerdefinierte Zugriffssteuerungsliste hat die Versuche von Nginx verhindert, auf die Datei zuzugreifen. Ich löschte es durch Laufen:

Sudo setfacl -b /home/foo/bar

Und dann konnte Nginx auf die Dateien zugreifen.

0
danvk

Das gleiche Problem hatten wir bei der Verwendung von Plesk Onyx 17. Anstatt die Rechte usw. durcheinanderzubringen, bestand die Lösung darin, den Benutzer nginx zur Gruppe psacln hinzuzufügen, in der alle anderen Domänenbesitzer (Benutzer):

usermod -aG psacln nginx

Jetzt hat nginx die Berechtigung, auf .htaccess oder andere Dateien zuzugreifen, die zum Anzeigen des Inhalts erforderlich sind. 

Stellen Sie andererseits auch sicher, dass sich Apache in der psaserv-Gruppe befindet, um statischen Inhalt bereitzustellen:

usermod -aG psaserv Apache

Und vergessen Sie nicht, Apache und Nginx danach in Plesk neu zu starten! (und Seiten mit Strg-F5 neu laden)

0

Wenn Sie SELinux verwenden, geben Sie einfach Folgendes ein:

Sudo chcon -v -R --type=httpd_sys_content_t /path/to/www/

Dadurch wird das Berechtigungsproblem behoben.

0
David Ding

Wenn Sie PHP verwenden, stellen Sie sicher, dass die Anweisung index NGINX im Serverblock eine index.php enthält:

index index.php index.html;

Weitere Informationen finden Sie in der offiziellen Dokumentation in der index-Direktive .

0