Предотвратить тайм-аут шлюза nginx 504 с помощью PHP set_time_limit ()


117

Я получаю сообщение о 504 тайм-аутах от nginx, когда мой PHP-скрипт работает дольше обычного. set_time_limit(0)похоже, этому не мешает! Не работает при запуске php5-fpm на nginx? Если да, то как правильно установить срок?

Ошибка:

504 Gateway Time-out
nginx/1.2.7

Ответы:


194

Есть несколько способов установить тайм-аут для php-fpm. В /etc/php5/fpm/pool.d/www.confя добавил эту строку:

request_terminate_timeout = 180

Кроме того, в /etc/nginx/sites-available/defaultблоке местоположения рассматриваемого сервера я добавил следующую строку:

fastcgi_read_timeout 180;

Весь блок локации выглядит так:

location ~ \.php$ {
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_index index.php;
    fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_read_timeout 180;
    include fastcgi_params;
} 

Теперь просто перезапустите php-fpm и nginx, и больше не должно быть тайм-аутов для запросов, занимающих менее 180 секунд.


2
Если кому-то еще интересно, по умолчанию для моего (nginx + php5-fpm) было 60 секунд, поэтому, если вы видите «таймаут шлюза» для скрипта @ 60 секунд, следует добавить настройку «fastcgi_read_timeout»
Майкл Нгуен

1
Я пытался понять это в течение нескольких дней, и ответ @pymkin - это то, что сработало для меня. Для других любителей, таких как я, которые задаются вопросом, как перезапустить nginx и php5-fpm, выполните следующие две команды: sudo service nginx restart и sudo service php5-fpm restart Единственное, что я сделал иначе, так это то, что я применил эти настройки только к одному из мои сайты, а не конфигурация для всех сайтов на моем сервере.
Памела

4
К сожалению, независимо от того, что я установил fastcgi_read_timeoutв этом locationблоке, он все равно отключается через 60 секунд.
Спенсер Уильямс,

это должен быть принятый ответ. пробовал так много решений, но только это работает. Я использовал усадьбу laravel и имел ошибку тайм-аута шлюза 504, и это исправило ее.
Anbu369

Если вы используете Laravel, вам нужно установить это в locationблоке, который обрабатывает скрипты php, а не в docroot.
Райан Дюваль

50

