ngx.location.capture() メソッドを使用して、定義済みのロケーション ブロックへのサブリクエストを実行します。次に、ロケーション ブロック内から、外部の FastCGI 要求を実行します。サブリクエスト自体は実際にはネットワーク操作ではなく、純粋に nginx C ベースの環境内で実行されるため、オーバーヘッドはほとんどありません。さらに、FastCGI リクエストやその他の「proxy_pass」タイプのリクエストはイベントベースであるため、nginx は効率的な仲介者として動作できます。
例として、次のようなものがあります。
location / {
access_by_lua '
response = ngx.location.capture("/my-subrequest-handler")
if response.status == 404 then
return ngx.exit(401) -- can't find/authenticate user, refuse request
end
ngx.say(response.status)
';
# other nginx config stuff here as necessary--perhaps another fastcgi_pass
# depending upon the status code of the response above...
}
location = /my-subrequest-handler {
internal; # this location block can only be seen by nginx subrequests
fastcgi_pass localhost:9000; # or some named "upstream"
fastcgi_pass_request_body off; # send client request body upstream?
fastcgi_pass_request_headers off; # send client request headers upstream?
fastcgi_connect_timeout 100ms; # optional; control backend timeouts
fastcgi_send_timeout 100ms; # same
fastcgi_read_timeout 100ms; # same
fastcgi_keep_conn on; # keep request alive
include fastcgi_params;
}
上記の例では、「/my-subrequest-handler」へのサブリクエストを実行していますが、FastCGI プロセスに渡される実際の URL は、最初に nginx を呼び出す HTTP クライアントによって要求された URL です。
ngx.location.capture は同期的ですが非ブロッキング操作であることに注意してください。これは、応答が受信されるまでコードの実行が停止することを意味しますが、その間、nginx ワーカーは自由に他の操作を実行できます。
nginx パイプラインの任意の時点で要求と応答を変更するために、Lua で実行できる非常に優れた機能がいくつかあります。たとえば、ヘッダーを追加したり、ヘッダーを削除したり、本文を変換したりして、元のリクエストを変更できます。おそらく、呼び出し元は XML を操作したいのですが、上流のアプリケーションは JSON しか理解できません。上流のアプリケーションを呼び出すときに、JSON との間で変換できます。
デフォルトでは、Lua は nginx に組み込まれていません。代わりに、コンパイルする必要があるサードパーティのモジュールです。Lua+LuaJIT でビルドされるOpenRestyと呼ばれる nginx のフレーバーと、必要な場合と不要な場合があるいくつかの他のモジュールがあります。