Nginx + php-fpm «504 Gateway Time-out» ошибка с почти нулевой нагрузкой (на тест-сервере)

29

После 6 часов отладки - я отказываюсь от этого: |

У нас есть nginx + php-fpm + mysql в локальной сети с почти 100 WordPress (созданный и используемый разными дизайнерами / разработчиками, работающими над тестовой настройкой WordPres).

Мы используем nginx без каких-либо проблем.

Сегодня, неожиданно, nginx начал возвращать "504 Gateway Time-out" на ровном месте ...

Я проверил журнал ошибок nginx для виртуального хоста ...

2010/09/06 21:24:24 [error] 12909#0: *349 upstream timed out (110: Connection timed out) while reading response header from upstream, client: 192.168.0.1, server: rahul286.rtcamp.info, request: "GET /favicon.ico HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "rahul286.rtcamp.info"
2010/09/06 21:25:11 [error] 12909#0: *349 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 192.168.0.1, server: rahul286.rtcamp.info, request: "GET /favicon.ico HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "rahul286.rtcamp.info"
2010/09/06 21:25:11 [error] 12909#0: *443 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 192.168.0.1, server: rahul286.rtcamp.info, request: "GET /info.php HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "rahul286.rtcamp.info"
2010/09/06 21:25:12 [error] 12909#0: *443 connect() failed (111: Connection refused) while connecting to upstream, client: 192.168.0.1, server: rahul286.rtcamp.info, request: "GET /favicon.ico HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "rahul286.rtcamp.info"
2010/09/06 22:08:32 [error] 12909#0: *1025 upstream timed out (110: Connection timed out) while reading response header from upstream, client: 192.168.0.1, server: rahul286.rtcamp.info, request: "GET / HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "rahul286.rtcamp.info"
2010/09/06 22:09:33 [error] 12909#0: *1025 upstream timed out (110: Connection timed out) while reading response header from upstream, client: 192.168.0.1, server: rahul286.rtcamp.info, request: "GET /favicon.ico HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "rahul286.rtcamp.info"
2010/09/06 22:09:40 [error] 12909#0: *1064 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 192.168.0.1, server: rahul286.rtcamp.info, request: "GET /info.php HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "rahul286.rtcamp.info"
2010/09/06 22:09:40 [error] 12909#0: *1064 connect() failed (111: Connection refused) while connecting to upstream, client: 192.168.0.1, server: rahul286.rtcamp.info, request: "GET /favicon.ico HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "rahul286.rtcamp.info"
2010/09/06 22:24:44 [error] 12909#0: *1313 upstream timed out (110: Connection timed out) while reading response header from upstream, client: 192.168.0.1, server: rahul286.rtcamp.info, request: "GET / HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "rahul286.rtcamp.info"
2010/09/06 22:24:53 [error] 12909#0: *1313 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 192.168.0.1, server: rahul286.rtcamp.info, request: "GET /favicon.ico HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "rahul286.rtcamp.info"

Когда я запускал php-fpm на порту 9000 через режим TCP, я запускал «netstat | grep 9000» и заметил что-то необычное ... (здесь для частичного чтения вставлен частичный вывод)

