Вопрос

У меня есть старое приложение на Python, написанное как CGI. До сих пор это работает хорошо, но число одновременных пользователей будет увеличиваться в основном в ближайшем будущем. Здесь, на SO, я читаю: «CGI отлично подходит для веб-сайтов с низким трафиком, но у него есть некоторые проблемы с производительностью для всего остального». Я знаю, что было бы лучше начать по-другому, но CGI - это то, что есть сейчас.

Может ли кто-нибудь указать мне, как поддерживать работу CGI без необходимости переписывать весь код?

Это было полезно?

Решение

CGI не масштабируется, потому что каждый запрос порождает новый серверный процесс. Это много накладных расходов. mod_wsgi позволяет избежать накладных расходов, разветвляя один процесс и передавая запросы этому одному запущенному процессу.

Давайте предположим, что приложение является худшим видом cgi.

В худшем случае у него есть такие файлы.

<код> my_cgi.py

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

Вы можете попытаться "обернуть" оригинальные файлы CGI, чтобы сделать его 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()

Это первый шаг к переписыванию вашего CGI-приложения в надлежащую среду. Это потребует очень мало работы и сделает ваш CGI более масштабируемым, поскольку вы не будете запускать новый процесс CGI для каждого запроса.

Второй шаг - создать сервер mod_wsgi , который Apache использует вместо всех сценариев CGI. Этот сервер должен (1) проанализировать URL-адреса, (2) вызвать различные функции, такие как пример функции my_cgi . Каждая функция будет execfile старый сценарий CGI, не создавая новый процесс.

Посмотрите werkzeug для получения полезных библиотек.

Если ваши CGI-скрипты вашего приложения имеют некоторую структуру (функции, классы и т. д.), вы, вероятно, можете импортировать их и сделать что-то намного, намного умнее, чем выше. Лучший способ это.

<код> 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

Это требует больше работы, потому что вы должны понимать устаревшее приложение. Однако это имеет два преимущества.

<Ол>
  • Это делает ваш CGI более масштабируемым, потому что вы не запускаете новый процесс для каждого запроса.

  • Это позволяет вам переосмыслить ваше приложение, возможно, изменив его на подходящую структуру После того, как вы это сделаете, нетрудно сделать следующий шаг и перейти к TurboGears или Пилоны или web.py для очень простой структуры.

  • Другие советы

    Используйте FastCGI . Если я правильно понимаю FastCGI, вы можете сделать то, что вы хотите, написав очень простую программу на Python, которая находится между веб-сервером и вашим устаревшим кодом.

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top