nginxリバースプロキシを介したデバッグコードの実装

nginxリバースプロキシを介したデバッグコードの実装

背景

現在、会社のプロジェクトは、フロントエンドとバックエンドが分離された方法で開発されています。新しい開発要件やバグ修正のために、フロントエンドをローカル開発環境に直接接続してデバッグしたい場合がありますが、フロントエンドのコードがないため、フロントエンドによって展開されたテスト環境を介してのみテストできます。最も簡単な方法は、ホストを直接変更して、バックエンドテスト環境のドメイン名をローカルIPにポイントすることです。これは、HTTPプロトコルサービスでは非常に簡単に実行できますが、会社のテスト環境はすべてHTTPSであり、ローカルサービスはHTTPプロトコルです。ホストを変更しても、プロトコルが異なるためリクエストは失敗するため、ローカルサービスをHTTPSにアップグレードする必要があります。

プラン

実は、Springboot自体はHTTPSをサポートしています(howto-configure-ssl)が、これにはプロジェクトコードの変更が必要であり、あまりエレガントではありません。そこで、 nginxを使用してローカルサービスに直接リバースプロキシしたいと思います。この方法では、 nginxレベルでHTTPSを行うためにコードを変更する必要はありません。后端測試環境域名nginxサービスのIPにポイントするようにホストを変更するだけで済み、他のHTTPサービスの開発やデバッグにも適用できます。

証明書の発行

まず、nginx の SSL 構成用の証明書セットを生成する必要があります。openssl ツールopenssl使用して、根證書と対応する服務證書のセットを生成します。

ルート証明書の生成

# RSA秘密鍵を生成する openssl genrsa -out root.key 2048
# 秘密鍵を使用してルート証明書を生成します openssl req -sha256 -new -x509 -days 365 -key root.key -out root.crt \
  -subj "/C=CN/ST=GD/L=SZ/O=lee/OU=work/CN=fakerRoot"

サーバー証明書の生成

# RSA秘密鍵を生成する openssl genrsa -out server.key 2048
# SAN拡張子を持つ証明書署名要求ファイルを生成する openssl req -new \
  -sha256 \
  -key サーバー.キー \
  -subj "/C=CN/ST=GD/L=SZ/O=lee/OU=work/CN=xxx.com" \
  -reqexts SAN \
  -config <(cat /etc/pki/tls/openssl.cnf \
    <(printf "[SAN]\nsubjectAltName=DNS:*.xxx.com,DNS:*.test.xxx.com")) \
  -out サーバー.csr
# 以前に生成したルート証明書を使用して発行します openssl ca -in server.csr \
  -md sha256 \
  -keyfile ルート.key \
  -cert ルート.crt \
  -拡張機能SAN \
  -config <(cat /etc/pki/tls/openssl.cnf \
    <(printf "[SAN]\nsubjectAltName=DNS:xxx.com,DNS:*.test.xxx.com")) \
  -out サーバー.crt

これにより、3 つの重要なファイルが作成されます。

  • root.crt : ルート証明書
  • server.key : サーバー証明書の秘密鍵
  • server.crt : サーバー証明書
注: 生成されたサーバー証明書のドメイン名は、テスト環境がアクセスするドメイン名をサポートしている必要があります。そうでない場合、ブラウザは証明書が安全ではないというメッセージを表示します。

nginx の設定

便宜上、 dockerを使用してアクセス用の nginx コンテナを直接起動し、証明書と構成ファイルを対応するディレクトリにマウントします。

nginx.conf

サーバー{
  443 ssl を聴く;
  サーバー名_;
  ssl_certificate "/usr/local/nginx/ssl/server.pem";
  ssl_certificate_key "/usr/local/nginx/ssl/server.key";
  位置 / {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header ホスト $http_host;
    proxy_set_header X-NginX-Proxy が true である;
    proxy_set_header アップグレード $http_upgrade;
    proxy_set_header 接続「アップグレード」;
    プロキシパス http://127.0.0.1:3000;
    proxy_redirect オフ;
    プロキシ_http_バージョン 1.1;
  }
}

ssl_certificatessl_certificate_keyを設定してサーバーの証明書と秘密鍵を指定し、 proxy_passで開発環境のアクセスアドレスを指定します。

起動する

docker run -d --name https -p 443:443 -v ~/forword/ssl:/usr/local/nginx/ssl -v ~/forword/config/nginx.conf:/etc/nginx/conf.d/default.conf nginx

