Código Perl legado e Apache2
-
21-12-2019 - |
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.
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.