O PHP-FPM não grava no log de erros


161

Acabei de instalar um servidor nginx + php-fpm. Tudo parece bem, exceto que o PHP-FPM nunca grava erros em seu log.

fpm.conf

[default]
listen = /var/run/php-fpm/default.sock
listen.allowed_clients = 127.0.0.1
listen.owner = webusr
listen.group = webusr
listen.mode = 0666
user = webusr
group = webusr
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.status_path = /php/fpm/status
ping.path = /php/fpm/ping
request_terminate_timeout = 30s
request_slowlog_timeout = 10s
slowlog = /var/log/php-fpm/default/slow.log
chroot = /var/www/sites/webusr
catch_workers_output = yes
env[HOSTNAME] = mapsvr.mapking.com
php_flag[display_errors] = on
php_admin_value[error_log] = /var/log/php-fpm/default/error.log
php_admin_flag[log_errors] = on

nginx.conf

server
{
  listen        80 default_server;
  server_name   _;

  charset       utf-8;
  access_log    /var/log/nginx/access.log rest;

  include       conf.d/drops.conf.inc;

  location      /
  {
    root        /var/www/sites/webusr/htdocs;
    index       index.html index.htm index.php;
  }

  # pass the PHP scripts to FastCGI server listening on socket
  #
  location      ~ \.php$
  {
    root           /var/www/sites/webusr/htdocs;
    include        /etc/nginx/fastcgi_params;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME /htdocs/$fastcgi_script_name;
    if (-f $request_filename)
    {
      fastcgi_pass   unix:/var/run/php-fpm/default.sock;
    }
  }

  location      = /php/fpm/status
  {
    include        /etc/nginx/fastcgi_params;
    fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_pass   unix:/var/run/php-fpm/default.sock;
  }

  location      = /php/fpm/ping
  {
    include        /etc/nginx/fastcgi_params;
    fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_pass   unix:/var/run/php-fpm/default.sock;
  }

  # redirect server error pages to the static page /50x.html
  #
  error_page    500 502 503 504  /50x.html;
  location      = /50x.html
  {
    root        /usr/share/nginx/html;
  }
}

Eu criei um script php incorreto e executei, e vejo a saída de erro no navegador da web. Além disso, o log de erros do nginx indica a saída stderr do fpm com a mesma mensagem. Verifiquei se o usuário tem permissão de gravação (eu até tentei 777) na pasta de log designada. Até o arquivo error.log designado foi criado com sucesso pelo php-fpm. No entanto, o arquivo de log está sempre vazio, independentemente do erro ultrajante que tenha sido feito no script php.

O que está acontecendo?

[Encontrei a razão bastante tempo depois]

Foi permissão. Mudou o proprietário para os usuários dos sites resolveu o problema.


Vale ressaltar que a versão problemática do php está entre a v5.3.9 e a v5.3.14 (como hoje). Ele deve funcionar a partir das v5.3.15 e v5.4.5.
Anton Babenko

se você estiver usando hhvm + php-fpm com homestead, o log está em tail /var/log/hhvm/error.log
astroanu

Mesmo problema aqui. Parece que o acesso e o log lento precisam de permissões diferentes, portanto, a pasta é criada com o root-755.
scones

Respostas:


190

Isso funcionou para mim:

; Redirect worker stdout and stderr into main error log. If not set, stdout and
; stderr will be redirected to /dev/null according to FastCGI specs.
; Default Value: no
catch_workers_output = yes

Editar:

O arquivo a editar é o arquivo que configura o pool desejado. Por padrão, é: /etc/php-fpm.d/www.conf


5
<strike> Em qual arquivo de configuração? php.ini? php-fpm.conf? </strike>. Eu uncommented-lo dentro da minha/etc/php-fpm.d/www.conf
giratória

16
No Ubuntu 14 este arquivo está localizado em /etc/php5/fpm/pool.d/www.conf
Gilberto Albino