tcp        9      0 localhost:9000          localhost:36094         CLOSE_WAIT  14269/php5-fpm  
tcp        0      0 localhost:46664         localhost:9000          FIN_WAIT2   -               
tcp     1257      0 localhost:9000          localhost:36135         CLOSE_WAIT  -               
tcp     1257      0 localhost:9000          localhost:36125         CLOSE_WAIT  -               
tcp        9      0 localhost:9000          localhost:36102         CLOSE_WAIT  14268/php5-fpm  
tcp        0      0 localhost:46662         localhost:9000          FIN_WAIT2   -               
tcp      745      0 localhost:9000          localhost:46644         CLOSE_WAIT  -               
tcp        0      0 localhost:46658         localhost:9000          FIN_WAIT2   -               
tcp     1265      0 localhost:9000          localhost:46607         CLOSE_WAIT  -               
tcp        0      0 localhost:46672         localhost:9000          ESTABLISHED 12909/nginx: worker
tcp     1257      0 localhost:9000          localhost:36119         CLOSE_WAIT  -               
tcp     1265      0 localhost:9000          localhost:46613         CLOSE_WAIT  -               
tcp        0      0 localhost:46646         localhost:9000          FIN_WAIT2   -               
tcp     1257      0 localhost:9000          localhost:36137         CLOSE_WAIT  -               
tcp        0      0 localhost:46670         localhost:9000          ESTABLISHED 12909/nginx: worker
tcp     1265      0 localhost:9000          localhost:46619         CLOSE_WAIT  -               
tcp     1336      0 localhost:9000          localhost:46668         ESTABLISHED -               
tcp        0      0 localhost:46648         localhost:9000          FIN_WAIT2   -               
tcp     1336      0 localhost:9000          localhost:46670         ESTABLISHED -               
tcp        9      0 localhost:9000          localhost:36108         CLOSE_WAIT  14274/php5-fpm  
tcp     1336      0 localhost:9000          localhost:46684         ESTABLISHED -               
tcp        0      0 localhost:46674         localhost:9000          ESTABLISHED 12909/nginx: worker
tcp     1336      0 localhost:9000          localhost:46666         ESTABLISHED -               
tcp     1257      0 localhost:9000          localhost:46648         CLOSE_WAIT  -               
tcp     1336      0 localhost:9000          localhost:46678         ESTABLISHED -               
tcp        0      0 localhost:46668         localhost:9000          ESTABLISHED 12909/nginx: wo             

Существует множество пар "CLOSE_WAIT" и "FIN_WAIT2", как показано ниже (в выводе выше):

tcp     1337      0 localhost:9000          localhost:46680         CLOSE_WAIT  -               
tcp        0      0 localhost:46680         localhost:9000          FIN_WAIT2   -

Обратите внимание на порт 46680 выше.

Я включил журнал ошибок медленных запросов mysql, но он не работал.

На данный момент перезапуск php5-fpm каждую минуту через cronjob (см. Команду ниже), чтобы все работало "гладко", но я ненавижу лоскутное одеяло и хочу решить эту проблему ...

1 * * * * service php5-fpm restart > /dev/null

Я много искал в Google - мне не помогли. Как уже упоминалось, это тест-сервер в локальной сети, загрузка ЦП никогда не пересекается 0,10, а использование памяти также ниже 25% (в системе установлено 2 ГБ ОЗУ и установлен Ubuntu-сервер). Так что, если вы считаете, что выручает мое время, выручите меня, пожалуйста, по крайней мере дайте намек.

Заранее спасибо за помощь.

-Rahul

(обратите внимание - это репост - http://forum.nginx.org/read.php?11,127694 )

Обновление: я нашел ответ, который размещен ниже.

rahul286
источник

Ответы:

31

Я нашел ответ на свое сообщение на форуме nginx - http://forum.nginx.org/read.php?2,127854

Ответ, в моем случае, должен установить:

request_terminate_timeout=30s

в конфиге php-fpm (обычно /etc/php5/fpm/php-fpm.conf)

Обратите внимание, что вы также можете использовать значения, отличные от 30.

Я использовал это, чтобы соответствовать моему значению в основном php.iniфайле, который:

max_execution_time = 30

Спасибо всем. :-)

rahul286
источник
5
Эту конфигурацию также можно найти в файле www.conf. Спасибо за ответ, хотя, кажется, это сработало.
eddiemoya
2
Это директива на уровне пула, вы получите сообщение об ошибке при попытке поместить ее в [global]раздел php-fpm.conf . Он работает там только в том случае, если у вас там есть настройки вашего пула. Также: request_terminate_timeout docs .
Танус
Если это правильный ответ, который мне ДЕЙСТВИТЕЛЬНО НУЖЕН, тогда эта пятница будет лучшей из 2015 года.
Филип
2
Я обнаружил, что помещение request_terminate_timeout=30sв мой php-fpm.confфайл вызвало ошибку (111 Connection Refused). Когда я переместил это в мой www.confфайл, это работало.
AJB
На CentOS 7.2 при использовании php7 request_terminate_timeout находится в: /etc/php-fpm.d/www.conf
nadavkav
16

Вот как это решило мою проблему:

