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 を使用する際の問題の解決策

推薦する

VMware ESXi6.7 の簡単なセットアップ(画像とテキスト付き)

1. VMware vSphere の概要VMware vSphere は、業界をリードする最も信...

Linux プラットフォームの MySQL でリモート ログインを有効にする

開発中、MySQL へのリモートアクセスでよく問題に遭遇します。そのたびに検索する必要があり、面倒に...

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

この記事では、参考までにMySQL 8.0.15のインストールと設定方法のグラフィックチュートリアル...

Vueシャトルボックスは上下の動きを実現します

この記事の例では、vueシャトルボックスを上下に動かすための具体的なコードを参考までに共有しています...

htm 初心者ノート(初心者は必ず読んでください)

1. HTMLとは何かHTML (ハイパーテキスト マークアップ言語): ハイパーテキスト マーク...

JS での filter() 配列フィルターの使用

目次1. はじめに2. 方法の紹介3. 使用例要約する1. はじめに配列フィルターは、フロントエンド...

MySQL でインデックス構造として B+ ツリーを使用する利点は何ですか?

序文MySQL では、Innodb と MyIsam の両方がインデックス構造として B+ ツリーを...

CSS フロントエンドページレンダリング最適化属性 will-change の具体的な使用法

序文スクロールやサイズ変更などのスクロール イベントがトリガーされると、トリガーの頻度が非常に高くな...

CentOS での Django プロジェクトのデプロイに関する詳細なチュートリアル

基本環境パゴダ設置サービスパゴダにインストールされた[Pythonプロジェクトマネージャー]パゴダに...

Maven+Tomcat 基本イメージを構築する Docker の実装

序文Javaプログラミングでは、ほとんどのアプリケーションはMavenに基づいて構築されており、配信...

JavaScript データ型の詳細な説明

目次1. リテラル1.1 数値リテラル1.2 浮動小数点リテラル1.3 特別な値1.4 文字列リテラ...

画面なしで無線ネットワークに接続しているときに Raspberry Pi の IP アドレスを見つける方法

あなたがlinuxerだと仮定すると、 windowserだとは想定しません。Windows ユーザ...

LinuxデバッガGDBの基本的な使い方の詳細な説明

目次1. 概要2. gdbデバッグ2.1. ブレークポイントを設定する2.1.1. ブレークポイント...

円形/扇形メニューを2分で実装する方法を教えます(基本バージョン)

序文このプロジェクトでは円形のメニューが必要です。オンラインで検索しましたが、適切なものが見つからな...

ElementUIはel-formフォームリセット機能ボタンを実装します

目次ビジネスシナリオ:効果のデモンストレーション:ビジネスシナリオ: el-form を使用する場合...