nginx периодически отдаёт 404 на тяжёлых скриптах

Всем привет!

В общем, 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. гугление ничего толком не дало.
Алексей Карташов
24 сентября 2014, 10:19
modx.pro
2 079
0

Комментарии: 8

Василий Наумкин
24 сентября 2014, 14:41
0
Странно. Он должен отдавать 502 при ошибке скрипта, а не 404.

У тебя, случаем, скрипт потом не редиректит юзера прям на картинку, которую не смог сделать?
    Алексей Карташов
    24 сентября 2014, 14:59
    0
    Точно, 502 вторую отдаёт (мой косяк, в конфиге была прописана кастомная страница 50x-ошибок, которая физически не существует, вот он 404 и показывал.)

    Редиректа на картинку нет. Выводится через
    <img src="{$result}">
    Картинка не очень-то и большая — 2000x2000px. А когда буду в цикле гонять штук по 10-20 — то вообще ничего работать не будет.

    Справедливости ради, картинка не только ресайзится — к ней накладывается тень через imagemagick. Но всё-равно — падает-то через раз и с разными (и нелогичными) таймаутами.
      Василий Наумкин
      24 сентября 2014, 15:02
      0
      Ну, хотя бы понятно, что дело не в nginx и никакого 404 там нет — тему желательно переименовать.

      Ну а дальше только пытаться понять, почему он падает по-разному. Пиши лог ошибок и замеряй время, авось чего и увидишь.

      С хостингом всё в порядке?
        Алексей Карташов
        24 сентября 2014, 15:16
        0
        Наблюдаю через htop.
        Нагрузка на процессор 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. У тебя же всё хорошо с ним было? Я чёт найти ту заметку не могу.
          Василий Наумкин
          24 сентября 2014, 15:19
          0
            Алексей Карташов
            24 сентября 2014, 16:36
            0
            В общем, поставил, нагрузка на процессор в момент генерации уменьшилась, но не сильно. Но сейчас хотя бы страница не отваливается постоянно, уже радует.

            Но блин. Пора мне с моим везением что-то делать.
            Я от 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 перезапускал
    xtbox
    24 сентября 2014, 18:44
    0
    Алексей, здравствуйте. Хотел задать вам вопрос по вашему профилю и, если вам будет интересно, предложить оптимизацию моего проекта. Пожалуйста, постучитесь мне в скайп: Zveropanda.
      Алексей Карташов
      24 сентября 2014, 19:43
      0
      Здравствуйте! Завтра напишу, пообщаемся. Сегодня уже работать закончил
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      8