Во-первых, я искал и читал много SO и других сайтов. Я перепробовал все, но, тем не менее, это случилось.
У меня есть несколько длительных запросов для частного сайта. Некоторые запросы занимают более 2 минут. Я использую PHP 7.2.19
с ОС Ubuntu 19.04
, NGINX 1.15.9
.
Вот настройки, которые я изменил.
/ etc / php / 7.2 / fpm / php. ini: max_execution_time = 300
/ etc / php / 7.2 / fpm / pool.d / www.conf: request_terminate_timeout = 300
/ etc / nginx / sites-available / default:
client_header_timeout 300;
keepalive_timeout 300;
client_body_timeout 300;
send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_send_timeout 300;
fastcgi_connect_timeout 300;
По сути, все меняется на 5 минут, но все равно я получаю Gateway timeout
через 30 секунд.
Я пробовал Firefox на своем рабочем столе и Safari на iOS. Оба имеют одинаковую проблему, поэтому я не думаю, что это связано с тайм-аутом моего браузера.
Ответ имеет следующие заголовки и текст. Как ни странно, в заголовках нет никаких признаков PHP или NGNIX. Это не имеет смысла для меня, так как я ожидаю, что обе они отправят свои версии даже при истечении времени ожидания.
Заголовки тайм-аута:
HTTP/1.1 504 Gateway Timeout
Content-Type: text/html; charset=UTF-8
Content-Length: 219
Тело HTML тайм-аута:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>504</title>
<meta http-equiv="Cache-Control" content="no-cache"/>
</head>
<body>
<p>
Gateway Timeout
</p>
</body>
</html>
Я не могу найти причину этого тайм-аута. Кажется, все в порядке, кроме результата, конечно:)
Наконец, я вижу 499 кодов состояния в журнале доступа NGINX, когда происходит тайм-аут. После прочтения я выяснил, что это означает, что клиенты закрыли соединение, но второй ответ здесь упоминает, что client может означать сервер FCGI, а не обязательно браузер.
Код моего приложения для этой страницы выполняет множество внутренних HTTP-запросов к одному и тому же коду, используя Guzzle, и выполняет тот же NGINX. Дело в том, что даже после того, как тайм-аут произошел в браузере, через некоторое время я вижу, что внутренние запросы регистрируются с кодом состояния 200, что означает, что мое приложение все еще выполняет код! Даже журналы приложений показывают, что оно все еще работает, хотя браузер показал тайм-аут.
Я так запутался, где искать дальше.