我拥有一个写成CGI的遗留python应用程序。到目前为止,这种方法工作正常,但在不久的将来,并发用户的数量将大幅增加。在这里,我读到:"CGI对于低流量的网站是很好的,但它对于其他任何东西都有一些性能问题“。我知道以另一种方式开始会更好,但CGI就是现在的样子。
谁能告诉我如何在不重写所有代码的情况下保持CGI的性能?
发布于 2009-06-19 02:46:31
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进程。
第二步是创建Apache使用的mod_wsgi
服务器,而不是所有的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
这需要更多的工作,因为您必须了解遗留应用程序。然而,这有两个优点。
发布于 2009-06-19 01:29:14
使用FastCGI。如果我理解正确的话,您可以通过编写一个非常简单的FastCGI程序来做您想做的事情,该程序位于web服务器和您的遗留代码之间。
https://stackoverflow.com/questions/1017087
复制相似问题