Question

Je dois maintenir un site Web préhistorique avec des tonnes de code Perl.Après avoir migré vers un nouveau serveur, les choses sont devenues floues :

Lorsque plusieurs requêtes du même client sont exécutées sur une page (génération d'images avec GD), ces scripts écrasent les variables les uns des autres, conduisant à des résultats étranges.

Comme solution de contournement rapide, j'ai défini MaxRequestsPerChild=1 dans Apache, ce qui corrige ce problème, mais maintenant les choses sont ralenties jusqu'à l'exploration...

Existe-t-il un moyen de séparer les demandes ?Des paramètres mod_perl ou Apache qui pourraient m'aider ?

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

Toute solution pour cela serait grandement appréciée :)


MODIFIER:Je n'ai pas trouvé de moyen approprié de résoudre les problèmes avec mod_perl, mais la solution suivante fonctionne :

  • Désactiver mod_perl
  • Activer mod_cgi
  • AddHandler cgi-script .pl
  • Désactiver suEXEC

Le dernier était nécessaire car il m'a donné une « fin prématurée des en-têtes de script » lorsque suEXEC était activé.

Était-ce utile?

La solution

Non, vous ne pouvez rien faire pour « séparer les demandes ».Tous les scripts exécutés dans un seul processus interpréteur Perl partageront le même environnement, et sous mod_perl, cet environnement est persistant.Vous pouvez essayer de configurer ModPerl::Registry pour les exécuter (si vous ne l'avez pas déjà fait), ce qui devrait les envelopper dans leur propre sous-programme et éliminer certains problèmes d'espace de noms, mais si les scripts ne sont pas écrits dans un souci de persistance (*), vous aurez toujours de les modifier, au moins dans une certaine mesure.

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

Vous pouvez également rencontrer des problèmes lorsque les scripts utilisent des modules particuliers tels que SOAP::Lite qui ont un état global partagé entre tous les modules qui l'utilisent, bien que ce soit un problème beaucoup plus rare.

Donc non, malheureusement, vous ne pouvez rien faire pour garantir que les scripts fonctionneront correctement sans les modifier.Certains pourraient aller bien, d’autres non.Vous devriez peut-être configurer un serveur Apache CGI classique en plus du serveur mod_perl séparé et les migrer progressivement.Vous n'obtiendrez pas les performances du serveur CGI classique, mais vous n'aurez pas non plus de problèmes.

(*) En particulier, et cela vient de mémoire d'il y a de très nombreuses lunes, ils doivent éviter de définir des variables globales, toujours déclarer les variables avec my, utilisez le module CGI (ou l'API mod_perl) pour l'interaction des requêtes, et des choses comme ça.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top