Nginx: stat () fehlgeschlagen (13: Berechtigung verweigert)

102

Ich verwende die Standardkonfiguration, während ich das spezifische Verzeichnis hinzufüge, in dem nginx auf meinem Ubuntu 12.04-Computer installiert ist.

server {
        #listen   80; ## listen for ipv4; this line is default and implied
        #listen   [::]:80 default ipv6only=on; ## listen for ipv6

        index index.html index.htm;

        # Make site accessible from http://localhost/
        server_name localhost;

        location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to index.html
                root /username/test/static;
                try_files $uri $uri/ /index.html;
                # Uncomment to enable naxsi on this location
                # include /etc/nginx/naxsi.rules
        }
...

...
}

Ich möchte nur, dass ein einfacher statischer Nginx-Server Dateien aus diesem Verzeichnis bereitstellt. Allerdings überprüfe error.logich das

2014/09/10 16:55:16 [crit] 10808#0: *2 stat() "/username/test/static/index.html" failed (13: Permission denied), client:, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: "domain"
2014/09/10 16:55:16 [error] 10808#0: *2 rewrite or internal redirection cycle while internally redirecting to "/index.html

Ich habe bereits getan chown -R www-data:www-dataauf /username/test/static, ich habe festgelegt , sie zu chmod 755. Ich weiß nicht, was noch eingestellt werden muss.

user299709
quelle
3
Überprüfen Sie, ob der www-dataBenutzer cdin das /username/test/staticVerzeichnis kann:sudo -u www-data cd /username/test/static
Maciej Sz
Ich bekomme die Erlaubnis verweigert, aber wenn ich ls -l mache, zeigt es, dass es auf www-data user
user299709
2
Könnte es sein, dass / username auf encryptfs ist? Ich habe genau die gleichen Probleme mit dem Ordner / home / username, in dem sich meine Site befindet. Wenn ich es aus encryptfs verschiebe, funktioniert alles einwandfrei. Immer noch keine Lösung für mich ...
Georgi

Antworten:

193

Nginx arbeitet innerhalb des Verzeichnisses. Wenn Sie cdalso vom Nginx- Benutzer nicht in dieses Verzeichnis gelangen können , schlägt dies fehl (ebenso wie der statBefehl in Ihrem Protokoll). Stellen Sie sicher, dass die www-userDose cdbis zum /username/test/static. Sie können statdurch Ausführen bestätigen, dass der Vorgang fehlschlägt oder erfolgreich ist

sudo -u www-data stat /username/test/static

In Ihrem Fall ist hier wahrscheinlich das /usernameVerzeichnis das Problem. Hat www-datanormalerweise keine Berechtigungen für cdHome-Verzeichnisse anderer Benutzer.

Die beste Lösung in diesem Fall wäre, www-datader usernameGruppe Folgendes hinzuzufügen :

gpasswd -a www-data username

und stellen Sie sicher, dass die usernameGruppe alle Verzeichnisse entlang des Pfads eingeben kann:

chmod g+x /username && chmod g+x /username/test && chmod g+x /username/test/static

Starten Sie nginx neu, damit Ihre Änderungen funktionieren

nginx -s reload
Maciej Sz
quelle
Bedeutet dies, dass für jedes neue Verzeichnis, das unter dem Stammverzeichnis hinzugefügt wird, chmod für die neuen Verzeichnisse ausgeführt werden muss?
Qian Chen
2
@ElgsQianChen Beachten Sie, dass dies ein Berechtigungssystem auf Betriebssystemebene ist. In POSIX-Systemen hängt es also von Ihrem ab umask. Wenn Sie eine allgemeinere Lösung benötigen, für die nicht chmodjedes neue Verzeichnis erforderlich ist , gibt es eine Lösung. Es erfordert eine umgekehrte Gruppenzuordnung ( usernamezur www-dataGruppe) und die Verwendung von setgid. Fühlen Sie sich frei, eine neue Frage für eine ausführlichere Beschreibung zu posten, und ich werde gerne antworten.
Maciej Sz
Was ist, wenn sich mein Pfad im Verzeichnis / root / befindet? Ist es sicher, chmod g + x auf / root auszuführen? Und WWW-Daten zur Stammgruppe hinzufügen?
Oleg Abrazhaev
Auf Fedora 24 kam mein Problem mit ... ACL-Berechtigungen ... einer weiteren Ebene ... YEY!
Ray Foss
1
Nun, mein nginxBenutzer kann auf mein Website-Verzeichnis zugreifen, aber es heißt immer noch, dass die Berechtigung für die Fehlerprotokolle verweigert wurde.
Rahil Wazir
88

