Domanda

Possiedo un'applicazione legacy di Python scritta come CGI. Fino ad ora questo funziona bene, ma il numero di utenti simultanei aumenterà ampiamente nel prossimo futuro. Qui su SO ho letto: "CGI è ottimo per i siti web a basso traffico, ma ha alcuni problemi di prestazioni per qualsiasi altra cosa". So che sarebbe stato meglio iniziare in un altro modo, ma CGI è ciò che è adesso.

Qualcuno potrebbe indicarmi una direzione su come mantenere le prestazioni del CGI, senza dover riscrivere tutto il codice?

È stato utile?

Soluzione

CGI non viene ridimensionato perché ogni richiesta prevede un processo server nuovo di zecca. È un sacco di spese generali. mod_wsgi evita il sovraccarico investendo un processo e consegnando le richieste a quel processo in esecuzione.

Supponiamo che l'applicazione sia il peggior tipo di cgi.

Il caso peggiore è che abbia file come questo.

my_cgi.py

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

Puoi provare a " avvolgere " i file CGI originali per renderlo 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()

Questo è il primo passo per riscrivere l'applicazione CGI in un framework adeguato. Ciò richiede pochissimo lavoro e renderà il tuo CGI molto più scalabile, dal momento che non avvierai un nuovo processo CGI per ogni richiesta.

Il secondo passo è creare un server mod_wsgi che Apache utilizza al posto di tutti gli script CGI. Questo server deve (1) analizzare gli URL, (2) chiamare varie funzioni come la funzione di esempio my_cgi . Ogni funzione eseguirà il vecchio script CGI senza creare un nuovo processo.

Guarda werkzeug per utili librerie.

Se gli script CGI dell'applicazione hanno una struttura (funzioni, classi, ecc.) probabilmente puoi importarli e fare qualcosa di molto più intelligente di quanto sopra. Un modo migliore è questo.

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

Questo richiede più lavoro perché devi capire l'applicazione legacy. Tuttavia, questo ha due vantaggi.

  1. Rende il tuo CGI più scalabile perché non stai avviando un nuovo processo per ogni richiesta.

  2. Ti consente di ripensare la tua applicazione, possibilmente cambiandola in un framework adeguato. Una volta fatto questo, non è molto difficile fare il passo successivo e passare a TurboGears o Pylons o web.py per un framework molto semplice.

Altri suggerimenti

Usa FastCGI . Se capisco correttamente FastCGI, puoi fare quello che vuoi scrivendo un programma Python molto semplice che si trova tra il server web e il tuo codice legacy.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top