用Lighttpd设置gevent,奇怪的东西

时间:2012-08-05 16:27:08

标签: python fastcgi lighttpd gevent

我有一些警惕的奇怪问题。我配置Lighttpd传递/测试到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,仍然没问题。

flup示例:

#!/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都在工作?在官方示例here中是否有一些秘密设置没有提及。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

因此,对于 Flup uWSGI ,请配置lighttpd(或任何其他网络服务器)以使用 fastcgi 模块,但 gunicorn gevent 你使用代理模块,对他们来说你根本不需要使用前端!如果没有静态的东西要服务或其他你可以省略前端的原因 gunicorn 表示它是快速和稳定的警惕。