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?
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.
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
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.
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.
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.
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 ....
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.
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)
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.
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 .