私は奇妙な問題を抱えています。/test を fastcgi バックエンドに渡すように Lighttpd を構成しました。これを構成に追加しただけです
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 の両方が機能するのはなぜですか? 公式の例では言及されていない秘密の設定はありますかhere .