внести следующие изменения в /etc/nginx/nginx.conf в http {section

proxy_connect_timeout  600s;
proxy_send_timeout  600s;
proxy_read_timeout  600s;
fastcgi_send_timeout 600s;
fastcgi_read_timeout 600s;

а затем перезапустите nginx

/etc/init.d/nginx restart

Виджай Кумар
источник
2
Да, это действительно не похоже на то, что это имеет какое-то отношение к проблеме человека, задающего вопрос.
HopelessN00b
3
но, к счастью, это то, что мне было нужно :)
Лучанинов
Это не решило мою проблему, но позволило мне увидеть фактическую ошибку вместо сообщения о тайм-ауте, что привело меня к реальной проблеме.
Майкл
4

Если вы используете php 5.3, увеличьте отставание.

Если вы используете php 5.2, сделайте бэкпорт патча, чтобы увеличить размер журнала с 128.

Кроме того, используйте сокет Unix, а не сокет TCP. unix: /tmp/php5-cgi.sock (или соответствующий путь)

karmawhore
источник
Я должен согласиться, особенно с использованием сокетов Unix.
Мэтт
Спасибо, Карма, за ответ. Я нашел решение в списке рассылки nginx.
rahul286
@ rahul286 что ответили? Я заинтересован!
Breiti
@breiti, см. мой ансер ниже - serverfault.com/a/179136/17440
rahul286
3

Большое спасибо

request_terminate_timeout = 30s

У меня отлично работает

но я должен был вставить строку в этом файле: "/etc/php5/fpm/pool.d/www.conf", то есть в разделе "Worker".

PHP 5.3.21-1 - Wordpress 3.5.1

http://php-fpm.org/wiki/Configuration_File

Franck
источник
У меня была комбинация факторов, которые в итоге приводили к ошибке 502, твой рецепт сделал магический трюк! большое спасибо!
Хорхе Висенте Мендоса,
2

в моем случае (то же самое сообщение об ошибке nginx) некоторые проблемные сценарии php не заканчиваются для выполнения и ожидают чего-то, что приводит к тому, что больше нет дочерних элементов php5-fpm для выбора nginx.

исправить:

  1. добавить срок выполнения других упомянутых в этом посте. request_terminate_timeout=30s
  2. поднять число детей. и все работало как шарм. pm.max_spare_servers=16 pm.min_spare_servers=2

теперь все работает как шарм.

C2H2
источник
У меня был длинный запрос внешнего подключения в моем сценарии php. Ищите эти длительные задачи и установите для них время ожидания.
Али Надализаде
1

У меня была та же проблема, и я решил ее, полностью удалив Apache:

yum remove httpd

После этого я рекомендую перезапустить PHP и NGINX:

/etc/init.d/nginx restart
/etc/init.d/php-fpm restart
Николай
источник
1
У нас тогда не было apache на нашем сервере. Рад знать ваше дело, так как оно может помочь нам в будущем.
rahul286
0

Для меня такая же проблема произошла после удаления rabbitmq с сервера. Ничто из вышеперечисленного не было бесполезным, переустановка всех модулей php5 решила проблему. У меня был Debian 8.2 на этом сервере. Надеюсь, будет полезно для кого-то.

Таггарт Комета
источник
-1

Это также может помочь людям:

В зависимости от ваших настроек, вы должны посмотреть параметры конфигурации fastcgi, а также php ... в моем случае (я использую apache2 + php5-fpm), а время max_execution также зависит от того, как долго модуль fastcgi ожидает ответа ( тайм-аут) ...

http://www.fastcgi.com/mod_fastcgi/docs/mod_fastcgi.html#FastCgiExternalServer

farinspace
источник
зачем использовать apache2 ?? Я имею в виду, что вы можете использовать nginx напрямую для взаимодействия с php5-fpm. Нет необходимости использовать Apache, когда у вас есть nginx!
rahul286
Если вы используете nginx, если другие НЕ используют nginx, надеюсь, это поможет им. :-) ... Я наткнулся на эту страницу в поисках вопроса, связанного с Apache2 + php5-
fpm
хорошо. Я думал, что вы используете Nginx с Apache для сценариев PHP, как некоторые люди использовали его в прошлом.
rahul286