Pergunta

Eu tenho que manter um site pré-histórico com toneladas de código Perl.Depois de mudar para um novo servidor, as coisas ficaram confusas:

Quando múltiplas solicitações do mesmo Cliente estão sendo executadas em uma página (gerando imagens com GD), esses scripts sobrescrevem as variáveis ​​uns dos outros, levando a resultados estranhos.

Como uma solução rápida, configurei MaxRequestsPerChild=1 no Apache, o que corrige isso, mas agora as coisas estão lentas para um rastreamento ...

Existe uma maneira de separar as solicitações?Algum parâmetro mod_perl ou Apache que possa me ajudar?

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

Qualquer solução para isso seria muito apreciada :)


EDITAR:Não consegui encontrar uma maneira adequada de consertar as coisas com mod_perl, mas a seguinte solução alternativa funciona:

  • Desativar mod_perl
  • Habilitar mod_cgi
  • AddHandler cgi-script.pl
  • Desativar suEXEC

O último foi necessário porque me deu 'fim prematuro de cabeçalhos de script' quando o suEXEC foi ativado.

Foi útil?

Solução

Não, não há nada que você possa fazer para "separar as solicitações".Todos os scripts executados em um único processo interpretador Perl compartilharão o mesmo ambiente, e no mod_perl esse ambiente é persistente.Você pode tentar configurar ModPerl::Registry para executá-los (se ainda não o fez), o que deve envolvê-los em sua própria sub-rotina e eliminar alguns dos problemas de namespace, mas se os scripts não forem escritos com persistência em mente (*), você ainda terá modificá-los pelo menos até certo ponto.

http://perl.apache.org/docs/2.0/user/intro/start_fast.html#Registry_Scripts

Você também pode ter problemas quando os scripts usam módulos específicos, como SOAP::Lite, que possuem um estado global que é compartilhado por todos os módulos que o utilizam, embora esse seja um problema muito mais raro.

Então não, infelizmente não há nada que você possa fazer para garantir que os scripts funcionarão bem sem alterá-los.Alguns podem estar bem, outros não.Talvez você deva configurar um servidor Apache CGI regular além do servidor mod_perl separado e migrá-los gradualmente.Você não obterá o desempenho no servidor CGI normal, mas também não terá problemas.

(*) Em particular, e isto vem da memória de muitas, muitas luas atrás, eles devem evitar definir variáveis ​​globais, sempre declarar variáveis ​​com my, use o módulo CGI (ou API mod_perl) para interação de solicitação e coisas assim.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top