Ich hatte gerade das gleiche Problem mit einer CentOS 7-Box.

Scheint, als würde ich Selinux treffen. Das Versetzen von Selinux in den zulässigen Modus ( setenforce permissive) hat das Problem vorerst umgangen . Ich werde versuchen, mit einer richtigen Lösung zurück zu kommen.

Andrew Richard Miller
quelle
4
Dies ist das genaue "nicht dokumentierte" Verhalten, das ich in den letzten 3 Tagen zu verstehen versuchte ...
Achilles
2
Hier ist ein Beitrag über dieses Verhalten: axilleas.me/en/blog/2013/…
Achilles
2
Also befand ich mich wieder hier ... Dieses Mal habe ich die betreffende Datei aus meinem Home-Verzeichnis in das HTML-Verzeichnis kopiert und den Besitz aktualisiert. Gleiches Problem wie 2015 ... Bessere Lösung: ls -Z myFile.jsZeigt den SELinux-Kontext an: -rw-r--r--. nginx nginx unconfined_u:object_r:user_home_t:s0 myFile.js Verwenden Sie chcon -v --type=httpd_sys_content_t myFilediese Option, um den SELinux-Inhalt zu ändern.
Andrew Richard Miller
2
Jep; Ich hatte das gleiche Problem. sudo setenforce 0habe es für mich behoben.
Überladung119
1
Nur ein Hinweis: Wenn Sie möchten, dass Selinux vollständig deaktiviert wird, müssen Sie den SELINUXWert in disabledin ändern /etc/selinux/config, gefolgt von einem Neustart. Wenn es eingestellt ist permissive, kann es weiterhin Überprüfungen hinter den Kulissen durchführen (mit wertvoller CPU), aber keine Maßnahmen ergreifen.
Oliver Tappin
76

Nginx muss + x Zugriff auf alle Verzeichnisse haben, die zum Stammverzeichnis der Site führen.

Stellen Sie sicher, dass Sie + x in allen Verzeichnissen im Pfad haben, der zum Stammverzeichnis der Site führt. Wenn das Site-Stammverzeichnis beispielsweise / home / username / siteroot lautet:

chmod +x /home/
chmod +x /home/username
chmod +x /home/username/siteroot
Sairam Krish
quelle
13
Nach 6 Stunden verzweifelter Suche ... hat der gefundene Körper dies erwähnt, aber Sie! Danke!
Walid Ammar
3
Ich danke dir sehr! Ich habe Stunden damit verbracht, dies zum Laufen zu bringen und bin auf alle möglichen Antworten gestoßen. Ich kann nicht glauben, dass es so einfach war!
Eric Groom
2
diese Arbeit gut für mich, Centos 7, PHP Fpm 7.2 (Selinux bereits aus)
anhduc.bkhn
1
Danke dir! Ich kann nicht glauben, dass das alles war, was ich die ganze Zeit tun musste!
Exciteabletom
1
Danke, perfekt!.
Softsofter
32

Unter CentOS 7.0 hatte ich dieses Access DeinedProblem durch SELinux verursacht und diese Schritte haben das Problem behoben:

yum install -y policycoreutils-devel
grep nginx /var/log/audit/audit.log | audit2allow -M nginx
semodule -i nginx.pp

