nginx периодически отдаёт 404 на тяжёлых скриптах
Всем привет!
В общем, nginx периодически отваливается на тяжёлых скриптах.
Т.е. есть у меня сниппет, который ресайзит одну (но большую) картинку. И раз-через-раз страница открывается с 404 ошибкой. При чём я бы понял, если бы дело было в таймаутах, но тут ведь как — nginx может через 2 секунды отдать 404, а может думать секунд 10 и потом спокойно открыть страничку с отресайзенной картинкой. Магия.
Может быть дело в памяти? Только вот что конкретно регулировать? Может кто подскажет?
p.s. код ресайза (здесь всё стандартно, через phpThumb, и особо смысла в себе не несёт, но на всякий случай):
p.p.s. проблема именно в этом месте, а не в других сниппетах 100%.
p.p.p.s. гугление ничего толком не дало.
В общем, nginx периодически отваливается на тяжёлых скриптах.
Т.е. есть у меня сниппет, который ресайзит одну (но большую) картинку. И раз-через-раз страница открывается с 404 ошибкой. При чём я бы понял, если бы дело было в таймаутах, но тут ведь как — nginx может через 2 секунды отдать 404, а может думать секунд 10 и потом спокойно открыть страничку с отресайзенной картинкой. Магия.
Может быть дело в памяти? Только вот что конкретно регулировать? Может кто подскажет?
p.s. код ресайза (здесь всё стандартно, через phpThumb, и особо смысла в себе не несёт, но на всякий случай):
function phpThumbRender ($source, $dest, $options = array()) {
$this->phpThumb->setSourceFilename($source);
foreach ($options as $k => $v) {
$this->phpThumb->setParameter($k, $v);
}
if ($this->phpThumb->GenerateThumbnail()) {
if ($this->phpThumb->RenderToFile($dest)) {
return $dest;
} else {
// $modx->log(...);
return false;
}
} else {
// $modx->log(...);
return false;
}
// $modx->log(...);
return false;
}
p.p.s. проблема именно в этом месте, а не в других сниппетах 100%.
p.p.p.s. гугление ничего толком не дало.
Комментарии: 8
Странно. Он должен отдавать 502 при ошибке скрипта, а не 404.
У тебя, случаем, скрипт потом не редиректит юзера прям на картинку, которую не смог сделать?
У тебя, случаем, скрипт потом не редиректит юзера прям на картинку, которую не смог сделать?
Точно, 502 вторую отдаёт (мой косяк, в конфиге была прописана кастомная страница 50x-ошибок, которая физически не существует, вот он 404 и показывал.)
Редиректа на картинку нет. Выводится через
Справедливости ради, картинка не только ресайзится — к ней накладывается тень через imagemagick. Но всё-равно — падает-то через раз и с разными (и нелогичными) таймаутами.
Редиректа на картинку нет. Выводится через
<img src="{$result}">
Картинка не очень-то и большая — 2000x2000px. А когда буду в цикле гонять штук по 10-20 — то вообще ничего работать не будет.Справедливости ради, картинка не только ресайзится — к ней накладывается тень через imagemagick. Но всё-равно — падает-то через раз и с разными (и нелогичными) таймаутами.
Ну, хотя бы понятно, что дело не в nginx и никакого 404 там нет — тему желательно переименовать.
Ну а дальше только пытаться понять, почему он падает по-разному. Пиши лог ошибок и замеряй время, авось чего и увидишь.
С хостингом всё в порядке?
Ну а дальше только пытаться понять, почему он падает по-разному. Пиши лог ошибок и замеряй время, авось чего и увидишь.
С хостингом всё в порядке?
Наблюдаю через htop.
Нагрузка на процессор 0-3%, свободной памяти 60МБ.
Когда обновляю страницу со сниппетом, то
Нагрузка на процессор — 100%, память отжирается вся. В этот момент и отдаёт 502.
В те моменты, когда памяти хватает, то страница загружается.
Печаль-беда. Не думал я, что отресайзить и наложить тенюшку — это такая жесть в плане производительности.
Блин, у меня последняя надежда — может это потому, что наложение тени (на уже уменьшенную картинку) через imagemagick я запускаю через exec? да-да, exec не отключен
Иначе это вообще какая-то жесть получается.
Я помню, ты давно писал, в каком-то плагине для ресайза ты использовал не phpThumb с GD, а именно imagemagick. У тебя же всё хорошо с ним было? Я чёт найти ту заметку не могу.
Нагрузка на процессор 0-3%, свободной памяти 60МБ.
Когда обновляю страницу со сниппетом, то
Нагрузка на процессор — 100%, память отжирается вся. В этот момент и отдаёт 502.
В те моменты, когда памяти хватает, то страница загружается.
Печаль-беда. Не думал я, что отресайзить и наложить тенюшку — это такая жесть в плане производительности.
Блин, у меня последняя надежда — может это потому, что наложение тени (на уже уменьшенную картинку) через imagemagick я запускаю через exec? да-да, exec не отключен
$cmdAddShadow = "convert {$src} \( +clone -background none -shadow {$config['opacity']}x{$config['size']}{$config['offsetLeft']}{$config['offsetTop']} \) \+swap -background none -layers merge +repage -mosaic $dest";
exec($cmdAddShadow);
Может имеет смысл поставить php-библиотеку и тогда всё будет хорошо?Иначе это вообще какая-то жесть получается.
Я помню, ты давно писал, в каком-то плагине для ресайза ты использовал не phpThumb с GD, а именно imagemagick. У тебя же всё хорошо с ним было? Я чёт найти ту заметку не могу.
phpThumb сам юзает Imagemagick, если может.
modx.pro/howto/3444-the-imposition-of-the-watermark-in-ms2gallery/
modx.pro/development/619-working-with-phpthumb/
modx.pro/howto/3444-the-imposition-of-the-watermark-in-ms2gallery/
modx.pro/development/619-working-with-phpthumb/
В общем, поставил, нагрузка на процессор в момент генерации уменьшилась, но не сильно. Но сейчас хотя бы страница не отваливается постоянно, уже радует.
Но блин. Пора мне с моим везением что-то делать.
Я от phpThumbs'а ничего, кроме ресайза, добиться не могу. Т.е. вообще!
Простой кофиг:
Я уж как только не пробовал комментировать эти параметры — вообще без результатно, только ресайз работает.
Ладно, думаю, верну всё как было, мало ли. Удалил php5-imagick, чтобы через gd работало и… ничего не изменилось. Т.е. как был ресайз, так он и остался — единственным работающим.
Вроде уж 2.2.15 стоит, казалось бы, ан нет. Я уж и не знаю( Надо руковыпрямитель на алиэкспрессе посмотреть, вдруг продают.
upd. php5-fpm перезапускал
Но блин. Пора мне с моим везением что-то делать.
Я от phpThumbs'а ничего, кроме ресайза, добиться не могу. Т.е. вообще!
Простой кофиг:
array(
'fltr' => array(
'drop|1|1|000000|5',
'gblr|20',
),
'f' => 'png',
'w' => 400,
'h' => 400
)
А ничего, кроме ресайза не применяется. Png'шным файл не становится; какой бы радиус размытия не устанавливал — всё одинаково; тени нет вообще.Я уж как только не пробовал комментировать эти параметры — вообще без результатно, только ресайз работает.
Ладно, думаю, верну всё как было, мало ли. Удалил php5-imagick, чтобы через gd работало и… ничего не изменилось. Т.е. как был ресайз, так он и остался — единственным работающим.
Вроде уж 2.2.15 стоит, казалось бы, ан нет. Я уж и не знаю( Надо руковыпрямитель на алиэкспрессе посмотреть, вдруг продают.
upd. php5-fpm перезапускал
Алексей, здравствуйте. Хотел задать вам вопрос по вашему профилю и, если вам будет интересно, предложить оптимизацию моего проекта. Пожалуйста, постучитесь мне в скайп: Zveropanda.
Здравствуйте! Завтра напишу, пообщаемся. Сегодня уже работать закончил
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.