利用Python的FastCGI实现Nginx动态代理
Nginx关键配置
网上有PHP等提供FastCGI接口的范例,本文以Python作为范例讲解一下简单配置。
安装Nginx时,configuration需要添加auth模块,--with-http_auth_request_module
以下是Nginx配置
server {
listen 50000;
server_name localhost 192.168.254.132;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
auth_request /ncgi.py; # 处理路径或者脚本
auth_request_set $url $sent_http_url;
proxy_pass $url;
}
location ~ \ncgi.py$ { # 为了处理上面的 /ncgi.py
fastcgi_pass 127.0.0.1:50001; #python或者其他语音提供的FastCGI服务
fastcgi_param REQUEST_URI $request_uri;
include fastcgi_params; # 使用默认的参数即可
}
}
python FastCGI服务
简单的用flup提供服务,也可以用其他框架。 flup比较简单,使用WSGIServer就可以直接运行开放接口。
environ 是nginx传递进来的http状态的一些参数,包含下面代码获取的REQUEST_URI和其他关键信息,可以print出来看一下
start_response可以看出是nginx提供的一个回调函数,通过它可以传递状态码和头给nginx模块,下面代码传递的url,nginx会用到
proxy_pass $url;中进行处理。 下面红色代码可以根据我们的业务需求,进行动态路由,或将加密的IP地址信息或者文件信息解码等。
from flup.server.fcgi import WSGIServer
def parse_ip(environ, start_response):
request_uri = environ.get('REQUEST_URI') or ''
splits = request_uri.split('/')
if len(splits) < 3:
start_response('404 Error', [('url', '/404.jpg')])
else:
url = 'http://{}:8999/{}'.format(p.decrypt(splits[1]), '/'.join(splits[2:]))
start_response('200 OK', [('url', url)])
return ['']
if __name__ == '__main__':
WSGIServer(parse_ip, bindAddress=('127.0.0.1', 50001)).run()