nginx 構成および証明書関連ファイルを対応するディレクトリにマウントし、ポート 443 を公開して、サービス開始後に https 経由でローカル開発環境にアクセスできるようにします。

ルート証明書をインストールする

サービス証明書は自己署名されており、ブラウザによって信頼されないため、根證書オペレーティング システムにインストールする必要があります。

Chromeブラウザを開き、「設定」->「詳細設定」->「証明書の管理」

信頼されたルート証明機関 -> インポート

以前に生成したルート証明書root.crtを選択してインポートします

ホストの変更

デバッグが必要な場合は、ローカル サービスを起動し、ホストでテストするドメイン名をnginxサーバーの IP に解決し、フロントエンド リクエストを開発環境に転送するだけです。証明書はブラウザーのアドレス バーの小鎖圖標で確認でき、検証済みのサービスが正常にデプロイされています。

追記

実際、この記事では 2 つの解決策が紹介されています。実際には、中間者攻撃であるfidderを使用するなど、他の解決策もありますが、ここでは詳しく説明しません。

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Nginx フォワードプロキシとリバースプロキシの違いと原理分析
  • Nginx フォワード プロキシとリバース プロキシ、および負荷分散機能の構成コード例
  • Nginx リバース プロキシでセッション永続性を実装する 2 つの方法の詳細な説明
  • nginxリバースプロキシのマルチポートマッピングの実装
  • Nginx リバース プロキシはポート 80 のリクエストを 8080 に転送します
  • Nginxリバースプロキシ設定でプレフィックスが削除される
  • nginx を使用して同じドメイン名で複数の Vue プロジェクトをデプロイし、リバース プロキシを使用する方法
  • Nginx リバース プロキシ springboot jar パッケージ プロセス分析

<<:  MySql 8.0.16 バージョンのインストールでは、「UTF8B3」ではなく「UTF8B4」が使用されるように求められます。

>>:  MySQL DISTINCTの基本実装原理の詳細な説明

推薦する

mysql 基本操作文コマンドの詳細な説明

1. MySQLに接続するフォーマット: mysql -h ホストアドレス -u ユーザー名 -p ...

echarts ワードクラウドチャートを使用した Vue の実践記録

echartsワードクラウドはechartsの拡張版ですhttps://echarts.apache...

vue3 でブロック崩しゲームを開発する方法をステップバイステップで教えます

序文vue3 を使った例をいくつか書いてみましたが、Vue3 のコンポジション API はよく設計さ...

dockerコンテナは直接実行され、pingを介してパブリックIP操作を取得します。

コンテナを通じてローカル パブリック IP アドレスを取得します。ローカル IP アドレスを使用して...

Dockerコンテナ内のホストのホスト名が取得できない問題の解決方法

Node.js環境でテストが通っています。他の言語でも同様です。環境変数を取得する方法を使うだけです...

ウェブサイトをより高く、よりデザイン的に見せる方法

「ウェブサイトを高級感のあるものにするにはどうすればいいでしょうか? それともデザイン重視にすればい...

JavaScript で外部変数にアクセスするサブ関数の 3 つのソリューション

序文Web ページを作成するときに、次のような状況に遭遇することはよくあります。 <本文>...

MySQL の主キーがクエリを高速化するために数値を使用するか UUID を使用するかについての簡単な分析

実際の開発では、MySQL の主キーは重複できず、主キーが自動的にインクリメントされることがあります...

MySQLのconcat関連関数の詳細な説明

1. concat() 関数機能: 複数の文字列を 1 つの文字列に連結する構文: concat(s...

Linux userdel コマンドの使用法

1. コマンドの紹介userdel (ユーザー削除) コマンドは、ユーザー アカウントと関連ファイル...

MySQL 5.7.17 最新インストールチュートリアル(画像とテキスト付き)

mysql-5.7.17-winx64 は MySQL の最新バージョンです。インストールは無料で...

Linux は、Deepin がルートユーザーとして Google Chrome ブラウザを起動できない問題を解決します

Deepin がルートユーザーとして Google Chrome ブラウザを起動できない問題を解決す...

Element UI で自動サイズ調整テキストエリアの高さを設定する方法

Element UIのtextarea input自動サイズに設定すると、テキストボックスのデフォル...

border-radius 値の設定に関する質問

問題記録今日はプログレスバーに似た小さなコンポーネントを完成させるつもりでした。プロトタイプは次のよ...

ウェブページの内部アンカーポイントを実現するための純粋なCSSの上下オフセットコード例

最近、「フットボール ナビゲーション」Web サイトに取り組んでいるときに、上部の固定ナビゲーション...