Update: Nur eine Randnotiz von dem, was ich bei der Verwendung der virtuellen Linux-Server von digitalocean oder wie sie Droplets nennen, gelernt habe . Die Verwendung von SELinux erfordert eine angemessene Menge an RAM. Es ist sehr wahrscheinlich, dass Sie SELinux nicht auf einem Droplet mit weniger als 2 GB RAM ausführen und verwalten können .

Achilles
quelle
2
Vielen Dank dafür. Es hat mein Problem (auch unter CentOS 7) zunächst gelöst, aber dann wurde ich durch eine zweite Ablehnung an anderer Stelle blockiert, also habe ich darauf zurückgegriffen setenforce 0. Als ich jedoch zurückblickte, was diese Lösung tatsächlich tut, wurde mir klar, dass ich die Befehle erneut ausführen musste, um die Berechtigungen für den Nginx-Benutzer zu aktualisieren. Das schien zu funktionieren und ich konnte SELinux wieder durchsetzen.
danj1974
Nun, das kann etwas zu spät sein. Dennoch ist es erwähnenswert, dass, wenn Sie SELinux weiter durchsetzen; Beachten Sie unbedingt, dass Software wie Nginx ihre eigenen Regeln wie Standardports, Standardpfade, Lese- / Schreibzugriff auf Pfade usw. in SELinux einfügt. Wenn Sie keine Probleme haben möchten, müssen Sie diese Regeln befolgen (z. B. Ihre HTML / PHP-Dateien in / var / www ablegen) oder sich darauf vorbereiten, Probleme zu überwinden, die tief im SELinux-Kontext entstehen. Dies kann hilfreich sein [CentOS <8]: getpagespeed.com/server-setup/nginx/nginx-selinux-configuration
Achilles
27

Möglicherweise wird Security-Enhanced Linux ausgeführt. Fügen Sie daher eine Regel hinzu. Ich hatte Berechtigungsfehler 13, obwohl Berechtigungen festgelegt wurden und der Benutzer vorhanden war.

chcon -Rt httpd_sys_content_t /username/test/static

Artjom Kurapov
quelle
Vielen Dank! Arbeitete an CentOS Release 6.10 (Final).
Marw
1
Arbeitete unter CentOS 7.5.1804 (Core).
Niek
4

Symptom:

Bilder konnten nicht in die WordPress Media Library hochgeladen werden.

Ursache:

(CentOS) yum update

Error:

2014/10/22 18:08:50 [crit] 23286#0: *5332 open() "/var/lib/nginx/tmp/client_body/0000000003" failed (13: Permission denied), client: 1.2.3.4, server: _, request: "POST /wp-admin/media-new.php HTTP/1.1", host: "example.com", referrer: "http://example/wp-admin/media-new.php"

Lösung:

chown -R www-data:www-data /var/lib/nginx

PJ Brunet
quelle
2

Standardmäßig befinden sich die statischen Daten bei der Installation von nginx in / var / www / html. Sie können also einfach Ihren statischen Ordner in / var / html / kopieren und die festlegen

root /var/www/<your static folder>

in ngix.conf (oder / etc / nginx / sites-available / default)

Dies funktionierte für mich auf Ubuntu, aber ich denke, es sollte für andere Distributionen nicht viel anders sein.

Ich hoffe es hilft.

Patrik Bego
quelle
2

Ändern Sie Ihre nginx.conf userEigenschaft in www-staticDateibesitzer.

#   * Official English Documentation: http://nginx.org/en/docs/
#   * Official Russian Documentation: http://nginx.org/ru/docs/

user your_user_name;

# same other config
lonnyzhang423
quelle
1

In meinem Fall war der Ordner, in dem die Dateien bereitgestellt wurden, ein symbolischer Link zu einem anderen Ordner, der mit erstellt wurde

ln -sf /origin /var/www/destination

