PHP FPM gibt Erlaubnis verweigert?


9

Ich habe mehrere Einträge darüber gelesen, warum PHP-FPM mir die verweigerte Erlaubnis erteilt, aber ich kann sie nicht lösen.

Die Fehlerprotokolle lauten wie folgt:

    2013/04/20 23:33:28 [crit] 15479#0: *6 open() "/var/lib/nginx/tmp/fastcgi
/2/00/0000000002" failed (13: Permission denied) while reading upstream, client: 
99.999.999.999, server: example.net, request: "GET /wp-admin/ HTTP/1.1", 
upstream: "fastcgi://unix:/tmp/php-fpm.sock:", host: "example.net", referrer:    
"http://example.net/"

Ich bin ein wenig aber verloren:

  1. Ich habe die / var / lib / nginx / tmp auf ec2-user gesetzt (ich habe sogar +777 alles zu überprüfen)
  2. Ich habe die Datei /tmp/php-fpm.sock auf ec2-user gesetzt
  3. Die Datei nginx conf ist auf ec2-user eingestellt
  4. das php-conf ist auf user und group ec2-user eingestellt
  5. ps aux gibt ec2-user für alle php-fpm- und nginx-prozesse

Meine Nginx-Konfiguration enthält viele Dateien. Die grundlegende Konfiguration lautet:

