Berechtigung beim Lesen im Upstream verweigert

40

Wir haben unsere Rails-Anwendung auf Nginx und Passenger implementiert. In unregelmäßigen Abständen werden Anwendungsseiten teilweise geladen. Das Anwendungsprotokoll enthält keinen Fehler. Das Nginx-Fehlerprotokoll zeigt jedoch Folgendes:

2011/02/14 05:49:34 [crit] 25389#0: *645 open() "/opt/nginx/proxy_temp/2/02/0000000022" failed (13: Permission denied) while reading upstream, client: x.x.x.x, server: y.y.y.y, request: "GET /signup/procedures?count=0 HTTP/1.1", upstream: "passenger:unix:/passenger_helper_server:", host: "y.y.y.y", referrer: "http://y.y.y.y/signup/procedures"

user68613
quelle
Sie können die Protokollstufe auf Debug festlegen
Rimian,

Antworten:

39

Ich hatte das gleiche Problem bei einem NGINX / PHP-FPM-Setup (php-fpm = verbesserte fcgi für PHP).

Sie können herausfinden, unter welchem ​​Benutzer die Nginx-Prozesse ausgeführt werden

ps aux | grep "nginx: worker process"

Überprüfen Sie anschließend, ob die Berechtigungen in Ihren Proxy-Dateien korrekt sind

ls -l /opt/nginx/proxy_temp/

In meinem Fall lief nginx als www-dataund zwei der Verzeichnisse in meinem Proxy-Verzeichnis gehörten zu root.

Ich weiß noch nicht, wie es passiert ist, aber ich habe es behoben, indem ich (als root)

chown www-data.www-data /opt/nginx/proxy_temp
cmc
quelle
4
Die beste Lösung!
Efkan
Warum wird es noch nicht akzeptiert?
Kishor Pawar
1
für diejenigen, die #openresty verwenden - "chown www-data: www-data -R / usr / local / openresty / nginx / * _ temp"
BG Bruno
1
Ich habe meinen Nginx-Prozess gestoppt, den Ordner in einen anderen Namen umbenannt, den Nginx-Prozess neu gestartet und den Ordner erneut mit den richtigen Berechtigungen erstellt. Lief wie am Schnürchen!
Chirayu Shishodiya
8

Sie haben wahrscheinlich mit dem Benutzer root begonnen und ihn dann geändert. Jetzt ist das Problem, dass die Cache-Ordner, dh

/var/cache/nginx/client_temp
/var/cache/nginx/fastcgi_temp
/var/cache/nginx/proxy_temp
/var/cache/nginx/scgi_temp
/var/cache/nginx/uwsgi_temp

sind bereits im Besitz von root, daher kann Ihr Nginx-Benutzer (oder was auch immer Sie versuchen, zu ihm zu wechseln) nicht auf sie zugreifen, da er eine Berechtigung von 700 hat.

Die Lösung ist also einfach. Stoppen Sie Nginx, dann:

rm -rf /var/cache/nginx/*

oder was auch immer der Pfad auf Ihrer Distribution und Veröffentlichung ist. Starten Sie dann nginx neu, wodurch diese Ordner mit den entsprechenden Berechtigungen neu erstellt werden.

bviktor
quelle
8

Überprüfen Sie auch die Datei nginx.conf, um sicherzustellen, dass Sie den richtigen Benutzer und die richtige Gruppe angeben.

Ich hatte ein Problem, bei dem die Berechtigungen für das Verzeichnis für den Benutzernamen / nginx eingerichtet wurden, aber der Benutzer nginx.conf hat nur den Benutzernamen angegeben. Wenn der Benutzeranweisung keine Gruppe zugewiesen wurde, wird standardmäßig derselbe Name wie für den Benutzer verwendet. Daher hat Benutzername / Benutzername versucht, auf ein Verzeichnis anstelle von Benutzername / nginx zuzugreifen. Das Aktualisieren der Konfiguration hat meine Probleme behoben.

Siehe: http://nginx.org/en/docs/ngx_core_module.html#user

Michael Sepcot
quelle
2
Kannst du bitte die hier erwähnte Konfiguration posten?
Paweloque
4

Also habe ich all das oben Genannte getan und leider gab es mir den gleichen Fehler. Ich führe eine Schienen-App aus, die in eine JAR-Datei mit Torquebox auf einer Centos 6.7-Maschine mit Nginx gepackt ist. Ich habe ungefähr 3 Stunden damit gekämpft, bis ich eine andere Lösung gefunden habe, und ich hoffe, es hilft jemand anderem. Nach diesem Artikel kann Nginx im erzwungenen Modus ausgeführt werden. Ich habe einfach mit nginx in den permissive mode gewechselt

setenforce 0

Damit war der Fehler behoben und ich konnte meine Anwendung in einer Staging- / Produktionsumgebung ausführen.

Ich hatte keine Ahnung, bis ich den Fehler im audit.log fand

type=AVC msg=audit(1444454198.438:466): avc:  denied  { name_connect } for  pid=3201 comm="nginx" dest=8080 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=system_u:object_r:http_cache_port_t:s0 tclass=tcp_socket

Ich hoffe wirklich, dass dies jemandem die 3 Stunden erspart, die ich gerade verloren habe.

Bernardo Pineda
quelle
1
Du liegst nicht falsch, ich weiß nicht warum jemand -1 wählt (Schande über ihn / sie). Das Problem liegt in RedHat / CentOS-basierten Hosts und in Selinux. Ein Weg ist setenforce 0 (unhöflich), der andere Weg ist mit setsebool und Netzwerkoptionen.
periket2000
Es hat mit CentOS 7.2 geholfen.
MKatleast3
setsebool -P httpd_can_network_connect 1 von stackoverflow.com/a/24830777/721331
McKelvin
3

Wenn Sie nginx von einem nicht privilegierten Konto aus starten, wird die use_temp_path=off.

proxy_cache_path ... use_temp_path=off;

Dies sollte verhindern, dass Nginx versucht, die Dateien in den Standard zu versetzen proxy_temp_path. Aus den Nginx-Dokumenten:

Das Verzeichnis für temporäre Dateien wird basierend auf dem Parameter use_temp_path (1.7.10) festgelegt. Wenn dieser Parameter weggelassen oder auf den Wert on gesetzt wird, wird das Verzeichnis verwendet, das von der Anweisung proxy_temp_path für den angegebenen Speicherort festgelegt wurde. Wenn der Wert deaktiviert ist, werden temporäre Dateien direkt in das Cache-Verzeichnis gestellt.

JinnKo
quelle
-3
chmod 777 /opt/nginx/proxy_temp/

Ich hatte das gleiche Problem und es wurde von chmod in dieses Verzeichnis gelöst.

Firman Syah
quelle
13
chmod 777 ist niemals eine gute Idee.
sendmoreinfo