Obwohl die Berechtigungen (Benutzer und Gruppe) für den Zielordner (den symbolischen Link) korrekt waren, hatte ich dennoch den Fehler, da Nginx auch Berechtigungen für die gesamte Hierarchie des Ursprungsordners haben musste.

Santiago Martí Olbrich
quelle
1

Ich fand endlich meinen Weg durch. Kurz gesagt, nehmen wir an, Ihr Benutzername lautet joeund Sie halten eine Website unter Ihrem persönlichen Dateisystem/home/joe/path/to/website .

Sie müssen dem System buchstäblich sagen, dass nginxes Ihr Kumpel ist.
Legen Sie nginxin joeGruppe:

sudo gpasswd -a nginx joe

Wenn es danach immer noch nicht funktioniert, überprüfen Sie den richtigen Zugriff auf das /home/joeVerzeichnis. Das ist wahrscheinlich der Grund, warum Nginx die Datei nicht erreichen kann, denn selbst wenn er jetzt dein Freund ist, musst du ihm die Tür zu deinem Haus öffnen:

sudo chmod g+x /home/joe

Das ist es. Das ist buchstäblich alles, was Sie tun müssen, um Nginx Zugriff auf Ihre lokalen Dateien zu gewähren :)

Ich glaube nicht, dass es Sicherheitsbedenken bei dieser Methode gibt, da dies nginxdie hohe Autorität ist und nur ein Administrator die Gruppe ändern kann. nginxkann jetzt lesen, was in joeVerzeichnissen ist. Es ist nur dann eine Sicherheitsverletzung, wenn sich der Inhaber des nginxKontos von dem Benutzer unterscheidet, von dem aus Sie den Verzeichniszugriff öffnen. In meinem Fall bin ich jedoch Inhaber beider Parteien, dh in einem lokalen Kontext.

vdegenne
quelle
0

Ich hatte das gleiche Problem, ich verwende Plesk Onyx 17 mit Centos7. Ich konnte diesen Fehler in proxy_error_log unter den Protokollen der betroffenen Domäne sehen. Alle Verzeichnisse / Dateien in / var / www / vhosts / gehören den jeweiligen Benutzern (Domänenbesitzern), und Sie können sehen, dass sich alle in der psacln-Gruppe befinden. Die Lösung bestand also darin, Nginx auch zu dieser Gruppe hinzuzufügen, damit er sehen kann, was er braucht:

usermod -aG psacln nginx

Starten Sie nginx neu und laden Sie die Seite mit Strg + F5 neu.

Slavomir Miskovec
quelle
0

Ich war mit diesem Problem konfrontiert und habe es gelöst, um dem Nginx-Benutzer Berechtigungen zu erteilen und so etwas zu gruppieren:

chown -R nginx:nginx /username/test/static
julianische salas
quelle
0

Ich habe eine Lösung gefunden: Der Ordner wurde in den Nginx-Konfigurationsordner verschoben, in meinem Fall "/ etc / nginx / my-web-app". Und dann wurden die Berechtigungen auf Root-Benutzer "sudo chown -R root: root" my-web-app "geändert.

Dheeraj
quelle
0

Sie können auch hinzufügen, welcher Benutzer den Nginx ausführen soll. Nehmen Sie in der Datei nginx.conf die folgenden Änderungen vor:

user root;

Sie können die obige Zeile als erste Zeile in Ihre nginx conf einfügen. Sie können den Namen jedes Benutzers schreiben, der die Berechtigung zum Schreiben in dieses Verzeichnis hat.

Rajat Bhatnagar
quelle
0

Dies ist normalerweise das Problem mit den Berechtigungen ... Für mich ist es, weil ich / root / ** als Nginx-Root verwende, höhere Berechtigungen erforderlich. Eine einfache Möglichkeit besteht darin, das Projekt in ein von Ihnen erstelltes Verzeichnis zu verschieben.

fooool
quelle