Вопрос

Я должен поддерживать доисторический веб-сайт с тоннами кода Perl. После перехода к новому серверу вещи получили нечеткий:

Когда несколько запросов от одного и того же клиента работают на странице (генерирующие изображения с GD), эти скрипты перезаписывают переменные друг друга, что приводит к странным результатам.

как быстрый обходной путь, я устанавливаю maxrequestsperchild= 1 в Apache, который исправляет это, но теперь вещи замедляются до ползания ...

Есть ли способ отделить запросы? Любой mod_perl или параметры Apache, которые могут мне помочь?

apache:

Server version: Apache/2.2.15 (Unix)
Server built:   Apr  3 2014 23:56:16
Server's Module Magic Number: 20051115:25
Server loaded:  APR 1.3.9, APR-Util 1.3.9
Compiled using: APR 1.3.9, APR-Util 1.3.9
Architecture:   64-bit
Server MPM:     Prefork
  threaded:     no
    forked:     yes (variable process count)
.

perl -v

This is perl, v5.10.1 (*) built for x86_64-linux-thread-multi
.

Любое решение для этого было бы очень оценено :)


Редактировать: Я не смог найти правильный способ исправления вещей с MOD_PERL, но выполняется следующие обходные пути:

    .
  • Отключить mod_perl
  • enable mod_cgi
  • addhandler cgi-script .pl
  • Отключить suexec

Последний понравился, потому что он дал мне «преждевременного конца заголовков сценариев», когда Suexec был включен.

Это было полезно?

Решение

Нет, нет ничего, что вы не можете сделать, чтобы «отделить запросы». Все сценарии, работающие в одном процессе интерпретатора Perl, будут делиться одной и той же средой, а под MOD_PERL эта среда постоянная. Вы можете попробовать настроить ModPerl::Registry, чтобы запустить их в (если вы еще не имеете), которые должны обернуть их в собственном подпрограмме и устраняет некоторые проблемы пространства имен, но если сценарии не записаны на усмотрение (*) До сих пор придется изменить их хотя бы в некоторой степени.

http://perl.apache.org/docs/ 2.0 / User / Intro / start_fast.html # Registry_Scripts

Вы также можете записаться на проблему, когда сценарии используют определенные модули, такие как SOAP :: Lite, которые имеют глобальное состояние, которое распространяется на все модули, используя его, хотя это гораздо решающая проблема.

Так что нет, к сожалению, вы ничего не можете сделать, чтобы сценарии будут работать, хорошо, не меняя их. Некоторые могут быть в порядке, другие не будут. Вы, возможно, должны настроить регулярный сервер Apache CGI помимо отдельного сервера MOD_PERL и постепенно перенес их. Вы не получите производительность на регулярном сервере CGI, но у вас также не будут проблем.

(*), в частности, и это из памяти из многих, множеких лун назад, они должны избегать установки глобальных переменных, всегда объявляют переменные с помощью my, используйте модуль CGI (или MOD_PERL API) для взаимодействия на запросе, и такие вещи, как это.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top