Назад | Перейти на главную страницу

Ошибка 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 использует php-fpm в среде chrooted.

Мне потребовалось некоторое время, чтобы выявить причину ошибки 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;

У меня включен медленный журнал, и эта ошибка, похоже, связана с тем, что сервер не отвечает:

[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.

Есть копия /usr/share/php в chrooted окружении для доступа nginx и php-fpm, и я убедился, что копия актуальна.

Мое приложение использует PEAR :: Mail для отправки форматированных электронных писем, например, когда пользователю нужно восстановить свой пароль. Мои пользователи недальновидны, им нужно часто восстанавливать его и каждый раз ломать сервер. Я установил задание cron для регулярного перезапуска сервера, но это кратковременный срок: мне нужно, чтобы функция почты работала должным образом, как раньше.

У кого-нибудь есть идея, что я должен / могу сделать?

РЕДАКТИРОВАТЬ - После некоторой игры, похоже, это вопрос правильного разрешения адреса smtp-сервера, который может быть связан с chroot-файлами nginx и php-fpm, так как мне удалось заставить его работать в "нормальной" среде (не chrooted).

Я могу dig и nslookup с сервера.

В php.ini, Я убедился:

allow_url_fopen on
allow_url_include on

(хотя последнее в моем случае не выглядит действительно необходимым)

Я также убедился, что в php включены openssl и сокеты.

Я даже добавил resolver директива в моем nginx.conf и скопировал /etc/hosts (с записью для моего почтового сервера) в корневом дереве.

Теперь, когда я меняю хост в своих настройках smtp, я получаю разные сообщения об ошибках:

phpinfo() показывает
Зарегистрированные потоки PHP : https, ftps, compress.zlib, compress.bzip2, php, файл, glob, data, http, ftp, zip, phar
Зарегистрированные транспорты потоковых сокетов : tcp, udp, unix, udg, ssl, sslv3, tls

Я вижу, что у меня нет транспорта сокетов https: как его включить?

Что я сделал из вашей трассировки стека:

  • Ваше веб-приложение связывается с внешним SMTP-сервером для доставки почты.
  • Библиотека PEAR отправила команду RSET на сервер SMTP.
  • Сервер SMTP не отправил ответ на команду; он просто завис.

Я вижу здесь большую проблему в том, что вы отправляете команду RSET на почтовый сервер только в том случае, если он уже отклонил сообщение, которое вы предлагали отправить. Я подозреваю, что почтовый сервер, отклонив письмо, просто заблокировал вас файерволом или иным образом проигнорировал вас.

Следующим шагом будет обращение к администратору почтового сервера.