問題タブ [mod-lua]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
apache - Apache HTTPD mod_lua parseargs mutlivalue テーブルにすべての値が格納されない
私は現在、LUA スクリプトで httpd を使用して、遅延、障害、およびプロキシを導入するテスト ハーネスを作成しています。これには、同じタグの複数の値を含む可能性のあるクエリ文字列の解析が含まれます。つまり:
これにより、メッセージ フローの特定のポイントでメッセージを遅らせたり、特定の要求を別のエンドポイントにリダイレクトしたりできます。私の問題は、提供されている LUA テーブルで使用できるものに関係しています。
私が抱えている問題は、上記のクエリ文字列で以下のコードのようなものを使用して、操作している値を単純にログアウトする場合です。
ログに記録される項目は、提供された最終参照値に関連する項目のみです。
ご覧のとおり、最初のログ エントリでは、ref の値がテーブルであることを認識していますが、そのテーブルを反復処理すると、最後に提供された値を含む 1 つのエントリしか返されません。また、標準テーブルには、提供された最終値のみが含まれていますが、ここに何があるべきかわからず、興味がありません。
mod_lua のドキュメントに概説されている parseargs の正しい手順に従っていると思いますが、関数に関する限り私の期待を反映していますが、複数値部分を処理する方法の例はありません。
複数値のキーが増分整数である他のテーブルと同じように機能すると仮定しました。
ref の多値テーブルを通過する必要がある他の方法はありますか?
環境の詳細
サーバー ハードウェア - Oracle VirtualBox 5.1.16 r113841 (2 GB RAM、2 コア CPU、32 GB HDD)。
サーバー OS - Ubuntu 16.04.2 LTS (GNU/Linux 4.4.0-78-generic x86_64)。
Apache httpd バージョン - サーバー バージョン: Apache/2.4.18 (Ubuntu)、サーバー ビルド: 2017-05-05T16:32:00。ubuntu canonical repo を使用してインストールします。
Web クライアント - クライアントに依存するのではなく、選択してください (curl、wget、firefox 44、chrome、jmeter)
もう少し情報
クエリ文字列に異なるタグを含めると、すべてのタグが処理されますが、ここでも各タグの最後の値のみが保存されます。クエリ文字列:
以下のみがログに記録されます。
また、r:err を使用してはならないことはわかっていますが、Apache インストールのログ レベルが下がっており、変更できないため、ログを取得したことを確認しました。
apache2 には次のモジュールがロードされています。
apache - Apache 2.4 + mod_lua: リクエスト間で状態を共有する
mod_luaに基づいて Apache 2.4 用の独自のレート リミッターを作成するとします。アイデアは、IP ごとの時間間隔ごとの要求を制限することです。
このタスクでは、IP ごとの以前のリクエスト数などを含む、グローバルにアクセス可能なデータ構造を維持する必要があります。
mod_lua の種類は、 ivm_setメソッドとivm_getメソッドを使用したリクエスト間の共有メモリをサポートしますが、1 つのワーカー プロセス内でのみサポートします。
値は...プロセスごとに保存されます(したがって、プリフォークmpmではあまり役に立ちません)
通常、複数のワーカー プロセスを使用しています。私たちの場合、いくつかのプロセスで mod_mpm_event を使用しています。その場合、この小さな「以前のリクエスト」データ構造をどのように共有しますか?
現在考えられる唯一の方法は、mod_lua でサポートされているデータベースを使用することです。ただし、このような簡単なタスクに対しては、非常に複雑なソリューションのようです。
質問: mod_lua ですべてのリクエスト間で共有メモリを実現するにはどうすればよいですか?
PS: mod_qosのような既存のレート リミッターがあることは知っています。実際の使用例は別のものですが、レート リミッタの例は共通の理解を得るのに役立ちます。