Попробуйте эту ссылку , у нее есть лучшее решение, как это исправить. Итак, шаги следующие:

  1. Откройте ваш nginx.confфайл, расположенный в /etc/nginxкаталоге.
  2. Добавьте этот фрагмент кода ниже в http {раздел:

    client_header_timeout 3000;
    client_body_timeout 3000;
    fastcgi_read_timeout 3000;
    client_max_body_size 32m;
    fastcgi_buffers 8 128k;
    fastcgi_buffer_size 128k;

    Примечание. Если он уже присутствует, измените значения соответственно.

  3. Перезагрузите Nginx и php5-fpm.

    $ service nginx reload
    $ service php5-fpm reload

    Если ошибка повторяется, подумайте об увеличении значений.


1
Это не заставляет искать причину, а просто увеличивает время до ошибки. Но лучше было бы найти решение, почему он так долго загружается. Когда я на локальном хосте, я единственный клиент, и он загружается так долго, что вообще не стоит ждать, пока разрабатывается.
Darius.V 07

16
Вопрос не в причине медленного скрипта, а в том, чтобы заставить сервер ждать дольше. Иногда нужно запускать специальные скрипты, которые выполняют задачи, которые занимают очень много времени, и это неплохо.
orrd

Обновленная (см. Выше) ссылка: codetweet.com/nginx/…
nadavkav

2
Для тех, кто задается вопросом, что законно займет столько времени, это может быть, например, сценарий установки из веб-интерфейса, который пытается установить соединение с базой данных, а затем создает множество исходных таблиц и заполняет их данными .. которые ответ может занять некоторое время.
IMME

Имейте в виду, что эти глобальные настройки будут переопределены настройками для каждого сайта в /etc/nginx/sites-available/mysite.com.
Mac,

11

Вы не можете использовать PHP для предотвращения тайм-аута, выдаваемого nginx.

Чтобы настроить nginx на дополнительное время, см. proxy_read_timeoutДирективу .


Это решило проблему, с которой я столкнулся, когда 504-е начали появляться на моем бродячем ящике (с использованием vaprobash).
Энди Флеминг

2
Я считаю, что этот ответ применим только в том случае, если вы просто используете Nginx в качестве прокси-сервера. Это не сработает, если вы используете Nginx в качестве основного веб-сервера (с PHP-FPM).
orrd 02

10

Правильный ответ - увеличить fastcgi_read_timeout в вашей конфигурации Nginx.
Просто как тот!


7
 sudo nano /etc/nginx/nginx.conf

Добавьте эти переменные в файл nginx.conf:

http {  
  # .....
  proxy_connect_timeout       600;
  proxy_send_timeout          600;
  proxy_read_timeout          600;
  send_timeout                600;
}

А затем перезапустите:

service nginx reload

4

В этом случае могут возникнуть три типа тайм-аутов. Видно, что каждый ответ сосредоточен только на одном аспекте этих возможностей. Итак, я решил записать это, чтобы кому-то, кто посетит здесь в будущем, не нужно было случайным образом проверять каждый ответ и получать успех, не зная, какой из них сработал.

  1. Тайм-аут запроса от запрашивающей стороны - необходимо установить заголовок тайм-аута (см. Конфигурацию заголовка в запрашивающей библиотеке)
  2. Тайм-аут от nginx при выполнении запроса (перед перенаправлением на прокси-сервер), например: загружается огромный файл
  3. Тайм-аут после пересылки на прокси-сервер , сервер не отвечает вовремя обратно nginx. например: трудоемкие скрипты, запущенные на сервере

Итак, исправления для каждой проблемы следующие.

  1. установить заголовок тайм-аута, например: в ajax

$.ajax({
    url: "test.html",
    error: function(){
        // will fire when timeout is reached
    },
    success: function(){
        //do something
    },
    timeout: 3000 // sets timeout to 3 seconds
});

  1. Тайм-аут клиента nginx

    http{
         #in seconds
        fastcgi_read_timeout 600;
        client_header_timeout 600;
        client_body_timeout 600;
     }
  2. Тайм-аут прокси-сервера nginx

    http{
      #Time to wait for the replying server
       proxy_read_timeout 600s;
    
    }

Так что используйте тот, который вам нужен. Может быть, в некоторых случаях вам понадобятся все эти конфигурации. Мне было нужно.


1

Вам нужно добавить дополнительную директиву nginx (для ngx_http_proxy_module) nginx.conf, например:

proxy_read_timeout 300;

В основном proxy_read_timeoutдиректива nginx изменяет тайм-аут прокси, FcgidIOTimeoutэто для скриптов, которые слишком долго тихие, иFcgidBusyTimeout для сценариев, выполнение которых занимает слишком много времени.

Также, если вы используете приложение FastCGI, также увеличьте эти параметры:

FcgidBusyTimeout 300
FcgidIOTimeout 250

Затем перезагрузите nginx и PHP5-FPM.

Plesk

В панели управления Plesk, вы можете добавить его в настройках веб - сервера под дополнительные директивы Nginx .

Для проверки FastCGI в настройках веб - сервера под дополнительные директивы для HTTP .

См .: Как исправить проблемы с тайм-аутом FastCGI в Plesk?


Разве FcgidBusyTimeoutпеременная не существует только для Apache?
Slavik

0

Поскольку вы используете php-fpm, вам следует воспользоваться функцией fastcgi_finish_request () для обработки запросов, которые, как вы знаете, могут занять больше времени.


-1

С помощью set_time_limit(0) бесполезно при использовании php-fpm или подобного диспетчера процессов.

Нижняя строка не используется set_time_limitпри использовании php-fpm, чтобы увеличить время ожидания выполнения, проверьте это руководство .


8
может быть предоставлено некоторое объяснение ответа здесь, а также этот ответ может стать устаревшим, если срок действия ссылки истечет.
Lakshmi

-7

Решаю эту проблему конфигом APACHE! Все методы (в этой теме) мне некорректны ... Потом пробую chanche apache config:

Timeout 3600

Тогда мой сценарий заработал!


5
В вопросе говорится о nginx, если у вас проблемы с apache, вам следует поискать его.
hogan

Вопрос в Nginx и php-fpm, а не в Apache.
Кевин Кабуру 03
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.