Я занимаюсь этим вопросом несколько дней. Я не вносил изменений в конфигурацию, кроме обычных обновлений системы / безопасности.
Сервер работает на 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, я получаю разные сообщения об ошибках:
host = mail.server.net
host = ip
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, data, http, ftp, zip, phar
Зарегистрированные транспорты потоковых сокетов : tcp, udp, unix, udg, ssl, sslv3, tls
Я вижу, что у меня нет транспорта сокетов https: как его включить?
Что я сделал из вашей трассировки стека:
Я вижу здесь большую проблему в том, что вы отправляете команду RSET на почтовый сервер только в том случае, если он уже отклонил сообщение, которое вы предлагали отправить. Я подозреваю, что почтовый сервер, отклонив письмо, просто заблокировал вас файерволом или иным образом проигнорировал вас.
Следующим шагом будет обращение к администратору почтового сервера.