2
Acho que a questão é onde está esse indescritível "registro principal de erros" ... Ah, entendo, é o valor php_admin_value[error_log]desse mesmo arquivo de configuração - /var/log/php-fpm/www-error.log no CentOS 7 , por exemplo
Brad Peabody

7
sudo vi /etc/php/7.0/fpm/pool.d/www.confpara mim
Collin Anderson

Este foi o caminho certo para mim, no Debian 9.1 e PHP-FPM 7.0
Antwane

79

Eu lutei com isso por um longo tempo antes de encontrar meus logs php-fpm estavam sendo gravados /var/log/upstart/php5-fpm.log. Parece ser um erro entre como o iniciante e o php-fpm interagem. Veja mais aqui: https://bugs.launchpad.net/ubuntu/+source/php5/+bug/1319595


11
Obrigado!! Essa foi a chave para mim. Acabei simbolizando os dois arquivos porque sei que não vou me lembrar disso mais tarde:ln -sf /var/log/upstart/php5-fpm.log /var/log/php5-fpm.log
njbair 15/02/2015

PHP é tão confuso ... há um pré-criado /var/log/php7.0-fpm.logassim, php_admin_value[error_log] = /var/log/fpm-php.www.logirá redirecionar para log não-padrão ??
Peter Krauss

53

Eu tive um problema semelhante e tive que fazer o seguinte no pool.d/www.confarquivo

php_admin_value[error_log] = /var/log/fpm-php.www.log
php_admin_flag[log_errors] = on

Ainda não estava gravando o arquivo de log, então tive que criá-lo touch /var/log/fpm-php.www.logdefinindo o proprietário correto sudo chown www-data:www-data /var/log/fpm-php.www.log.

Feito isso, e o php5-fpm reiniciado, o registro foi retomado.


esse foi realmente o caso! Eu ainda tenho algum conteúdo futher apareceu no local logo após o erro :)
holms

Muito obrigado por isso! Esta foi a solução para mim no Ubuntu 14.04.1 (Jessie), se isso ajudar alguém.
William Turrell

Algum problema em um ambiente vagabundo / debian com chiado.
Xosofox 8/03/16

Outros caminhos, como / var / log /, são apenas uma perda de tempo.
Pedro Góes

1
Por quê?! Este ainda é um problema no fpm-php7.
precisa saber é o seguinte

31

Existem vários arquivos de configuração php, mas este é o que você precisa editar:

/etc/php(version)?/fpm/pool.d/www.conf

descomente a linha que diz:

catch_workers_output

Isso permitirá que o PHP stderr acesse o log de erros do php-fpm em vez de / dev / null.


2
Para aqueles que usam o docker, seus arquivos de configuração estão localizados:/usr/local/etc/php-fpm.d/
Edward

Com este conf, para onde vai o log, at /var/log/php7.0-fpm.log, at /var/log/fpm-php.www.logou outro?
Peter Krauss

Para onde ele faz logon?
Viktor Joras

26

Reuni idéias de várias respostas aqui e apresento uma solução abrangente:

Portanto, se você configurar o nginx com php5-fpm e registrar uma mensagem usando, error_log()poderá vê-la /var/log/nginx/error.logpor padrão.

Um problema pode surgir se você desejar registrar muitos dados (por exemplo, uma matriz) usando error_log(print_r($myArr, true));. Se uma matriz for grande o suficiente, parece que nginxtruncará sua entrada de log.

Para contornar isso, você pode configurar fpm( php.net fpm config ) para gerenciar logs. Aqui estão as etapas para fazer isso.

  1. Abrir /etc/php5/fpm/pool.d/www.conf:

    $ sudo nano /etc/php5/fpm/pool.d/www.conf

  2. Descomente as duas linhas a seguir removendo ;no início da linha: (error_log é definido aqui: php.net )

    ;php_admin_value[error_log] = /var/log/fpm-php.www.log ;php_admin_flag[log_errors] = on

  3. Criar /var/log/fpm-php.www.log:

    $ sudo touch /var/log/fpm-php.www.log;

  4. Altere a propriedade de /var/log/fpm-php.www.logpara que o php5-fpm possa editá-lo:

    $ sudo chown vagrant /var/log/fpm-php.www.log

    Nota: vagranté o usuário ao qual eu preciso dar posse. Você pode ver qual usuário isso deve ser para você executando $ ps aux | grep php.*wwwe olhando a primeira coluna.

  5. Reinicie o php5-fpm:

    $ sudo service php5-fpm restart

