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

推薦する

CSS の新機能には、コントロールページの再描画と再配置の問題が含まれています

新しい CSS プロパティ contain を紹介する前に、読者はページの再描画と再配置が何であるか...

ウェブサイトレイアウトにおける CSS の計算関数 calc の例

calc は数値を計算するために使用される CSS 関数です。長さ、角度、時間などを計算できます。 ...

PHP+nginx サービス 500 502 エラーのトラブルシューティングのアイデアの詳細な説明

概要オンラインサービスへのアクセス中に 500 または 502 エラーが発生した場合、緊急処理とトラ...

MySQL の Docker インストールと設定手順

目次序文環境インストールMySQLコンテナを作成して起動する思い出させるMySQLコンテナコマンドを...

docker compose を使ってワンクリックで分散構成センター Apollo を展開するプロセスの詳細な説明

導入分散について話すときは、分散構成センター、分散ログ、分散リンク トラッキングなどについて考える必...

CSS スタイルを HTML 外部スタイルシートにインポートする方法

リンクインスタイルとは、すべてのスタイルを 1 つ以上の外部スタイルシート ファイルに配置することで...

Linux での MySQL 5.6.24 (バ​​イナリ) 自動インストール スクリプト

この記事では、Linux環境でのmysql5.6.24自動インストールスクリプトコードを参考までに共...

Tencent Cloud Serverの構築方法を説明します(グラフィックチュートリアル)

この記事は元々ブロガーのWeiwei Miaoによって書かれたものです。ブログホームページ: htt...

MySQLデータベースホスト127.0.0.1とlocalhostの違い

私の友人の多くは、127.0.0.1 と localhost の違いがわからず、問題に遭遇するかもし...

Mysqlデータテーブルでワームレプリケーションを使用する方法

簡単に言えば、MySQL ワーム レプリケーションは、クエリされたデータを指定されたデータ テーブル...

MySQL サービスとデータベース管理

目次1. サービスの開始と停止の手順1.1 Windows での MySQL 5.7 の公式 MSI...

CSSアニメーションでポイント獲得効果を実現するアイデアを詳しく解説

最近のプロジェクトでは、ポイントを集める効果を作成する必要があります。 ボスの説明によると、この効果...

CentOS 7 で MySQL 接続数が 214 に制限される問題の解決方法

問題を見つける最近、プロジェクトで問題が発生しました。接続が多すぎるため、「接続が多すぎます」という...

Vueにおける混合継承の詳細な説明

目次混合継承の影響: 1. 継承Vue.extend メソッド​プロパティを拡張する2. ミックスイ...

CSS calc() の数式に関する詳細な理解

数式 calc() は CSS の関数であり、主に数学演算に使用されます。 calc() を使用する...