Nginx, PHP-fpm и таймауты

Многих из нас интересует работа Nginx в паре с PHP-fpm и то, почему процессы прерываются а ошибок нет, я попробую рассказать об этом.

1. Укажим количество секунд, которое будет ждать Nginx от PHP-fpm:

server {
    ...
    location ~ ^/app\.php(/|$) {
        ...
        fastcgi_read_timeout 3;
    }
}

2. В файл /etc/php5/fpm/php-fpm.conf добавляем таймауты нашего пула:

[site-local]

request_slowlog_timeout = 5s
request_terminate_timeout = 30s

3. Создаем PHP-файл /var/www/site/web/app.php с следующим содержимым:

<?php
$sleep = 0;
while($sleep < 35){
    $sleep++;
    sleep(1);
    file_put_contents('/var/www/site/sleep.log', $sleep.PHP_EOL, FILE_APPEND);
}

4. Выполняем запрос к нашему сайту:

curl -i http://site.local/info.json
HTTP/1.1 504 Gateway Time-out
Server: nginx/1.9.3 (Ubuntu)
Date: Wed, 27 Apr 2016 16:58:17 GMT
Content-Type: text/html
Content-Length: 191
Connection: keep-alive

<html>
<head><title>504 Gateway Time-out</title></head>
<body bgcolor="white">
<center><h1>504 Gateway Time-out</h1></center>
<hr><center>nginx/1.9.3 (Ubuntu)</center>
</body>
</html>

как видите, сработала настройка fastcgi_read_timeout.

5. Смотрим на то, что происходит в PHP-fpm:

# /usr/sbin/php5-fpm
[27-Apr-2016 16:56:35] NOTICE: fpm is running, pid 98
[27-Apr-2016 16:56:35] NOTICE: ready to handle connections
[27-Apr-2016 16:56:35] NOTICE: systemd monitor interval set to 10000ms

Обратите внимание, сработала php-fpm настройка request_slowlog_timeout:

[27-Apr-2016 16:58:16] ERROR: failed to ptrace(ATTACH) child 100: Operation not permitted (1)
[27-Apr-2016 16:58:16] WARNING: [pool site-local] child 100, script '/var/www/site/web/app.php' (request: "GET /app.php") executing too slow (5.385329 sec), logging

но, PHP-fpm-процесс все еще живет и выполняется (если в нем появляются ошибки, они будут записаны в логи).

Теперь внимание, сработала php-fpm настройка request_terminate_timeout:

[27-Apr-2016 16:58:44] WARNING: [pool site-local] child 100, script '/var/www/site/web/app.php' (request: "GET /app.php") execution timed out (30.382169 sec), terminating
[27-Apr-2016 16:58:44] WARNING: [pool site-local] child 100 exited on signal 15 (SIGTERM) after 129.988014 seconds from start

Все, после этой строки никаких ошибок Вы не увидите, т.к. PHP-fpm-процесс, обслуживающий запрос под номером 100, был убит.

Делаем вывод господа:

  1. В реальном проекте таймаут-параметры Nginx и PHP-fpm должны быть одинаковы
  2. Собирайте статистику выполнения Nginx-запросов и если они достигают или превышают лимиты - оптимизируйте сайт или увеличивайте лимиты :) 

Удачки.

p.s. Если request_terminate_timeout сработает раньше чем fastcgi_read_timeout, то nginx выдаст: 502 Bad Gateway

Оцени публикацию:
  • 1,5
Оценили человек: 1

Похожие статьи:

Справочники и учебники:


Предложения и пожелания:
Ваше имя:
Ваш E-mail:
Введите изображенные цифры:
Captcha
Главная
X

youtube.com/watch?v=7hFivbgIEqk

При полном или частичном использовании материалов данного сайта, ссылка на сайт "yapro.ru" обязательна как на источник информации.
Автоматический импорт материалов и информации с сайта запрещен.
Copyrights © 2007 - 2017 YaPro.Ru

Главная » Веб-мастеру » PHP »