1

我有一个奇怪的问题。我将 Lighttpd 配置为将 /test 传递给 fastcgi 后端。刚刚在配置中添加了这个

fastcgi.server = ("/test" =>
  ("127.0.0.1" =>
    (
      "host" => "127.0.0.1",
      "port" => 7101,
      "docroot" => "/",
      "check-local" => "disable"
    )
  )
)

现在,当我启动 Flup 示例并点击 127.0.0.1:80/test 时,一切正常。测试 uWSGI 到,还是可以的。

翻牌示例:

#!/usr/bin/env python
from flup.server.fcgi import WSGIServer

def myapp(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/plain')])
    return ['Hello World']

WSGIServer(myapp, bindAddress = ('127.0.0.1',7101)).run()

现在,唯一的问题是当我启动 gevent 时它不起作用。Lighttpd mod_fastcgi 说后端刚刚被阻塞。

有趣的是,当我更改处理程序以仅返回字符串时,导致 WSGI 需要可迭代,并从我的浏览器中点击 127.0.0.1:7101 它按预期工作。这应该是WSGIServer,怎么会这样呢?

这是gevent代码:

#!/usr/bin/python
"""WSGI server example"""
from gevent.wsgi import WSGIServer

def app(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    #return ["Hello World", StopIteration]   # this is WSGI test, not working
    return "Hello World"
    # when set like this, frontend :80 still wont work (500 Internal error), 
    # but 127.0.0.1:7101 work like standard http

if __name__ == '__main__':
    WSGIServer(('', 7101), app).serve_forever()

底线是,为什么只有 gevent 在这个设置中不起作用,而 Flup 和 uWSGI 都在起作用?这里有没有官方示例中没有提到的一些秘密设置。

4

2 回答 2

1

因为 gevent.wsgi.WSGIServer 不是 fcgi 服务器,它只是 http 服务器。您可以将您的请求从 lighttpd 代理到 gevent 作为 http,或使用 wsgi。

于 2012-08-05T16:51:34.417 回答
0

你可以看到,flup在这里声明它是 SPEAK FastCGI(不是 HTTP),而 uWSGI在这里说“作为一个仅 WSGI 的服务器而生”。现在 Gevent在这里说“基于 libevent-http 的快速 WSGI 服务器”,这让我很困惑,但后来我尝试了 gunicorn,但它失败了。然后我在这里发现“Gunicorn 'Green Unicorn' is a Python WSGI HTTP Server for UNIX”。这意味着 gevent 和 gunicorn WSGI 处理程序是 HTTP 请求而不是 FastCGI,但正如 Fedor Gogolev 所说,对于您的处理程序,它们是 WSGI 服务器。

因此,对于FlupuWSGI ,您可以配置 lighttpd(或任何其他 Web 服务器)以使用fastcgi模块,但对于gunicorngevent ,您使用代理模块,对于它们,您根本不必使用前端!如果没有静态服务的东西或其他原因你可以省略前端导致gunicorn状态它是快速和稳定的。

于 2012-08-06T12:38:43.113 回答