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の使用例

推薦する

Tomcat でタイムアウトしたセッションを監視および削除する方法

序文偶然、30 分の Tomcat セッション時間は、セッションが作成された後、30 分間のみ有効で...

UDP DUP タイムアウト UPD ポート状態検出コード例

以前、単純な UDP サーバーとクライアントの例を書きましたが、その中で、自分自身をクライアントと見...

VS2019をMySQLデータベースに接続するプロセスと一般的な問題の概要

今日の午後からVS2019をMySQLで使えるのではないかと思い、いろいろ環境構築を始めました。プロ...

JS でシンプルな画像カルーセル効果を実現

この記事では、シンプルな画像カルーセル効果を実現するためのJSの具体的なコードを参考までに紹介します...

Windows 10 Home Edition に Docker をインストールする方法

最近、プロジェクトをアップグレードするために Docker を使用しました。これまで使用したことがな...

MySQLがlocalhost経由でデータベースに接続できない問題に対する完璧な解決策

問題:あるサーバー上の PHP プログラムは、localhost アドレス経由でデータベースに接続で...

MySQL インストール図の概要

MySQL 5.5 のインストールと設定方法のグラフィックチュートリアルMySQL 5.5 のインス...

Vue ディレクティブ v-html と v-text

目次1. v-text テキストレンダリング命令2. v-html 1. v-text テキストレン...

MySQL複合インデックスの概要

目次1. 背景2. 複合インデックスを理解する3. 左端一致原則4. フィールド順序の影響5. 単一...

MySQL 5.7.20 zip インストール チュートリアル

MySQL 5.7.20 zipインストール、具体的な内容は次のとおりです(1)圧縮パッケージを解凍...

Docker で MySQL データベースを使用して LAN アクセスを実現する

1. MySQLイメージを取得する docker pull mysql:5.6注: mysql5.7...

Docker ロード後にイメージ名が none になる問題の解決方法

最近、docker load -i コマンドを使用してイメージ パッケージを圧縮した後、イメージ名と...

Mysql データベースのマスタースレーブ同期構成

目次Mysql マスタースレーブ同期構成1. 2つのmysqlをインストールする2. MySQL設定...

WeChatミニプログラム公式顔認証の詳しい説明

ミニプログラムはユーザーの個人情報を収集してアップロードしましたが、拒否されました。こんにちは、ミニ...

スライディングカルーセル効果を実現する js

この記事では、スライディングカルーセル効果を実現するためのjsの具体的なコードを参考までに共有します...