利用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()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM