web-dev-qa-db-ja.com

NginxとLuaを使用してPOSTリクエストのJSON本文を操作するにはどうすればよいですか?

スタックに scale を実装する方法を示すために、概念実証を行っています。一例では、いくつかのPOSTrequestボディ操作を実行して、何であるかをマップするAPIファサードを作成したいと思います。従来のAPI形式を新しい内部形式に変更します。たとえば、次のように変更します。

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

{ "FOO" : "bar" }

Luaモジュールのドキュメントcontent_by_lua 、これは適切な方法のようです

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

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

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


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

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
12
Jesse

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

 location/{
#fastcgiサーバーへのホストとポート
 default_type text/html; 
 set $ URL "http:// $ http_Host $ request_uri"; 
 access_by_lua_file/home/lua/cache.lua;
proxy_passhttp:// $ target; 
 ------- 
 ------ --- 

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

 if ngx.req.get_method()== "POST" then 
-リクエストメソッドがPOST 
かどうかを確認します。]-ロジック
 return 
 end 
6
Prashant Gaur

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

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

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

4
vdg

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

これは基本的な構成ですが、その方法がわかります。

1