PEAR Mail 错误似乎导致服务器崩溃(php-fpm):504 Bad gateway

PEAR Mail 错误似乎导致服务器崩溃(php-fpm):504 Bad gateway

我已经遇到这个问题好几天了。除了常规的系统/安全更新外,我没有进行任何配置更改。

服务器在 Debian Wheezy
PHP 5.4.41-1~dotdeb+7.1
Nginx 1.8.0-1~dotdeb+7.1上运行

我正在运行 PHP/Postgresql 应用程序。

Nginx 在 chrooted 环境中使用 php-fpm。

我花了一些时间来找出导致用户上周遇到 504 错误网关错误的原因。

php-fpm 的日志显示了此类错误:

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"

经过一番谷歌搜索后,我提高了 php-fpm 的容量:

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

(硬件可以处理)

我还添加了 nginx 指令:

fastcgi_read_timeout 120;

我已打开 slowlog,此错误似乎与服务器无响应有关:

[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

看来错误发生在 PEAR 的内部。

chrooted 环境中有一个副本/usr/share/php可供 nginx 和 php-fpm 访问,并且我确保该副本是最新的。

我的应用程序依赖 PEAR::Mail 发送格式化的电子邮件,例如当用户需要恢复密码时。我的用户很粗心,他们需要经常恢复密码,每次都会导致服务器崩溃。我设置了一个 cron 作业来定期重启服务器,但这只是短期的:我需要邮件功能像以前一样正常工作。

有人知道我应该/可以做什么吗?

编辑-经过一番尝试后,这似乎是正确解析 smtp 服务器地址的问题,这可能与 nginx 和 php-fpm 被 chrooted 有关,因为我设法让它在“正常”环境(未 chrooted)中工作。

我可以从服务器dig获取。nslookup

在 中php.ini,我确保:

allow_url_fopen on
allow_url_include on

(尽管在我看来后者并不是很必要)

我还确保 php 已启用 openssl 和套接字。

我甚至在resolver我的 chrooted 树中添加了一条指令nginx.conf并将其复制/etc/hosts(其中包含我的邮件服务器的条目)。

现在,当我在 smtp 设置中更改主机时,我收到不同的错误消息:

  • host = mail.server.net
    服务器挂了,我收到 504
  • host = ip
    服务器挂了,我收到 504
  • 主機 =ssl://mail.server.net
    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: )]
  • 主機 =https://mail.server.net
    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()节目
注册的 PHP 流:https、ftps、compress.zlib、compress.bzip2、php、文件、glob、数据、http、ftp、zip、phar
已注册的流套接字传输:tcp、udp、unix、udg、ssl、sslv3、tls

我发现我没有套接字传输“https”:我该如何启用它?

答案1

我从你的堆栈跟踪中推断出:

  • 您的 Web 应用正在联系外部 SMTP 服务器来传递一些邮件。
  • PEAR 库向 SMTP 服务器发送了 RSET 命令。
  • SMTP 服务器没有对该命令发送响应;它只是挂起。

我发现这里最大的问题是,只有当邮件服务器已经拒绝了你打算发送的消息时,你才会向邮件服务器发送 RSET 命令。我怀疑邮件服务器在拒绝电子邮件后,只是对你设置了防火墙或以其他方式忽略了你。

您的下一步是联系邮件服务器管理员。

相关内容