PHP FPM daje odmowę zgody?

9

Przeczytałem kilka wpisów o tym, dlaczego PHP-FPM może dać mi odmowę zgody, ale nie mogę jej rozwiązać.

Dzienniki błędów brzmią następująco:

    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/"

Jestem trochę ale zagubiony:

  1. Ustawiłem / var / lib / nginx / tmp na ec2-user (nawet +777 wszystko do sprawdzenia)
  2. Ustawiłem /tmp/php-fpm.sock na ec2-user
  3. plik conf nginx jest ustawiony na ec2-user
  4. php-conf jest ustawiony na user i group ec2-user
  5. ps aux daje ec2-user we wszystkich procesach php-fpm i nginx

Moja konfiguracja Nginx zawiera wiele plików, podstawowa konfiguracja to:

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;
}

mój /etc/nginx/conf.d/ jest pusty mój /mnt/web/nginx/conf.d zawiera wiele konfiguracji stron internetowych, które wszystkie zawierają „wordpress.conf”:

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;
}

Mój /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

AKTUALIZACJA: znalazłem problem, umieść go w odpowiedzi

Edelwater
źródło
1
czy selinux jest włączony? uruchom getenforce lub cat / selinux / enforce, jeśli nie jest włączone 0
silviud 20.04.2013
1
Jaka jest reszta twojej konfiguracji nginx?
Michael Hampton,
1
twoje gniazdo z pliku dziennika to /tmp/php-fpm.sock, ale zmieniłeś / var / lib / nginx / tmp - czy robiłeś chroot w nginx?
silviud
1
wyślij dane wyjściowe z polecenia mount
silviud
1
również wyglądać, że wszystkie katalogi w domu ... zobacz serverfault.com/questions/170192/...
silviud

Odpowiedzi:

16

Ustawiłem / var / lib / nginx / tmp na ec2-user / ec2-user (nawet +777 wszystko do sprawdzenia)

Ale ... Musiałem także ustawić / var / lib / nginx na ec2-user / ec2-user

... po również chown / chgrp nadrzędny folder nginx: nie więcej błędów.

Zajęło mi to kilka godzin ...

Edelwater
źródło
7
chown -Rf www-data:www-data /var/lib/nginxpracował dla mnie. nie musiałem niczego przeskakiwać.
Chris
sprawdzanie plików dziennika zawsze pomaga, pamiętaj, aby je sprawdzić przede wszystkim :)
poezja smutku
9

Z reguły tak się dzieje. Kiedy userustawienie w nginx.conf zostanie zmienione z

user nginx;

na coś innego. W tym przypadku,

user ec2-user ec2-user;

Komenda chmod nie jest konieczna według komentarza Chrisa i może otworzyć lukę w zabezpieczeniach.

Rozwiązanie:

Sprawdź aktualnego użytkownika i własność grupy na / var / lib / nginx.

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

Informuje to, że prawdopodobnie nieistniejący użytkownik i grupa o nazwie nginxjest właścicielem tego folderu. Zapobiega to przesyłaniu plików.

W takim przypadku zmień własność folderu na użytkownika zdefiniowanego w nginx.conf ec2-user(sudo może nie być wymagane).

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

Sprawdź, czy rzeczywiście się zmieniło.

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

Błąd odmowy uprawnień powinien teraz zniknąć. Sprawdź error.log (w oparciu o lokalizację log_błędu nginx.conf).

$ sudo nano /opt/nginx/error.log

Jeśli to nie zadziała, być może będziesz musiał ponownie załadować nginx i php-fpm.

$ sudo service nginx reload
$ sudo service php-fpm reload
Nu Everest
źródło
To załatwiło sprawę na moim serwerze Google Centos 7 w chmurze.
Damodar Bashyal
3

Żadne inne rozwiązanie nie działało dla mnie, ale okazało się, że działa:

$ 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

Źródło

zerowy
źródło
Ok, wypróbowaliśmy kilka rozwiązań i to właśnie zadziałało. Nie wiemy, dlaczego to działało ani jaki był problem, ale tak się stało.
Neil Masters
1

Mam podobny problem z przesyłaniem plików. Błąd nginx 500 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"

Problem dotyczył tylko pozwolenia, właśnie ustawiłem chmod -R 755 /var/lib/nginxi wszystko działało!

Bishwanath Jha
źródło
0

Właśnie rozwiązałem mój problem z uprawnieniami. Najłatwiejszym i najprostszym było nie uruchamianie php-fpm lub nginx jako sudo (superużytkownik). Co musisz zrobić:

  1. zmienił wszystkie lokalizacje wyjściowe dziennika dla nginx na twoją nazwę użytkownika: przykład twoja nazwa użytkownika :chown yourUserName:yourUserName /var/log/nginx/error.log
  2. Następny katalog serwera aktualizacji, a także przykład :chown yourUserName:yourUserName -R /var/www

Nie używając roota nie musiałem zmieniać użytkownika lub grupy php-fpm ani żadnego użytkownika lub grup nasłuchujących. Upewnij się również, że skomentowałeś nginx.conf 'user', ponieważ będzie to nazwa bieżącego użytkownika.

clh
źródło
Nie publikuj tej samej odpowiedzi wiele razy. Problem ten został już dawno rozwiązany.
Sven
0

Zamiast edytować uprawnienia do / var / lib / nginx / cokolwiek, czy nie byłoby sensowniej po prostu powiedzieć nginx, aby używał innej ścieżki, takiej jak / tmp / nginx? To rozwiązało problem:

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

Uprawnienia / tmp / nginx powinny wynosić 700 (co nie powinno stanowić problemu, o ile właściciel jest tym samym użytkownikiem określonym w dyrektywie /etc/nginx/nginx.conf) lub 770, jeśli z jakiegoś powodu musisz mieć innego właściciela pliku i nginx do wykonywania operacji we / wy za pomocą uprawnień grupy. Nigdy tego nie widziałem, ale kto wie.

Na centos7 edytuj /etc/nginx/nginx.conf, aby poinformować nginx, aby używał tego nowego katalogu do treści klientów

...

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

i zrestartuj nginx (ponownie centos7)

systemctl restart nginx
siliconrockstar
źródło
Nigdy nie chmod 777 niczego. Zwłaszcza nie pamięć podręczna! Teraz każdy użytkownik lokalny może przepisać pamięć podręczną i wysłać potencjalnie złośliwe dane do użytkowników. W przypadku przesyłania można zamiast tego zastąpić własne przesyłanie.
Michael Hampton
Jezu koleś, zrelaksuj się, ta wersja jest częścią klastra demonstracyjnego. Ale dobry chwyt dla ludzi, którzy mogą nie wiedzieć lepiej, zredaguję odpowiedź.
siliconrockstar