<p><strong>WSGI、CGI和框架是如何连接的?</strong></p>
<p>Apache监听端口80。它得到一个HTTP请求。它解析请求以找到响应的方式。Apache有很多响应选项。一种响应方法是使用CGI运行脚本。另一种回应方式是简单地提供一个文件。</p>
<p>对于CGI,Apache准备一个环境并通过CGI协议调用脚本。这是一个标准的Unix Fork/Exec情况——CGI子进程继承了一个OS环境,包括socket和stdout。CGI子进程编写一个响应,该响应返回到Apache;Apache将此响应发送到浏览器。</p>
<p>CGI是原始的和烦人的。主要是因为它为每个请求分叉一个子进程,子进程必须退出或关闭stdout和stderr以表示响应结束。</p>
<p>WSGI是一个基于CGI设计模式的接口。它不一定是CGI——它不必为每个请求派生一个子进程。它可以是CGI,但不一定是。</p>
<p>WSGI以几种重要的方式添加到CGI设计模式中。它为您解析HTTP请求头并将其添加到环境中。它在环境中以类文件对象的形式提供任何面向后的输入。它还为您提供了一个函数,用于制定响应,从而避免了许多格式化细节。</p>
<p><strong>如果我想在我的基本CGI配置上运行web框架(比如web.py或cherrypy),我需要知道/安装/做什么?</strong></p>
<p>回想一下,分叉子流程是昂贵的。有两种方法可以解决这个问题。</p>
<ol>
<li><p><strong>Embedded</strong><code>mod_wsgi</code>或<code>mod_python</code>将Python嵌入到Apache中;没有进程分叉。Apache直接运行Django应用程序。</p></li>
<li><p><strong>守护进程</strong><code>mod_wsgi</code>或<code>mod_fastcgi</code>允许Apache使用WSGI协议与单独的守护进程(或“长时间运行的进程”)交互。启动长时间运行的Django进程,然后配置Apache的mod_fastcgi与该进程通信。</p></li>
</ol>
<p>请注意,<code>mod_wsgi</code>可以在两种模式下工作:嵌入式或守护进程。</p>
<p>当您阅读mod_fastcgi时,您将看到Django使用<a href="http://pypi.python.org/pypi/flup/" rel="noreferrer">flup</a>根据mod_fastcgi提供的信息创建与WSGI兼容的接口。管道是这样工作的。</p>
<pre><code>Apache -> mod_fastcgi -> FLUP (via FastCGI protocol) -> Django (via WSGI protocol)
</code></pre>
<p>Django有几个“Django.core.handlers”用于各种接口。</p>
<p>对于mod_fastcgi,Django提供了一个集成FLUP和处理程序的<code>manage.py runfcgi</code>。</p>
<p>对于mod_wsgi,有一个核心处理程序。</p>
<p><strong>如何安装WSGI支持?</strong></p>
<p>遵循这些说明。</p>
<p><a href="https://code.google.com/archive/p/modwsgi/wikis/IntegrationWithDjango.wiki" rel="noreferrer">https://code.google.com/archive/p/modwsgi/wikis/IntegrationWithDjango.wiki</a></p>
<p>背景请看这个</p>
<p><a href="http://docs.djangoproject.com/en/dev/howto/deployment/#howto-deployment-index" rel="noreferrer">http://docs.djangoproject.com/en/dev/howto/deployment/#howto-deployment-index</a></p>