user              ec2-user ec2-user;
worker_processes  5;  
error_log /opt/nginx/error.log;    
pid        /var/run/nginx.pid;    
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;    
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log /opt/nginx/access.log main;    
    sendfile        on;
    keepalive_timeout  65;
    client_max_body_size 13m;
    index index.php index.html index.htm;
    upstream php {
       server unix:/tmp/php-fpm.sock;
    }
    include /etc/nginx/conf.d/*.conf;
    include /mnt/web/nginx/conf.d/*.conf;
}

Mein /etc/nginx/conf.d/ ist leer. Mein /mnt/web/nginx/conf.d enthält VIELE Website-Konfigurationen, die alle "wordpress.conf" enthalten:

location / {
    try_files $uri $uri/ /index.php?$args;
}
rewrite /wp-admin$ $scheme://$host$uri/ permanent;
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
    expires 24h;
    log_not_found off;
}
location ~ \.php$ {
    try_files $uri =404;    
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    include fastcgi_params;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_pass php;
}

Meine /opt/php/etc/php-fpm.conf:

include=/opt/php/etc/fpm.d/*.conf
pid = run/php-fpm.pid
error_log = log/php-fpm.log
log_level = notice
[www]
listen = /tmp/php-fpm.sock
user = ec2-user
group = ec2-user
pm = dynamic
pm.max_children = 250
pm.start_servers = 20
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500
pm.status_path = /fpm-status
ping.path = /fpm-ping
slowlog = log/$pool.log.slow
catch_workers_output = yes

UPDATE: habe das Problem gefunden und in die Antwort eingetragen


1
ist selinux aktiviert? Führen Sie getenforce oder cat / selinux / erzwingen aus, wenn nicht 0 aktiviert ist
silviud

1
Was ist der Rest Ihrer Nginx-Konfiguration?
Michael Hampton

1
Ihr Socket aus der Protokolldatei ist /tmp/php-fpm.sock, aber Sie haben / var / lib / nginx / tmp geändert - haben Sie in nginx chroot gemacht?
Silviud

1
Senden Sie die Ausgabe vom Befehl mount
silviud

1
Schauen Sie auch, dass alle Verzeichnisse in Ihrem Haus ... siehe serverfault.com/questions/170192/…
silviud

Antworten:


16

Ich hatte / var / lib / nginx / tmp auf ec2-user / ec2-user gesetzt (ich habe sogar +777 alles zu überprüfen)

Aber ... ich musste auch / var / lib / nginx auf ec2-user / ec2-user setzen

... nachdem auch der übergeordnete Nginx-Ordner chown / chgrp: keine Fehler mehr.

Hat ein paar Stunden gedauert ...


7
chown -Rf www-data:www-data /var/lib/nginxarbeitete für mich. brauchte nichts zu ändern.
Chris

Das Überprüfen von Protokolldateien hilft immer, denken Sie daran, sie vor allem zu überprüfen :)
Trauer Poesie

9

Dies geschieht im Allgemeinen. Wenn die userEinstellung in nginx.conf von geändert wird

user nginx;

zu etwas anderem. In diesem Fall,

user ec2-user ec2-user;

Der Befehl chmod ist laut Chris 'Kommentar nicht erforderlich und könnte eine Sicherheitslücke öffnen.

Lösung:

Überprüfen Sie den aktuellen Benutzer- und Gruppenbesitz in / var / lib / nginx.

$ ls -ld /var/lib/nginx
drwx------ 3 nginx nginx 4096 Aug  5 00:05 /var/lib/nginx

Dies zeigt Ihnen, dass ein möglicherweise nicht vorhandener Benutzer und eine Gruppe mit nginxdiesem Namen diesen Ordner besitzt. Dies verhindert das Hochladen von Dateien.

Ändern Sie in diesem Fall den Ordnerbesitz in den in nginx.conf definierten Benutzer ec2-user(sudo ist möglicherweise nicht erforderlich).

$ sudo chown -Rf ec2-user:ec2-user /var/lib/nginx

Stellen Sie sicher, dass es sich tatsächlich geändert hat.

$ ls -ld /var/lib/nginx
drwx------ 3 ec2-user ec2-user 4096 Aug  5 00:05 /var/lib/nginx

Der Fehler "Berechtigung verweigert" sollte jetzt verschwinden. Überprüfen Sie das error.log (basierend auf dem Speicherort von nginx.conf error_log).

$ sudo nano /opt/nginx/error.log

Wenn das nicht funktioniert, müssen Sie möglicherweise nginx und php-fpm neu laden.

$ sudo service nginx reload
$ sudo service php-fpm reload

Das war der Trick auf meinem Google Cloud Centos 7-Server.
Damodar Bashyal

3

Keine der anderen Lösungen hat bei mir funktioniert, aber ich fand, dass dies funktioniert:

$ apt-get install php-pear php5-dev
$ pecl install timezonedb
$ echo 'extension=timezonedb.so'> /etc/php5/mods-available/timezonedb.ini
$ ln -sf /etc/php5/mods-available/timezonedb.ini /etc/php5/conf.d/30-timezonedb.ini
$ service php5-fpm restart

Quelle


Ok, wir haben verschiedene Lösungen ausprobiert und diese hat funktioniert. Wir wissen nicht, warum es funktioniert hat oder was das Problem war, aber es hat funktioniert.
Neil Masters

1

Ich habe das ähnliche Problem beim Hochladen von Dateien. Nginx 500 Fehler 2015/07/05 03:50:36 [crit] 3656#0: *7 open() "/var/lib/nginx/tmp/client_body/0000000007" failed (13: Permission denied), client: 10.0.2.2, server: www.test.com, request: "POST /api/v1/users HTTP/1.1", host: "test"

Das Problem bezog sich nur auf die Erlaubnis, ich habe es gerade eingestellt chmod -R 755 /var/lib/nginxund die Dinge haben funktioniert!


0

Habe gerade mein Problem mit Berechtigungen gelöst. Der einfachste und einfachste Weg war, php-fpm oder nginx nicht als sudo (Superuser) auszuführen. Was Sie tun müssten, ist:

  1. Alle Protokollausgabespeicherorte für Nginx wurden in Ihren Benutzernamen geändert: Ihr Benutzername Beispiel :chown yourUserName:yourUserName /var/log/nginx/error.log
  2. Nächstes Update Server dir auch Beispiel :chown yourUserName:yourUserName -R /var/www

Da ich root nicht benutzte, musste ich weder den Benutzer oder die Gruppe von php-fpm noch einen abhörenden Benutzer oder Gruppen ändern. Stellen Sie sicher, dass Sie auch nginx.conf 'user' auskommentieren, da dies der aktuelle Benutzername ist.


Bitte poste die gleiche Antwort nicht mehrmals. Auch dieses Problem ist seit langem gelöst.
Sven

0

Wäre es nicht sinnvoller, nginx anzuweisen, einen anderen Pfad wie / tmp / nginx zu verwenden, anstatt die Berechtigungen für / var / lib / nginx / Whatever zu bearbeiten? Dies hat das Problem für mich behoben:

# create the directory
mkdir /tmp/nginx
chown -R nginx.nginx /tmp/nginx (assumes nginx user is named nginx)
chmod -R 700 /tmp/nginx

/ tmp / nginx-Berechtigungen sollten vorzugsweise 700 (was kein Problem sein sollte, solange der Eigentümer derselbe Benutzer ist, der in der 'user'-Direktive /etc/nginx/nginx.conf angegeben ist) oder 770 sein, wenn Sie dies aus irgendeinem Grund benötigen einen anderen Dateieigentümer und Nginx haben, um E / A über Gruppenberechtigungen auszuführen. Ich habe das noch nie gesehen, aber wer weiß.

Bearbeiten Sie unter centos7 /etc/nginx/nginx.conf, um nginx anzuweisen, dieses neue Verzeichnis für Client-Körper zu verwenden

...

http {
  ...
  client_body_temp_path /tmp/nginx 1 2;
  ...
}

und starte nginx neu (wieder centos7)

systemctl restart nginx

Niemals etwas ändern. Vor allem nicht der Cache! Jetzt kann jeder lokale Benutzer Ihren Cache neu schreiben und potenziell schädliche Daten an Ihre Benutzer senden. Bei Uploads könnte stattdessen jemand seinen eigenen Upload ersetzen.
Michael Hampton

Jesus, entspann dich, dieser Build ist Teil eines Demo-Clusters. Aber guter Fang für Leute, die es vielleicht nicht besser wissen, ich werde die Antwort bearbeiten.
Siliconrockstar
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.