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

推薦する

SNMP4J サーバー接続タイムアウト問題の解決策

弊社のネットワーク管理センターは管理センター兼サーバーとして機能します!各管理対象デバイスは、TCP...

入力タグの名前と値の違い

type はブラウザでの入力と出力に使用されるコントロールです (たとえば、type="t...

Linux のスケジュールタスク Crontab コマンドの使用に関する詳細な説明と概要

crontab コマンドは、Unix および Linux で定期的な実行命令を設定するために使用され...

MySQL のマスター スレーブ レプリケーション オプションをオンラインで変更する方法

序文: MySQL で最も一般的に使用されるアーキテクチャは、マスター スレーブ レプリケーションで...

Reactの状態の理解についての簡単な分析

複雑なコンポーネント (クラス コンポーネント) と単純なコンポーネント (関数コンポーネント) を...

MYSQL ローカルインストールと問題解決

序文この記事はかなり詳細で、少し面倒です。他のチュートリアル ドキュメントでは多くの手順が省略されて...

純粋な CSS で実装された 3 つの通知バーのスクロール効果

序文通知バー コンポーネントは、比較的一般的なコンポーネントです。基本的に、すべてのサイトにこのよう...

Linux でのマルチスレッドプログラミング例の分析

1 はじめにスレッド技術は 1960 年代にすでに提案されていましたが、マルチスレッドがオペレーティ...

ウェブサイト標準の検証方法を通じてFlashページを共有する方法

1. 埋め込みは違法です<embed> タグは Netscape のプライベート タグで...

Vue2 キューブUI 時間セレクターの詳細な説明

目次序文1. 需要と効果必要効果2. コードの実装index.vue(html)日付方法テスト結果3...

MySQL 8.0.19 winx64 インストールチュートリアルと Windows 10 での初期パスワードの変更

この記事では、参考までにMySQL 8.0.19 winx64のインストールチュートリアルを紹介しま...

MySQL 5.7 でルートパスワードを忘れた後に変更する方法の詳細なチュートリアル

序文長い間、MySQL のアプリケーションおよび学習環境は MySQL 5.6 以前のバージョンであ...

XHTML の一般的な構造タグ

構造本文、見出し、HTML、タイトル文章abbr、頭字語、アドレス、引用ブロック、br、引用、コード...

MySQL5.7.17 winx64 インストール バージョン構成方法 Windows Server 2008 R2 でのグラフィック チュートリアル

参考までに、Winでmysql5.7をインストールします。具体的な内容は次のとおりです。 @Auth...

Windows10システムにMySQL 5.7.17をインストールする

オペレーティング システム win10 MySQL は、公式 Web サイトからダウンロードした 6...