PHP FPM dá permissão negada?


9

Eu li várias entradas sobre por que o PHP-FPM pode me dar permissão negada, mas não consigo resolvê-lo.

Os logs de erro são lidos como:

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

Estou um pouco, mas perdido:

  1. Eu configurei o / var / lib / nginx / tmp como ec2-user (eu até +777 tudo para verificar)
  2. Eu configurei o /tmp/php-fpm.sock como ec2-user
  3. o arquivo conf nginx está definido como ec2-user
  4. o php-conf está definido como user e group ec2-user
  5. ps aux fornece ao usuário ec2 em todos os processos php-fpm e nginx

Minha configuração do Nginx inclui muitos arquivos, o conf básico é:

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

meu /etc/nginx/conf.d/ está vazio meu /mnt/web/nginx/conf.d contém MUITAS configurações de sites que incluem "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;
}

Meu /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: encontrou o problema, coloque-o na resposta


1
o selinux está ativado? getenforce corrida ou cat / selinux / impor, se não for 0 é habilitado
silviud

1
Qual é o restante da sua configuração nginx?
Michael Hampton

1
seu soquete do arquivo de log é /tmp/php-fpm.sock, mas você alterou / var / lib / nginx / tmp - você fez chroot no nginx?
silviud

1
enviar a saída do comando mount
silviud

1
também olhar que todos os diretórios em sua casa ... ver serverfault.com/questions/170192/...
silviud

Respostas:


16

Eu tinha definido o / var / lib / nginx / tmp como ec2-user / ec2-user (eu até +777 tudo para verificar)

Mas ... eu também tive que definir / var / lib / nginx como ec2-user / ec2-user

... depois de chown / chgrp também a pasta principal do nginx: sem mais erros.

Levei algumas horas ...


7
chown -Rf www-data:www-data /var/lib/nginxtrabalhou para mim. não precisava chmod nada.
24415 Chris

verificando os arquivos de log ajuda sempre, lembre-se de verificá-los antes de qualquer coisa :)
tristeza poesia

9

Isso geralmente acontece. Quando a userconfiguração no nginx.conf é alterada de

user nginx;

para outra coisa. Nesse caso,

user ec2-user ec2-user;

O comando chmod não é necessário pelo comentário de Chris e pode abrir uma brecha na segurança.

Solução:

Verifique a propriedade atual do usuário e grupo em / var / lib / nginx.

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

Isso informa que um usuário e grupo possivelmente inexistente chamado nginxpossui esta pasta. Isso evita o upload de arquivos.

Altere a propriedade da pasta para o usuário definido no nginx.conf neste caso ec2-user(o sudo pode não ser necessário).

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

Verifique se realmente mudou.

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

O erro de permissão negada agora deve desaparecer. Verifique o error.log (com base no local do nginx.conf error_log).

$ sudo nano /opt/nginx/error.log

Se isso não funcionar, você pode precisar recarregar o nginx e o php-fpm.

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

Isso fez o truque no meu servidor Centos 7 do Google Cloud.
Damodar Bashyal 19/06/19

3

Nenhuma das outras soluções funcionou para mim, mas achei que funcionava:

$ 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

Fonte


Ok, tentamos várias soluções e essa é a que funcionou. Não sabemos por que funcionou ou qual era o problema, mas funcionou.
Neil Masters

1

Eu tenho o problema semelhante com o upload de arquivos. erro 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"

O problema estava relacionado apenas à permissão, acabei de definir chmod -R 755 /var/lib/nginxe tudo funcionou!


0

Acabei de resolver meu problema com permissões. A maneira mais fácil e simples era não executar o php-fpm ou o nginx como sudo (superusuário). O que você teria que fazer é:

  1. mostre todos os locais de saída de log do nginx para yourUserName: yourUserName example :chown yourUserName:yourUserName /var/log/nginx/error.log
  2. Próximo diretório do servidor de atualização, bem como exemplo :chown yourUserName:yourUserName -R /var/www

Ao não usar o root, não tive que alterar o usuário ou grupo php-fpm ou qualquer usuário ou grupo que esteja ouvindo. Certifique-se de comentar também nginx.conf 'user', pois será o nome do usuário atual.


Não poste a mesma resposta várias vezes. Além disso, esse problema já foi resolvido.
Sven

0

Em vez de editar permissões em / var / lib / nginx / qualquer outra coisa, não faria mais sentido dizer ao nginx para usar um caminho diferente como / tmp / nginx? Isso corrigiu o problema para mim:

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

As permissões / tmp / nginx devem ser 700 preferencialmente (o que não deve ser um problema, desde que o proprietário seja o mesmo usuário especificado na diretiva /etc/nginx/nginx.conf 'user') ou 770 se, por algum motivo, você precisar tenha um proprietário de arquivo diferente e nginx para executar a E / S por meio de permissões de grupo. Nunca vi isso, mas quem sabe.

No centos7, edite o /etc/nginx/nginx.conf para informar ao nginx para usar esse novo diretório para corpos de clientes

...

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

e reinicie o nginx (novamente centos7)

systemctl restart nginx

Nunca chmod 777 nada. Especialmente o cache! Agora, qualquer usuário local pode reescrever seu cache e enviar dados potencialmente maliciosos para seus usuários. Para envios, alguém pode substituir seu próprio upload.
Michael Hampton

Jesus cara, relaxe, essa compilação faz parte de um cluster de demonstração. Mas boa captura para pessoas que talvez não conheçam melhor, editarei a resposta.
Siliconrockstar 26/04/19
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.