Nginxはctxを使用してデータ共有とコンテキスト変更機能を実現します。

Nginxはctxを使用してデータ共有とコンテキスト変更機能を実現します。

環境: init_worker_by_lua、set_by_lua、rewrite_by_lua、access_by_lua、content_by_lua、header_filter_by_lua、body_filter_by_lua、log_by_lua、ngx.timer.、balancer_by_lua

この Lua テーブルは、リクエストベースの Lua 環境データを保存するために使用でき、その有効期間は現在のリクエストと同じです (Nginx 変数と同様)。

次の例を参照してください。

 場所 /テスト {
  書き換えブロック {
   ngx.ctx.foo = 76
  }
  アクセス_by_lua_ブロック {
   ngx.ctx.foo = ngx.ctx.foo + 3
  }
  コンテンツ_by_lua_block {
   ngx.say(ngx.ctx.foo)
  }
 }

GET /test 出力にアクセスする

79

つまり、ngx.ctx.foo エントリは、リクエストの書き換え、アクセス、およびコンテンツ処理の各フェーズにわたって一貫性を保ちます。

サブリクエストを含む各リクエストには、ngx.ctx テーブルの独自のコピーがあります。例えば:

 場所 /sub {
  コンテンツ_by_lua_block {
   ngx.say("サブプレ: ", ngx.ctx.blah)
   ngx.ctx.blah = 32
   ngx.say("サブ投稿: ", ngx.ctx.blah)
  }
 }

 場所 /main {
  コンテンツ_by_lua_block {
   ngx.ctx.blah = 73
   ngx.say("メイン pre: ", ngx.ctx.blah)
   ローカル res = ngx.location.capture("/sub")
   ngx.print(res.body)
   ngx.say("メイン投稿: ", ngx.ctx.blah)
  }
 }

GET /main出力にアクセスする

メインプレ:73
サブプレ: nil
サブ投稿: 32
メインポスト: 73

ここで、子リクエストの ngx.ctx.blah エントリを変更しても、親リクエストの同じ名前のエントリには影響しません。これは、それぞれが異なるバージョンの ngx.ctx.blah を保持しているためです。

内部リダイレクトにより、元のリクエスト内の ngx.ctx データ (存在する場合) が破棄され、新しいリクエストには空の ngx.ctx テーブルが含まれます。例えば、

 場所 /new {
  コンテンツ_by_lua_block {
   ngx.say(ngx.ctx.foo)
  }
 }

 場所 / 元 {
  コンテンツ_by_lua_block {
   ngx.ctx.foo = "こんにちは"
   ngx.exec("/new")
  }
 }

GET /origにアクセスすると、出力されます

ゼロ

元の「hello」値の代わりに。

この「マジック」テーブルには、Lua クロージャやネストされたテーブルなどの任意のデータ値を挿入することができ、カスタム メタメソッドの登録も可能になります。

ngx.ctxを新しいLuaテーブルで上書きすることも可能です。たとえば、

ngx.ctx = { foo = 32, bar = 54 }

init_worker_by_lua* コンテキストで使用される場合、このテーブルの有効期間は現在の Lua ハンドルと同じになります。

ngx.ctx テーブルの検索には比較的コストのかかるメタメソッド呼び出しが必要であり、これはユーザー独自の関数引数を介してリクエストベースのデータを直接渡すよりもはるかに遅くなります。したがって、パフォーマンスに大きな影響を与える可能性があるため、ユーザー関数パラメータを保存するためにこの API を乱用しないでください。

また、メタメソッドの「マジック」のため、ワーカー レベルのデータ共有など、Lua モジュール レベルで「ローカル」レベルの ngx.ctx を使用しないでください。次の例は良くありません。

-- mymodule.lua

ローカル _M = {}

-- 次の行の ngx.ctx は単一のリクエストに属しますが、ctx 変数は Lua モジュール レベルにあります。

-- そして、それは一人の労働者に属します。

 ローカル ctx = ngx.ctx

 関数_M.main()
  ctx.foo = "バー"
 終わり

 _Mを返す

代わりに以下を使用する必要があります。

 -- mymodule.lua
 ローカル _M = {}

 関数_M.main(ctx)
  ctx.foo = "バー"
 終わり

 _Mを返す

つまり、呼び出し元は関数にパラメータを渡して ctx テーブルへの呼び出しを完了する必要があります。

要約する

上記はこの記事の全内容です。この記事の内容が皆さんの勉強や仕事に一定の参考学習価値を持つことを願っています。ご質問があれば、メッセージを残してコミュニケーションしてください。123WORDPRESS.COM を応援していただきありがとうございます。

以下もご興味があるかもしれません:
  • Nginxでの共有セッション設定方法の例
  • Nginx 負荷分散マルチサイト共有セッション
  • nginx+tomcatは負荷分散を実装し、redisセッション共有を使用します
  • nginx+redisはセッション共有を実現します

<<:  Mysql 5.6ではユーザー名とパスワードを変更するメソッドが追加されました

>>:  React Hooksの使用例

推薦する

時間範囲効果を実現するためのJavaScript

この記事では、時間範囲効果を実現するためのJavaScriptの具体的なコードを参考までに紹介します...

HTML テーブル マークアップ チュートリアル (6): 暗い境界線の色属性 BORDERCOLORDARK

表では、右下の境界線の色を個別に定義したり、セルの左上の境界線の色を定義したりできます。これら 2 ...

CSS3 ベジェ曲線の例: リンクホバーアニメーション効果の作成

CSS3 アニメーション トランジションを使用して、リンクの上にマウスを移動すると小さなポップアップ...

DeepinでPyenvをインストールする手順

序文これまでは、/bin/ ディレクトリのソフトリンクを変更して Python のバージョンを切り替...

LayUI+Shiroは動的なメニューを実装し、メニュー拡張の例を記憶します

目次1. Maven 依存関係2. メニュー関連クラス1. メインメニュー2. サブメニュー3. S...

Docker バインディング固定 IP/クロスホストコンテナ相互アクセス操作

序文これまでは、パイプワークで割り当てた静的 IP は一時的なものであり、再起動すると無効になってい...

MySQL デュアルマシン ホットスタンバイ実装ソリューション [テスト可能]

目次1. コンセプト2. 環境の説明3. マスタースレーブホットスタンバイ実装1. コンセプト1. ...

Windows 10 での Tomcat のインストールと展開に関する詳細なチュートリアル

目次1 Java環境の設定2 tomcatのインストールと展開Tomcat をインストールして展開す...

Node.js を使用して C# のデータ テーブル エンティティ クラス生成ツールを作成する方法

Microsoft は T4 テンプレートを提供していますが、使用するのが非常に難しいと思います。ス...

Nginx のパラメータをオンにして Web パフォーマンスを 3 倍向上させる方法

1. 遭遇したいくつかの問題2008 年にパフォーマンス テストを行っていたとき、パフォーマンス テ...

熟練デザイナーの7つの原則(2):色の使い方

<br />前回の記事:優秀なデザイナーの7つの原則(1):フォントデザイン 英語 原文...

TeamCenter12 にログインする際の 404/503 問題の解決方法

TeamCenter12はアカウントのパスワードを入力し、ログインをクリックすると、404または50...

MySQLパスワードを変更するいくつかの方法

序文:データベースを日常的に使用すると、パスワードが単純すぎて変更する必要がある場合、パスワードの有...

SMS送信のカウントダウンを実装するJavaScript

この記事では、SMS送信のカウントダウンを実装するためのJavaScriptの具体的なコードを参考ま...