Pregunta

Tengo que mantener un sitio web prehistórico con toneladas de código Perl.Después de pasar a un nuevo servidor, las cosas se pusieron confusas:

Cuando se ejecutan varias solicitudes del mismo Cliente en una página (generando imágenes con GD), esos scripts sobrescriben las variables de los demás, lo que genera resultados extraños.

Como solución rápida, configuré MaxRequestsPerChild=1 en Apache, lo que soluciona este problema, pero ahora las cosas se han ralentizado...

¿Hay alguna manera de separar las solicitudes?¿Algún parámetro mod_perl o Apache que pueda ayudarme?

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

Cualquier solución para esto sería muy apreciada :)


EDITAR:No pude encontrar una manera adecuada de arreglar las cosas con mod_perl, pero la siguiente solución funciona:

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

El último era necesario porque me daba un "final prematuro de los encabezados del script" cuando se habilitaba suEXEC.

¿Fue útil?

Solución

No, no hay nada que puedas hacer para "separar las solicitudes".Todos los scripts que se ejecutan en un único proceso de intérprete de Perl compartirán el mismo entorno y, bajo mod_perl, ese entorno es persistente.Puedes intentar configurar ModPerl::Registry para ejecutarlos (si aún no lo ha hecho), lo que debería incluirlos en su propia subrutina y eliminar algunos de los problemas de espacio de nombres, pero si los scripts no están escritos teniendo en cuenta la persistencia (*), todavía tendrá modificarlos al menos en cierta medida.

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

También puede tener problemas cuando los scripts usan módulos particulares como SOAP::Lite, que tienen un estado global que se comparte entre todos los módulos que lo usan, aunque ese es un problema mucho más raro.

Entonces no, desafortunadamente no hay nada que puedas hacer para asegurar que los scripts funcionen bien sin cambiarlos.Algunos pueden estar bien, otros no.Quizás debería configurar un servidor Apache CGI normal además del servidor mod_perl separado y migrarlos gradualmente.No obtendrá el rendimiento del servidor CGI normal, pero tampoco tendrá problemas.

(*) En particular, y esto es de memoria de hace muchas, muchas lunas, deben evitar establecer variables globales, declarar siempre variables con my, use el módulo CGI (o API mod_perl) para solicitar interacción y cosas así.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top