PHP FPM дает отказано в разрешении?

9

Я прочитал несколько статей о том, почему PHP-FPM может дать мне отказано в разрешении, но я не могу решить это.

Журналы ошибок читаются как:

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

Я немного, но потерял

  1. Я установил / var / lib / nginx / tmp для ec2-пользователя (я даже +777 все, чтобы проверить)
  2. Я установил /tmp/php-fpm.sock для ec2-пользователя
  3. файл конфигурации nginx настроен на ec2-пользователя
  4. php-conf установлен на пользователя и группу ec2-user
  5. ps aux предоставляет ec2-пользователю все процессы php-fpm и nginx

Моя Конфигурация Nginx включает в себя много файлов, основная конфигурация:

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

мой /etc/nginx/conf.d/ пуст. мой /mnt/web/nginx/conf.d содержит множество конфигураций веб-сайтов, которые включают в себя «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;
}

Мой /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

ОБНОВЛЕНИЕ: нашел проблему, поставил в ответ

edelwater
источник
1
selinux включен? Запустите Getenforce или Cat / Selinux / Enforce, если не включен 0
Сильвиуд
1
Какова остальная часть вашей конфигурации nginx?
Майкл Хэмптон
1
ваш сокет из файла журнала - /tmp/php-fpm.sock, но вы изменили / var / lib / nginx / tmp - вы делали chroot в nginx?
Сильвиуд
1
отправьте вывод команды mount
silviud
1
также посмотрите, что все каталоги в вашем доме ... см. serverfault.com/questions/170192/…
silviud

Ответы:

16

Я установил / var / lib / nginx / tmp на ec2-user / ec2-user (я даже +777 все проверял)

Но ... Я также должен был установить / var / lib / nginx на ec2-user / ec2-user

... после также chown / chgrp родительская папка nginx: больше ошибок нет.

Заняло у меня несколько часов ...

edelwater
источник
7
chown -Rf www-data:www-data /var/lib/nginxработал на меня. ничего не надо chmod.
Крис
Проверка файлов журналов помогает всегда, не забудьте проверить их прежде чем что-либо :)
поэзия скорби
9

Это обычно происходит. Когда userнастройка в nginx.conf изменяется с

user nginx;

к чему-то еще. В этом случае,

user ec2-user ec2-user;

Команда chmod не обязательна для комментария Криса и может открыть дыру в безопасности.

Решение:

Проверьте владельца текущего пользователя и группы в / var / lib / nginx.

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

Это говорит о том, что nginxэта папка может принадлежать несуществующему пользователю и группе с именем . Это предотвращает загрузку файлов.

В этом случае измените владельца папки на пользователя, определенного в nginx.conf ec2-user(sudo может не потребоваться).

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

Убедитесь, что это действительно изменилось.

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

Ошибка отказа в разрешении теперь должна исчезнуть. Проверьте error.log (на основе местоположения nginx.conf error_log).

$ sudo nano /opt/nginx/error.log

Если это не сработает, вам может понадобиться перезагрузить nginx и php-fpm.

$ sudo service nginx reload
$ sudo service php-fpm reload
Ну Эверест
источник
Это добилось успеха на моем облачном сервере Centos 7 от Google.
Дамодар Башял
3

Ни одно из других решений не помогло мне, но я обнаружил, что это работает:

$ 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

Источник

nullvariable
источник
Хорошо, мы попробовали несколько решений, и это то, что сработало. Мы не знаем, почему это сработало или в чем проблема, но это сработало.
Нил Мастерс
1

У меня похожая проблема с загрузкой файлов. ошибка 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"

Проблема была связана только с разрешением, я только установил, chmod -R 755 /var/lib/nginxи все заработало!

Бишванат Джа
источник
0

Просто решил мою проблему с разрешениями. Самый простой и простой способ - не запускать php-fpm или nginx от имени sudo (суперпользователь). Что вам нужно сделать, это:

  1. Преобразуйте все местоположения вывода журнала для nginx в yourUserName: пример yourUserName :chown yourUserName:yourUserName /var/log/nginx/error.log
  2. Пример следующего каталога сервера обновлений :chown yourUserName:yourUserName -R /var/www

Не используя root, мне не пришлось менять пользователя или группу php-fpm или любого слушающего пользователя или группы. Убедитесь, что вы также закомментировали nginx.conf 'user', поскольку это будет имя текущего пользователя.

CLH
источник
Пожалуйста, не публикуйте один и тот же ответ несколько раз. Также эта проблема давно решена.
Свен
0

Вместо того, чтобы редактировать права доступа в / var / lib / nginx / что угодно, не имеет ли больше смысла просто указывать nginx использовать другой путь, например / tmp / nginx? Это решило проблему для меня:

# 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 должны быть предпочтительно 700 (что не должно быть проблемой, если владельцем является тот же пользователь, указанный в директиве пользователя /etc/nginx/nginx.conf) или 770, если по какой-то причине вам необходимо иметь другого владельца файла и nginx для выполнения ввода / вывода через групповые разрешения. Никогда не видел, но кто знает.

В centos7 отредактируйте /etc/nginx/nginx.conf, чтобы сообщить nginx, что использовать этот новый каталог для тел клиентов

...

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

и перезапустите nginx (снова centos7)

systemctl restart nginx
siliconrockstar
источник
Никогда не чмод 777 ничего. Тем более не кеш! Теперь любой локальный пользователь может переписать ваш кеш и отправить потенциально вредоносные данные вашим пользователям. Для загрузки кто-то может заменить свою загрузку вместо.
Майкл Хэмптон
Иисус чувак, расслабься, эта сборка является частью демонстрационного кластера. Но хороший улов для людей, которые могут не знать лучше, я отредактирую ответ.
silicrockstar