Запобігання тайм-ауту шлюзу nginx 504 за допомогою PHP set_time_limit ()


116

Я отримую повідомлення від nginx 504 timeouts, коли мій скрипт PHP працює довше, ніж зазвичай. set_time_limit(0)схоже, це не заважає! Це не працює при запуску php5-fpm на nginx? Якщо так, то який правильний спосіб встановити обмеження часу?

Помилка:

504 Gateway Time-out
nginx/1.2.7

Відповіді:


193

Існує кілька способів встановити час очікування для php-fpm. У /etc/php5/fpm/pool.d/www.confI додали цей рядок:

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 секунд, тому якщо ви бачите "timeout timeway" для сценарію через 60 секунд, слід додати налаштування "fastcgi_read_timeout"
Michael Nguyen

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.
Ryan DuVal

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
Це не змушує знайти причину, вона просто збільшується в рази до помилки. Але краще було б знайти рішення, чому він так довго завантажується. Коли я локальний, я єдиний клієнт, і він завантажується так довго, що зовсім не добре чекати, поки розвиваємося.
Дарій.V

16
Питання не вказує на причину повільного сценарію, а про спосіб, як змусити сервер чекати довше. Іноді потрібно запускати спеціальні сценарії, які виконують завдання, що займають дуже багато часу, і це не погано.
orrd

Оновлене (вище) посилання: codetweet.com/nginx/…
nadavkav

2
Для тих, кому може бути цікаво, що законно забирає стільки часу, це може бути, наприклад, інсталяційний скрипт із веб-інтерфейсу, який намагається встановити з'єднання з базою даних, а потім створює безліч початкових таблиць і заповнює його даними .. може пройти досить багато часу, перш ніж відповідь.
imme

Майте на увазі, що ці глобальні налаштування будуть замінені налаштуваннями для кожного сайту в /etc/nginx/sites-available/mysite.com.
Мак

11

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

Щоб налаштувати nginx, щоб дозволити більше часу, дивіться proxy_read_timeoutдирективу .


Це вирішило проблему, з якою я стикався, коли 504-ті почали відображатися на моїй бродячій коробці (використовуючи вапробаш).
Енді Флемінг

2
Я вважаю, що ця відповідь застосовується лише в тому випадку, якщо ви просто використовуєте Nginx як проксі-сервер. Це не буде працювати, якщо ви використовуєте Nginx як основний веб-сервер (з PHP-FPM).
orrd

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 (for 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 ви можете додати його в Налаштування веб-сервера в розділі Додаткові директиви nginx .

Для FastCGI перевірте в Налаштуваннях веб-сервера під Додатковими директивами для HTTP .

Див.: Як виправити проблеми з очікуванням FastCGI в Плеску?


Чи не FcgidBusyTimeoutіснує змінна лише для Apache?
Славік

0

Оскільки ви використовуєте php-fpm, ви повинні скористатися fastcgi_finish_request () для обробки запитів, які, як ви знаєте, можуть зайняти більше часу.


-1

Використання set_time_limit(0)марно під час використання php-fpm або подібного менеджера процесів.

Підсумок не використовується set_time_limitпід час використання php-fpm, щоб збільшити час очікування виконання, перевірте цей підручник .


8
тут можна дати пояснення відповіді, а також ця відповідь може застаріти, якщо термін дії посилання закінчиться.
Лакшмі

-7

Я вирішую цю проблему з конфігурацією APACHE! Усі методи (у цій темі) для мене неправильні ... Тоді я спробую chanche apache config:

Timeout 3600

Тоді мій сценарій спрацював!


5
У запитанні йдеться про nginx, якщо у вас проблеми з apache, вам слід шукати це.
hogan

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