1

fastcgi_passLua サポートでコンパイルされた nginx を使用して、nginx のディレクティブのように、FastCGI ハンドラーに一種のサブリクエストを作成するにはどうすればよいでしょうか?

私がやりたいことは次のようなものです:

location = / {
    access_by_lua '
        res = ngx_fastcgi.pass("backend")
    ';
}

(明らかに、これは機能しません。)

私はHttpLuaModuleに注いでいます 言及がngx_fastcgiありngx.location.capture、明らかに、

ディスク ファイル ディレクトリまたは ... ngx_fastcgi などの他の nginx C モジュールで構成された他の場所への非ブロック内部要求

しかし、のリンクをたどると、Lua スクリプト可能なコマンドではなく、nginx ディレクティブのみを説明ngx_fastcgiするHttpFastcgiModuleに移動します。ngx.location.capture使用する適切な機能はありますか? (ちなみに、これらのリクエストは、localhost9000 や 9001 などの別のポートの に送信されます。)

nginx で Lua を使用してリクエストを転送したり、サブリクエストを FastCGI エンドポイントに送信したりするにはどうすればよいですか?

4

1 に答える 1

5

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 のフレーバーと、必要な場合と不要な場合があるいくつかの他のモジュールがあります。

于 2013-08-22T18:18:32.607 に答える