使用 wsgiproxy 转发请求
WSGIProxy 是一个 python 包, 属于 paster 的一个组件, 提供了代理功能。可以在一些情况下代替mod_proxy.
比如你在本地6543端口运行一个Python Web 服务器, 而你的服务器只开放了80端口,并且运行着apache , 你可以使用mod_proxy 来把请求转发过去, 或者你也可以使用 mod_rewrite + fcgi + 下面的脚本实现同样的功能.
proxy.fcgi
#!/home/filia/env/bin/python import sys import os script_name = '/' + os.path.basename(__file__) os.environ['PYTHON_EGG_CACHE'] = "/home/filia/tmp/.egg_cache/" import wsgiproxy.exactproxy from fcgi import WSGIServer DEST_SERVER = "127.0.0.1" DEST_PORT = 6543 def reverse_proxy(environ, start_response): environ['SERVER_NAME'] = DEST_SERVER environ['SERVER_PORT'] = DEST_PORT if environ.has_key('SCRIPT_NAME') and environ['SCRIPT_NAME'].endswith(script_name): environ['SCRIPT_NAME'] = environ['SCRIPT_NAME'][:-len(script_name)] return wsgiproxy.exactproxy.proxy_exact_request(environ, start_response) WSGIServer(reverse_proxy).run()
当然你还需要一个 fcgi.py 模块, 比如这个 http://svn.saddi.com/py-lib/trunk/fcgi.py .
还有一个.htacces 文件定义rewrite.
AddHandler fcgid-script .fcgi RewriteEngine On RewriteBase / RewriteRule ^(proxy\.fcgi/.*)$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ proxy.fcgi/$1 [L]
我没有测试这样的方式的性能, 估计不会好到哪里去。 不过我的应用是一个管理后台, 性能就不是一个重要的问题了.