Erro de correio PEAR parece travar o servidor (php-fpm): 504 gateway inválido

1

Estou nessa edição há alguns dias. Eu não fiz alterações de configuração, além das atualizações normais de sistema / segurança.

Servidor é executado no Debian Wheezy
PHP 5.4.41-1 ~ dotdeb + 7.1
Nginx 1.8.0-1 ~ dotdeb + 7.1

Estou executando um aplicativo PHP / Postgresql.

O Nginx usa o php-fpm em um ambiente chrooted.

Demorei algum tempo para isolar a causa de um erro de gateway 504 incorreto que meus usuários começaram a receber na semana passada.

O log do php-fpm mostra esse tipo de erro:

2015/05/28 15:19:32 [error] 6393#6393: *792 upstream timed out (110: Connection timed out) while reading response header from upstream, client: 90.50.31.149, server: www.myhost.com, request: "POST /myapp/?page=account&password HTTP/1.1", upstream: "fastcgi://unix:/var/run/php5-fpm.mypool.sock", host: "www.myhost.com", referrer: "https://www.myhost.com/myapp/?page=account&password"

Depois de pesquisar um pouco, eu aumentei a capacidade do php-fpm:

pm.max_children = 70
pm.start_servers = 20
pm.min_spare_servers = 20
pm.max_spare_servers = 35
pm.max_requests = 500

(o hardware pode lidar com isso)

E também adicionei a diretiva para nginx:

fastcgi_read_timeout 120;

Eu tenho o slowlog ativado e esse erro parece estar vinculado ao servidor não estar respondendo:

[28-May-2015 15:17:35]  [pool mypool] pid 6970
script_filename = htdocs//app/index.php
[0x00007f509caa9de8] fgets() /usr/share/php/Net/Socket.php:486
[0x00007f509caa9740] readLine() /usr/share/php/Net/SMTP.php:335
[0x00007f509caa9568] _parseResponse() /usr/share/php/Net/SMTP.php:1278
[0x00007f509caa8d20] rset() /usr/share/php/Mail/smtp.php:381
[0x00007f509caa7d18] getSMTPObject() /usr/share/php/Mail/smtp.php:248
[0x00007f509caa7478] send() /htdocs/app/lib/mail.func.php:86
[0x00007f509caa7180] msg() /htdocs/app/lib/account.func.php:421
[0x00007f509caa69b0] sendToken() /htdocs/app/lib/account.func.php:386
[0x00007f509caa5fe8] newToken() /htdocs/app/lib/account.func.php:425
[0x00007f509caa4ce0] +++ dump failed

Parece que o erro está ocorrendo dentro da sopa interna da PEAR.

Existe uma cópia do /usr/share/php no ambiente chrooted para o acesso ao nginx e php-fpm e garanti que a cópia está atualizada.

Meu aplicativo depende do PEAR :: Mail para enviar e-mails formatados, como quando um usuário precisa recuperar sua senha. Meus usuários são curtos, eles precisam recuperá-lo com freqüência e travar o servidor todas as vezes. Eu configurei um cron job para reiniciar o servidor regularmente, mas isso é de curto prazo: Eu preciso que a função mail funcione corretamente como costumava fazer.

Alguém já teve uma ideia do que eu deveria / poderia fazer?

EDIT - Depois de algumas brincadeiras, parece ser uma questão de resolver corretamente o endereço do servidor smtp, que pode estar relacionado ao nginx e php-fpm sendo chrooted, já que consegui fazê-lo funcionar em um "normal" ambiente (não chrooted).

Eu posso dig e nslookup do servidor.

Em php.ini , certifiquei-me de que:

allow_url_fopen on
allow_url_include on

(embora o último não pareça realmente necessário no meu caso)

Eu também me certifiquei de que o php tenha openssl e sockets habilitados.

Inclusive adicionei uma diretiva resolver no meu nginx.conf e copiei /etc/hosts (com uma entrada para o meu servidor de e-mail) na árvore de chroot.

Agora, quando eu mudo o host em minhas configurações smtp, recebo mensagens de erro diferentes:

  • host = mail.server.net
    o servidor trava e eu recebo um 504
  • host = ip
    o servidor trava e eu recebo um 504
  • host = ssl://mail.server.net e Failed to connect to ssl://mail.server.net:465 [SMTP: Failed to connect socket: fsockopen(): unable to connect to ssl://mail.server.net:465 (Unknown error) (code: -1, response: )]
  • host = https://mail.server.net e Failed to connect to https://ns0.ovh.net:465 [SMTP: Failed to connect socket: fsockopen(): unable to connect to https://ns0.ovh.net:465 (Unable to find the socket transport "https" - did you forget to enable it when you configured PHP?) (code: -1, response: )]

phpinfo() mostra
Fluxos PHP registrados : https, ftps, compress.zlib, compress.bzip2, php, arquivo, glob, dados, http, ftp, zip, phar
Transportes de soquete de fluxo registrados : tcp, udp, unix, udg, ssl, sslv3, tls

Eu vejo que não tenho o transporte de soquete "https": como posso ativá-lo?

    
por Manumie 28.05.2015 / 16:21

1 resposta

0

O que eu deduzo do seu rastreamento de pilha é:

  • Seu aplicativo da web está entrando em contato com um servidor SMTP externo para entregar alguns e-mails.
  • A biblioteca PEAR enviou um comando RSET ao servidor SMTP.
  • O servidor SMTP não enviou uma resposta ao comando; apenas pendurou.

O grande problema que vejo aqui é que você só envia um comando RSET para um servidor de e-mail se ele já rejeitou uma mensagem que você propôs enviar. Eu suspeito que o servidor de e-mail, depois de rejeitar o e-mail, simplesmente o tenha protegido por firewall ou ignorado você.

Seu próximo passo é entrar em contato com o administrador do servidor de e-mail.

    
por 28.05.2015 / 17:42