nginxリバースプロキシによるセッション障害の問題の解決策

nginxリバースプロキシによるセッション障害の問題の解決策

同僚から助けを求められました。バックエンド システムへのログインは成功したものの、システムには正常にログインできず、ログイン ページにジャンプしましたが、別の環境では同じコード セットで問題は発生しませんでした。

背景

Tomcat を使用して、同じプロジェクトに対して 2 つの環境 (開発サーバーに 1 つ、ローカル コンピューターに 1 つ) を展開していたことが判明しましたが、2 つの環境のコード構成はまったく同じでした。両側ともリバース プロキシに同じ nginx を使用します。nginx の構成は次のとおりです。

場所 /health/ {
  proxy_pass http://192.168.40.159:8081/health/; #設定に問題はありません}

場所 /health-dev/ {
  proxy_pass http://192.168.40.202:8080/health/; #問題のある設定}

開発環境へのリバース プロキシ 1 つと、ローカル サービスへのリバース プロキシ 1 つ。

位置

コード構成はまったく同じなので、問題はおそらく nginx リバース プロキシにあります。

両側のロケーションパスは異なる(つまり、ブラウザパスが異なる)が、リバースプロキシのサーバーパスは同じであるため、セッションの基本原理と組み合わせると、次の図に示すように、

  1. ブラウザが初めてページを開くと、サーバーはこのセッションのセッションを作成し、レスポンス ヘッダーを通じてセッション ID をブラウザに渡します。ヘッダーは通常、Set-Cookie: JSESSIONID=xxxxx; Path=xxxx です。
  2. ブラウザが応答を受信した後、ヘッダー Set-Cookie 内のパスの値がブラウザのアドレス パスと一致する場合、ヘッダーの値はブラウザの Cookie に保存されます。
  3. 次回ブラウザがサーバーにリクエストすると、リクエスト ヘッダーを通じて Cookie 内の JSESSIONID 値がサーバーに報告されます。ヘッダーは通常 Cookie: JSESSIONID=xxxx; です。
  4. サーバーはJSESSIONIDを使用して対応するセッションを見つけることができます。

nginxリバースプロキシがこのように構成されている場合

場所 /health-dev/ {
  プロキシパス http://192.168.40.202:8080/health/;
}

ブラウザがhttp://www.domian.com/health-devにアクセスすると、サーバーから返されるSet-Cookieのパス値は/healthになります(途中にリバースプロキシがあるため、サーバーはプロキシ前のパスが何であるかを知らず、サーバーへの最終リクエストのパスに従って設定されます)。図

ブラウザのアクセスアドレスのパス/health-dev Set-Cookieのパス/healthと一致しないため、図に示すように、ブラウザはその値をクッキーに保存しません。

そのため、次回サーバーにリクエストする際に、ブラウザはリクエストCookieヘッダーのJSESSIONID値を設定できず、サーバーは対応するセッションを見つけることができないため、最初のリクエストとして扱い、新しいセッションを作成する、という動作になります。 そのため、ログイン認証に合格したとしても、ブラウザはサーバーから返されたログイン資格情報 (JSESSIONID) を保存せず、次のリクエストで持ち越すため、サーバーは新規リクエストだと認識し、当然、再度ログイン ページにジャンプしてしまいます。

解決する

nginx には、サーバーから返されるSet-Cookie内のパスを変更できるproxy_cookie_path (参照: proxy_cookie_path) コマンドがあります。形式はproxy_cookie_path 原路徑目標路徑です。次のようにproxy_cookie_pathを設定に追加します。

場所 /health-dev/ {
  プロキシパス http://192.168.40.202:8080/health/;
  proxy_cookie_path /health /health-dev;
}

nginx を再起動すると問題は解決します。

nginx リバース プロキシによるセッション無効化の問題を解決する方法についての記事はこれで終わりです。nginx リバース プロキシによるセッション無効化の詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • 長時間接続をサポートする Nginx リバース プロキシ実装の詳細な説明
  • 複数のドメイン名に対する Nginx リバース プロキシを使用した HTTP および HTTPS サービスの実装
  • Nginx リバース プロキシ springboot jar パッケージ プロセス分析
  • 中国語でのNginx設定パラメータの詳細な説明(負荷分散とリバースプロキシ)
  • nginxフォワードプロキシとリバースプロキシの詳細な説明
  • Nginx フォワードプロキシとリバースプロキシの違いと原理分析
  • Nginx フォワード プロキシとリバース プロキシ、および負荷分散機能の構成コード例
  • nginxリバースプロキシを使用するときに長時間接続を維持する方法

<<:  MySQL の乗算と除算の精度の不一致の問題 (除算後の小数点以下 4 桁)

>>:  Vue プロジェクトで addRoutes を使用する際の問題の解決策

推薦する

202 無料の高品質 XHTML テンプレート (1)

ここで 123WORDPRESS.COM はこれらのテンプレートの最初の部分を紹介します。各テンプレ...

MySQL ユーザー権限管理の実装

1. MySQL の権限の概要MySQL には、権限を制御する 4 つのテーブルがあります。user...

Win10 構成 Tomcat 環境変数チュートリアル図

設定する前に、次の操作を行う必要があります。 1. まずjdk bloggerをインストールします。...

MySQL 8.0 WITH クエリの詳細

目次MySQL 8 の WITH クエリについて学ぶ1. 例3. 練習するMySQL 8 の WIT...

初心者のためのWebページ作成: HTMLのハイパーリンクAタグの使い方を学ぶ

ハイパーリンク a タグはリンク ポイントを表し、英語の単語「anchor」の略語です。その機能は、...

Linux での MySQL のインストールに関するチュートリアル

目次1. 古いバージョンを削除する2. サーバーのカーネルタイプを確認し、適切なバージョンをダウンロ...

MySQLの基本操作学習ノートテーブル

テーブルを作成テーブルテーブル名を作成create table if not exists 表名 m...

nginx ip ブラックリストの動的禁止の例

ウェブサイトが悪意を持ってリクエストされた場合、IP アドレスをブラックリストに登録することは重要な...

サーバー間のファイル バックアップ ソリューション、サーバー ファイルを別のサーバーに自動的にバックアップする方法は?

多くの組織ではファイル サーバーをバックアップする必要があり、あるサーバーから別のファイル サーバー...

Vue3の組み込みコンポーネントであるTeleportの使い方を詳しく説明します

目次1. テレポートの使用2. モーダルダイアログコンポーネントを完成させる3. コンポーネントのレ...

MYSQLはUnionを使用して2つのテーブルのデータを結合し、表示します。

UNION演算子の使用union : 2 つ以上の SELECT ステートメントの結果を 1 つの...

Reactのコンポーネント共同利用実装

目次ネスティング親子コンポーネント通信ブラザーコンポーネント通信撤回するReact の Linked...

一般的な XHTML タグの紹介

<br />しばらくの間、多くの人が XHTML の使い方を知らないことに気付きました。...

Vuex環境の詳細な説明

目次Vuex環境を構築する要約するVuex環境を構築するsrcディレクトリにフォルダstoreを作成...

Dockerコンテナ相互接続の予備的な実践についての簡単な説明

1. Dockerコンテナ間の相互接続Docker は現在、軽量の仮想化ソリューションとなっています...