18

スタックに3scaleを実装する方法を実証するために、概念実証を行っています。1 つの例では、POST要求本文の操作を行って、従来の API 形式を新しい内部形式にマップする API ファサードを作成したいと考えています。例えば。のようなものを変更します

{ "foo" : "bar" , "deprecated" : true }

の中へ

{ "FOO" : "bar" }

content_by_luaLua モジュール ドキュメント。これは、適切なメソッドのようです。

このディレクティブと他のコンテンツ ハンドラー ディレクティブを同じ場所で使用しないでください。たとえば、このディレクティブとproxy_passディレクティブを同じ場所で使用しないでください。

私の理解では、content_by_lua は proxy_pass のようなコンテンツ ハンドラであり、場所ごとに 1 つしか使用できません。

それがプロキシの仕組みの基礎であるため、 proxy_passを削除する方法はないと思います。別の場所でリクエストをキャプチャし、 content_by_luaを使用してから、 proxy_passを実装する場所に渡すか、次のような別の方法がありますどちらがより適切なrewrite_by_lua ?


他の人に役立つ場合は、次の関数 (Lua の最初のビット) を追加しました。これは、user_key3scale が承認に必要とするパラメーターを削除しますが、転送された場合に API に対して無効になります。

function remove_user_key()
  ngx.req.read_body()
  -- log the original body so we can compare to the new one later
  local oldbody = ngx.req.get_body_data()
  log(oldbody)
  -- grab the POST parameters as a table
  local params = ngx.req.get_post_args()

  -- build up the new JSON string
  local newbody = "{"

   for k,v in pairs(params) do
     -- add all the params we want to keep
     if k ~= "user_key" then
        log("adding"..k.." as "..v)
        newbody = newbody..'"'..k..'":"'..v..'",'
     else 
        log("not adding user_key")
     end
   end
  --remove the last trailing comma before closing this off
  newbody = string.sub(newbody, 0, #newbody-1)
  newbody = newbody.."}"

  ngx.req.set_body_data(newbody)
  log(newbody)
end

if ngx.req.get_method() == "POST" then
  remove_user_key()
end
4

3 に答える 3

8

access_by_lua
nginx.conf で使用することをお勧めします

位置 / {
                #fastcgi サーバーへのホストとポート
                default_type テキスト/html;
                set $URL "http://$http_host$request_uri";
                access_by_lua_file /home/lua/cache.lua;
                proxy_pass http://$target;
                -------
                ----------

cache.lua ファイルでは、次のようなことができます:

ngx.req.get_method() == "POST" の場合
    -- リクエスト メソッドが POST かどうかを確認します
    -- ロジックを実装する
    戻る
終わり
于 2014-04-01T14:22:01.473 に答える
4

Prashant が既に述べたことに加えて、3scale から Nginx 構成ファイルをダウンロードすると、Lua ファイルが含まれていることに気付くでしょう。このファイルは既に から呼び出されていaccess_by_lua_fileます。

私の意見では、そのファイルは、ボディ操作コードを追加するのに最適な場所です。proxy_passAPI サーバーへの が送信される前に、すべてのリクエストに対して実行されます。

また、これは、Nginx 内で Lua を使用してリクエストにさまざまな変換を行う方法についての非常に詳細なブログ記事です。

于 2014-04-02T11:02:20.510 に答える
0

最近、ポスト リクエストの JSON 値に基づいてアップストリームを操作する必要がありましたが、これが便利であることがわかりました: NGINX LUA と JSON

これは基本的な構成ですが、その方法についてのアイデアを提供します。

于 2015-03-26T22:02:59.380 に答える