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

nginx + php-fpm: тайм-аут восходящего потока

Настроить:

У меня есть виртуальный ящик (бродяга), внутри которого запущен nginx + php-fpm. У меня загружен модуль xdebug. Версии:

ОПЕРАЦИОННЫЕ СИСТЕМЫ:

uname -a
Linux vagrant-ubuntu-vivid-64 3.19.0-26-generic #28-Ubuntu SMP Tue Aug 11 14:16:32 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

php5-fpm:

php5-fpm -v
PHP 5.6.4-4ubuntu6.2 (fpm-fcgi) (built: Jul  2 2015 15:59:03)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2014 Zend Technologies
    with Zend OPcache v7.0.4-dev, Copyright (c) 1999-2014, by Zend Technologies
    with Xdebug v2.2.6, Copyright (c) 2002-2014, by Derick Rethans

nginx:

nginx -V
nginx version: nginx/1.6.2 (Ubuntu)
TLS SNI support enabled

Проблема:

По неизвестной причине получаю:

upstream timed out (110: Connection timed out) while 
reading response header from upstream

Я попробовал настроить обе сокеты unix для настройки php5-fpm и TCP - оба не прошли с той же ошибкой.

С настройкой розеток, Я попытался изменить разрешения на прослушивание на чтение-запись и даже на 777 - нет разницы. На всякий случай образец конфига (www.conf) для розеток:

listen.owner = www-data
listen.group = www-data
listen.mode = 0666

И пользователь существует:

id www-data
uid=33(www-data) gid=33(www-data) groups=33(www-data)

С настройкой TCPОднако у меня есть:

$ telnet 127.0.0.1 9000
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.

Это означает, что он действительно прослушивает этот порт. Также еще одна проверка:

netstat -tulpn | grep 9000
tcp        0      0 127.0.0.1:9000          0.0.0.0:*               LISTEN      4396/php-fpm.conf)

Я также попытался отключить xdebug - просто чтобы убедиться, что это не проблема с подключением к нему (но, на самом деле, это бессмысленно, поскольку моя IDE запускается на хост-машине, и поэтому его порт не имеет ничего общего с портом внутри виртуальной машины) .

Я пытался установить fastcgi_read_timeout вместе с max_execution_time до действительно высоких значений (тысячи секунд), и это тоже не помогает.

Итак, что могло вызвать такое поведение и как решить эту проблему? Или, по крайней мере, что я могу сделать для отладки дела?

Обновить:

Когда я устанавливаю очень большой тайм-аут, сервер отвечает. Но дело в том, что я вижу, что это не проблема приложения, поскольку:

С вещами выше я совсем потерялся: nginx сообщает, что шлюз время ожидания. Это должно означать: запрос пришел к nginx, а затем был истекло время ожидания между nginx и его серверной частью (в данном случае php5-fpm). Если запрос "зависает" еще до появления в логах nginx - как приходит бэкэнд? Я имею в виду, почему у nginx есть «таймаут восходящего потока»?

Поэтому возникнет вопрос - что может вызвать такие задержки?

Если потребуется дополнительная информация - предоставлю.

Я также пробовал аналогичные вопросы по SO / SF, и это не помогло делу

Проблема решена. Проблема заключается в настройке бродяг:

# Shared folder
config.vm.synced_folder "./../", "/vagrant/",
        :nfs => true

И поскольку приложение пыталось записать журнал в общую папку, оно зависало, потому что реализация регистратора пыталась применить блокировку к файлу через flock() что просто некорректно работает в случае NFS.

Итак, решение:

  • Либо монтируйте общие папки не как устройства NFS
  • Или не используйте файловые блокировки. Хотя этот вариант кажется «более простым» способом решения проблемы - у него есть и обратная сторона, поскольку, если ваше приложение использует предопределенные производителем пакеты (например, через композитор), трудно даже понять, использует ли приложение что-то, что может дать сбой. как этот случай.