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

ブログ    

推薦する

HTMLポップアップ透明レイヤーインスタンスのサイズを設定でき、比例することができます

コードをコピーコードは次のとおりです。 <!DOCTYPE html PUBLIC "...

Vueは3段階のナビゲーション表示と非表示を実装します

この記事では、3階層ナビゲーションの表示と非表示を実現するためのVueの具体的なコードを例として紹介...

MySQL トランザクション分析

取引トランザクションはビジネス ロジックの基本単位です。各トランザクションは一連の SQL ステート...

Linux で開いているファイルが多すぎる問題を解決する方法

原因は、プロセスが特定の時点でシステム制限を超える数のファイルと通信リンクを開くことです。 システム...

Vueスロットの使用の詳細

目次1. スロットを使用する理由1.1 スロット1.2 コンポーネントのスロット1.3 例2. この...

CSS+JS で水滴の波紋アニメーション ボタン効果を実装するサンプル コード

コードは次のようになります。 <!DOCTYPE html> <html lang...

カスタムスクロールバー効果を実現するJavaScript

実際のプロジェクトでは、上下のスクロール バーと左右のスクロール バーは DIV 内にないため、右の...

ウェブページをデザインする際に注意すべきいくつかの問題

Web デザインは、個人の好みや Web ページの内容に応じて、デザインのレイアウトが常に変化します...

Tomcat Nginx Redis セッション共有プロセス図

1. 準備ミドルウェア: Tomcat、Redis、Nginx Jar パッケージ: commons...

Ubuntu 18.04 (物理マシン) で OpenWRT 開発環境を構成する方法

1. 仮想マシン(物理マシン)をインストールする仮想マシンまたは物理マシンにインストールできます。 ...

HTML4.0 要素のデフォルトスタイルの配置

コードをコピーコードは次のとおりです。 html、アドレス、引用ブロック、本文、dd、div、 dl...

Vueのフロントエンドとバックエンドのデータのやり取りと表示を理解する方法

目次1. 技術概要2. 技術的な詳細1. インターフェースからバックエンドデータを取得する2. フロ...

MySQLクエリ条件におけるonとwhereの配置の違いの分析

導入今日SQLを書いているときに、問題が発生しました。要件は、データを照会し、スコアと過去 1 週間...

JS 面接の質問: forEach はループから抜け出すことができますか?

この質問をされたとき、私は無知で頭が真っ白になりました。もちろん、正しく答えられませんでした。私はず...

MySQLデュアルマスター(マスターマスター)アーキテクチャ構成ソリューション

企業では、データベースの高可用性は常に最優先事項です。多くの中小企業は、MySQL マスター スレー...