uwsgi_pass->uwsgi->flaskを介してPythonコードにリダイレクトした後に渡されるnginx変数に関する奇妙な問題。uWSGI自体は、$uriや$request_filenameなどの変数が展開されていることを確認します。私のPythonコードは、それらを「$uri」および「$request_filename」と同じように認識します。
nginx構成:
location /l0 {
include uwsgi_params;
uwsgi_pass 127.0.0.1:4001;
}
location /spool {
set $file_path $request_filename;
post_action /l2;
}
location /l2 {
internal;
include uwsgi_params;
uwsgi_param REQUEST_URI /foo/bar=$file_path;
uwsgi_pass 127.0.0.1:4001;
limit_except GET {
allow all;
}
}
uwsgiアプリは以下で始まりました:
/usr/bin/uwsgi_python --socket :4001 --python-path /my/path --module my.module --callable app --need-app
ログから、uwsgiが$ uriを展開してリクエストを受け取ったことがわかります(つまり、「/ some / path」)。私のコードでは、「$ uri」だけが表示されます(ログ行を参照my_2nd_handler got mypath=/foo/bar=$uri
) 。
コード:
app = Flask('myapp')
@app.route('/l0', methods=['GET']):
def my_root_handler():
r = Response()
r.headers['X-Accel-Redirect'] = '/spool/file1'
print "my_root_handler sent nginx to /spool/file1"
return r
@app.route('/<path:mypath>', methods=['GET']):
def my_2nd_handler(mypath):
print "my_2nd_handler got mypath="+mypath
リクエスト:
curl -X GET http://mysite/l0
ログ:
my_root_handler sent nginx to /spool/file1
my_2nd_handler got mypath=/foo/bar=$uri
[pid: 21715|app: 0|req: 1/1] 10.16.183.15 () {40 vars in 915 bytes} [Tue Jan 22 21:04:59 2013] GET /foo/bar=/spool/file1 => generated 116 bytes in 3 msecs (HTTP/1.1 404) 4 headers in 203 bytes (1 switches on core 0)
問題の変数は$request_filenameだけではありません。私は同じ結果で他のいくつかを試しました。Pythonコードでnginx変数を展開するにはどうすればよいですか?