Question

Je possède une ancienne application python écrite en tant que CGI. Jusqu'à présent, cela fonctionnait bien, mais le nombre d'utilisateurs simultanés augmentera considérablement dans un avenir très proche. Ici sur SO, j'ai lu: "CGI est idéal pour les sites Web à faible trafic, mais il présente des problèmes de performances pour toute autre chose". Je sais qu'il aurait été préférable de commencer d'une autre manière, mais CGI est ce qu'il est maintenant.

Quelqu'un pourrait-il m'indiquer comment garder le CGI performant sans avoir à réécrire tout le code?

Était-ce utile?

La solution

CGI ne s'adapte pas car chaque requête demande un tout nouveau processus serveur. C'est beaucoup de frais généraux. mod_wsgi évite la surcharge en forçant un processus et en transmettant des demandes à ce processus en cours d'exécution.

Supposons que l'application est le pire type de cgi.

Le pire des cas est qu'il contient des fichiers comme celui-ci.

my_cgi.py

import cgi
print "status: 200 OK"
print "content-type: text/html"
print
print "<!doctype...>"
print "<html>"
etc.

Vous pouvez essayer de "boucler" et de les fichiers CGI d'origine pour le rendre wsgi.

wsgi.py

import cStringIO
def my_cgi( environ, start_response ):
    page = cStringIO.StringIO()
    sys.stdout= page
    os.environ.update( environ ) 
    # you may have to do something like execfile( "my_cgi.py", globals=environ ) 
    execfile( "my_cgi.py" )
    status = '200 OK' # HTTP Status
    headers = [('Content-type', 'text/html')] # HTTP Headers
    start_response(status, headers)
    return page.getvalue()

Ceci est une première étape pour réécrire votre application CGI dans un cadre approprié. Cela nécessite très peu de travail et rendra votre CGI beaucoup plus évolutive, car vous ne lancerez pas de nouveau processus CGI pour chaque demande.

La deuxième étape consiste à créer un serveur mod_wsgi qu'Apache utilise à la place de tous les scripts CGI. Ce serveur doit (1) analyser les URL, (2) appeler diverses fonctions telles que la fonction exemple my_cgi . Chaque fonction execfile utilisera l'ancien script CGI sans créer de nouveau processus.

Consultez werkzeug pour trouver des bibliothèques utiles.

Si les scripts CGI de votre application ont une structure (fonctions, classes, etc.), vous pouvez probablement les importer et faire quelque chose de beaucoup, beaucoup plus intelligent que ce qui précède. Une meilleure façon est-ce.

wsgi.py

from my_cgi import this_func, that_func
def my_cgi( environ, start_response ):

    result= this_func( some_args )
    page_text= that_func( result, some_other_args )

    status = '200 OK' # HTTP Status
    headers = [('Content-type', 'text/html')] # HTTP Headers
    start_response(status, headers)
    return page_text

Cela nécessite davantage de travail, car vous devez comprendre l’application héritée. Cependant, cela présente deux avantages.

  1. Cela rend votre CGI plus évolutif car vous ne démarrez pas un nouveau processus pour chaque requête.

  2. Il vous permet de repenser votre application, en la modifiant éventuellement dans un cadre approprié. Une fois cette opération effectuée, il n’est plus très difficile de passer à l’étape suivante: TurboGears ou Pylônes ou web.py pour un framework très simple.

Autres conseils

Utilisez FastCGI . Si je comprends bien FastCGI, vous pouvez faire ce que vous voulez en écrivant un programme Python très simple, situé entre le serveur Web et votre code hérité.

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