Agora seus logs estará em /var/log/fpm-php.www.log.


Eu tentei isso, ainda "fpm-php.www.log" está vazio. Qualquer ideia?
Sudharshan Nair

Imprima phpinfo()e veja se essas configurações foram realmente atendidas, @SudharshanNair.
Gezim 27/08/18

@Gezim. Obrigado pela sua resposta. meu caminho do log de erros é /var/log/fpm-php.www.log. Ainda este arquivo está vazio
Sudharshan Nair

@SudharshanNair, Se os log_errorserros estiverem ativados, a única outra coisa a verificar é a permissão e a propriedade do arquivo (etapa 4).
Gezim

@Gezim. Dei 777 permissões e propriedade como www-data:www-data: Ainda sem sorte. Qualquer ideia ?
Sudharshan Nair

14

Existe um bug https://bugs.php.net/bug.php?id=61045 no php-fpm da v5.3.9 e até agora (5.3.14 e 5.4.4). A correção prometida pelo desenvolvedor será lançada no próximo lançamento. Se você não quiser esperar - use o patch nessa página e reconstrua ou faça o rollback para 5.3.8.


4

No seu arquivo fpm.conf, você não definiu 2 variáveis, que são apenas para registro de erros.

As variáveis ​​são error_log(caminho do arquivo de log de erros) e log_level(nível de log de erros).

; Error log file
; Note: the default prefix is /usr/local/php/var
; Default Value: log/php-fpm.log

error_log = log/php-fpm.log

; Log level
; Possible Values: alert, error, warning, notice, debug
; Default Value: notice

log_level = notice

não é o padrão em /usr/local/var/phpvez de /usr/local/php/var? apenas especulando.
N611x007

2

no meu caso, mostro que o log de erros estava indo para /var/log/php-fpm/www-error.log . então comentei essa linha em /etc/php-fpm.d/www.conf

php_flag[display_errors]   is commented
php_flag[display_errors] = on  log will be at /var/log/php-fpm/www-error.log

e como dito acima eu também descomentei esta linha

catch_workers_output = yes

Agora eu posso ver os logs no arquivo especificado por nginx.


0

Gostaria de adicionar outra dica às respostas existentes, porque elas não resolveram o meu problema.

Cuidado com a seguinte diretiva nginx no seu bloco de localização php:

fastcgi_intercept_errors on;

A remoção dessa linha acabou com muitas horas de luta e arrancamento dos cabelos.

Pode estar oculto em algum diretório conf incluído, como /etc/nginx/default.d/php.confno meu fedora.


-1

No meu caso, o php-fpm gera um erro 500 sem nenhum log devido à falta do módulo php-mysql. Mudei a instalação do joomla para outro servidor e esqueci. Então, apt-get install php-mysqle reiniciar o serviço resolveu.

Comecei tentando consertar o log quebrado sem sucesso. Finalmente, straceencontrei a mensagem de falha após chamadas do sistema relacionadas ao banco de dados. Embora meu caso não esteja diretamente relacionado à pergunta do op, espero que seja útil.


-4

Verifique o diretório do proprietário do "PHP-FPM"

Você pode fazer:

ls -lah /var/log/php-fpm/
chown -R webusr:webusr /var/log/php-fpm/
chmod -R 777 /var/log/php-fpm/

5
nunca se punha / var / log / php-fpm para 777, você acabou de fazer o servidor vulnerável a um ataque de link simbólico (se não pior)
Luca Gibelli
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.