Nginxドメイン名転送のhttpsアクセスの実装

Nginxドメイン名転送のhttpsアクセスの実装

事前に一言:

突然、複数のドメイン名のアクセスを https に転送するというタスクを受け取りました。実際、Niginx の使い方は非常に簡単で、ドキュメントも充実しています (Tencent Cloud にしろ Alibaba Cloud にしろ)。この落とし穴に陥った理由は、Niginx サーバーに不慣れで、回り道をしたためです。

1. 迂回: Tomcat は SSL をサポートしています

Tencent Cloud Tomcat サーバー証明書の構成

server.xmlファイルを変更する

<コネクタ 
   ポート="443" 
   プロトコル="org.apache.coyote.http11.Http11NioProtocol" 
   SSL 有効 = "true" 
   スキーム="https" 
   セキュア="true" 
   keystoreFile="conf\ssl\生成された証明書名 (相対パスを使用します.jks)" 
   キーストアタイプ="JKS" 
   keystorePass="証明書に対応するパスワード" 
   クライアント認証="false" 
   sslプロトコル="TLSv1+TLSv1.1+TLSv1.2"
   最大スレッド数="150" 暗号="TLS_RSA_WITH_AES_128_CBC_SHA、TLS_RSA_WITH_AES_256_CBC_SHA、TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA、TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256、TLS_RSA_WITH_AES_128_CBC_SHA256、TLS_RSA_WITH_AES_256_CBC_SHA256">
</コネクタ>

<!-- ポート 8009 で AJP 1.3 コネクタを定義します -->
<コネクタ ポート="8209" プロトコル="AJP/1.3" リダイレクト ポート="8443" シークレット必須="" useBodyEncodingForURI="true" URIEncoding="UTF-8"/>

keystoreType="JKS": この設定はAlibaba Cloudとは異なるので、変更することを忘れないでください。

<Engine defaultHost="自分のドメイン名" name="Catalina" jvmRoute="tomcat1" URIEncoding="UTF-8">
 <クラスタークラス名="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
 <レルムクラス名="org.apache.catalina.realm.LockOutRealm">
  <レルム クラス名="org.apache.catalina.realm.UserDatabaseRealm" リソース名="UserDatabase"/>
 </レルム>
 <Host name="自分のドメイン名" appBase="webapps" unpackWARs="true" autoDeploy="true">
  <Valve クラス名="org.apache.catalina.valves.AccessLogValve" ディレクトリ="logs"
    プレフィックス="localhost_access_log" サフィックス=".txt"
    パターン="%h %l %u %t &quot;%r&quot; %s %b" />
 </ホスト>
</エンジン>

同僚から設定だけで済むと聞きました。同じことが起きました。サーバーを起動したらポート443も占有されてしまいました。本当に落とし穴でした。転送が不要な場合は、設定を変更できます。

nginx の起動に失敗しました。0.0.0.0:443 への bind() が失敗しました (10013: アクセス権限によって禁止されている方法でソケットにアクセスしようとしました

2. 話を元に戻しましょう

2.1 要件の概要

サーバー(Tencent Cloud サーバーの IP アドレス)に複数のサービスが展開されており、異なるドメイン名で異なるサービスにアクセスする必要がある場合、Nginx プロキシを介してドメイン名転送を実行し、SSL モジュールを構成することで https アクセスを実現できます。 (私のサーバーは Windows システムを使用しています。SSL モジュールがない場合は、自分で有効にする必要があります。デフォルトでサポートされています。)

1 台のサーバーに同時に 3 つのサービス (サービス A、サービス B、サービス C) を展開します。サービスは、次のドメイン名で構成する必要があります。

  • ドメイン名 pangsir01.domain.com はサービス A に対応します。
  • ドメイン名 pangsir02.domain.com はサービス B に対応します。
  • ドメイン名 pangsir03.domain.com はサービス C に対応します。

サービスには https 経由でアクセスし、http リクエストは https にリダイレクトされます。

2.2 サービスプロキシ設定

ポート 443 でリッスンするように Nginx を構成します (== Tomcat の構成のために長い間ここで行き詰まりましたが、失敗しました ==)、ドメイン名転送と https アクセスを実装します。この例で使用される証明書は、CRT 形式の証明書です。

(1)サービスAの構成

サーバー{
 listen 443 ssl; #リッスンポート、Nginx1.5以降ではserver_nameの使用を推奨 pangsir01.domain.com; #リクエストドメイン名 ssl_certificate ssl/certificate name A.crt; #crt証明書パス、保存場所 Nginxのconf/sslフォルダ、絶対パスを使用できます ssl_certificate_key ssl/certificate name A.key; #crt証明書キーパス ssl_session_timeout 5m; #セッションタイムアウト ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; #暗号化アルゴリズム ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #SSLプロトコル #すべてのリクエストを傍受する location / {
  proxy_http_version 1.1; #プロキシが使用するhttpプロトコル proxy_set_header Host $host; #ヘッダーにリクエストホスト情報を追加 proxy_set_header X-Real-IP $remote_addr; #ヘッダーにリクエストソースIP情報を追加 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #プロキシレコードを追加 proxy_pass http://127.0.0.1:8001; #サービスAのアクセスアドレス}
}

(2)サービスBの構成

サーバー{
 listen 443 ssl; #リッスンポート、Nginx1.5以降ではserver_nameの使用を推奨 pangsir02.domain.com; #リクエストドメイン名 ssl_certificate ssl/証明書名 B.crt; #crt証明書パス、保存場所 Nginxのconf/sslフォルダ、絶対パスを使用できます ssl_certificate_key ssl/証明書名 B.key; #crt証明書キーパス ssl_session_timeout 5m; #セッションタイムアウト ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; #暗号化アルゴリズム ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #SSLプロトコル #すべてのリクエストを傍受する location / {
  proxy_http_version 1.1; #プロキシが使用するhttpプロトコル proxy_set_header Host $host; #ヘッダーにリクエストホスト情報を追加 proxy_set_header X-Real-IP $remote_addr; #ヘッダーにリクエストソースIP情報を追加 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #プロキシレコードを追加 proxy_pass http://127.0.0.1:8002; #サービスBのアクセスアドレス}
}

(3)サービスCの構成

サーバー{
 listen 443 ssl; #リッスンポート、Nginx1.5以降ではserver_nameの使用を推奨 pangsir03.domain.com; #リクエストドメイン名 ssl_certificate ssl/証明書名 C.crt; #crt証明書パス、保存場所 Nginxのconf/sslフォルダ、絶対パスを使用できます ssl_certificate_key ssl/証明書名 C.key; #crt証明書キーパス ssl_session_timeout 5m; #セッションタイムアウト ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; #暗号化アルゴリズム ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #SSLプロトコル #すべてのリクエストを傍受する location / {
  proxy_http_version 1.1; #プロキシが使用するhttpプロトコル proxy_set_header Host $host; #ヘッダーにリクエストホスト情報を追加 proxy_set_header X-Real-IP $remote_addr; #ヘッダーにリクエストソースIP情報を追加 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #プロキシレコードを追加 proxy_pass http://127.0.0.1:8003; #サービスBのアクセスアドレス}
}

2.3 HTTPリクエストの自動転送

サーバー構成を追加し、ポート80をリッスンし、すべてのドメイン名をhttpsにリダイレクトします。

サーバー{
 listen 80; #リッスンポート server_name a.domain.com b.domain.com c.domain.com; #ドメイン名を要求 return 301 https://$host$request_uri; #https アクセスにリダイレクトします。
}

ここで私のニーズは満たされました。次のコンテンツは拡張コンテンツです。記録してください。

3. WebSocketのSSL設定

サービス A で websocket が使用されている場合 (アクセス インターフェイスが /websocket)、ws プロトコルを wss プロトコルに置き換える必要があります。サービス A のサーバー構成に場所構成を追加して、別のプロキシの websocket をインターセプトできます。

変更後のサービス A の構成:

サーバー{
  listen 443 ssl; #リッスンポート server_name pangsir01.domain.com; #リクエストドメイン名 ssl_certificate ssl/証明書名 A.crt; #crt証明書パス ssl_certificate_key ssl/証明書名 A.key; #crt証明書キーパス ssl_session_timeout 5m; #セッションタイムアウト ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; #暗号化アルゴリズム ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #SSLプロトコル #すべてのリクエストを傍受 location / {
   proxy_http_version 1.1; #プロキシが使用するhttpプロトコル proxy_set_header Host $host; #ヘッダーにリクエストホスト情報を追加 proxy_set_header X-Real-IP $remote_addr; #ヘッダーにリクエストソースIP情報を追加 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #プロキシレコードを追加 proxy_pass http://127.0.0.1:8001; #サービスAのアクセスアドレス}
  
  #Websocketリクエストの場所をインターセプトする /websocket {
   プロキシパス http://127.0.0.1:8001;
   プロキシ_http_バージョン 1.1;
   proxy_set_header アップグレード $http_upgrade;
   proxy_set_header 接続「アップグレード」;
  }
 }

Nginxドメイン名転送httpsアクセスの実装に関するこの記事はこれで終わりです。より関連性の高いNginxドメイン名転送httpsアクセスコンテンツについては、123WORDPRESS.COMの以前の記事を検索するか、以下の関連記事を引き続き閲覧してください。今後とも123WORDPRESS.COMをよろしくお願いいたします。

以下もご興味があるかもしれません:
  • ドメイン名 http および https に基づいてコンテンツを配信するための Nginx 構成例
  • Nginx で複数の HTTPS ドメイン名を設定する方法
  • NGINX が https から http にジャンプするためのソリューションの詳細な説明
  • nginx に https アクセスを強制する方法 (http が https にジャンプします)
  • HTTPS アクセスを実現するための Nginx 構成 SSL 証明書の詳細な説明
  • nginxでHTTPSを設定する方法の詳細な説明
  • Nginx が http を https に変換する詳細なプロセス

<<:  MySQL の group by と order by を一緒に使用する方法

>>:  WeChat ミニプログラム 宝くじ番号ジェネレーター

推薦する

three.js を使って立体的な矢印線を描く詳細な手順

需要: この需要は緊急に必要です!地下鉄のシーンでは、脱出経路を示す矢印を描かなければなりません。こ...

Vue3とElectronを使ったデスクトップアプリケーションの詳しい説明

目次Vue CLIはVueプロジェクトを構築しますVue プロジェクトをマークダウン エディターに変...

デザイン理論: テキストの読みやすさと可読性

<br />少し前に、ビジネス上の必要性から、ラップトップに Souba をインストール...

Ubuntu 16.04 64ビット版を3つのステップで32ビットプログラムと互換性を持たせる

ステップ1: システムのアーキテクチャを確認する dpkg --print-architecture...

CSS の複数行テキストがオーバーフローする場合の省略記号の例

複数行のテキストがオーバーフローすると省略記号が表示されますこの記事では 2 つの方法を推奨します。...

mysql8.0 パスワードを忘れた場合の修正とネットコマンドのサービス名が無効になる問題

cmdにnet start mysqlと入力すると、プロンプトが表示されます: サービス名が無効です...

Linux システムでログを手動でスクロールする方法

ログローテーションは、Linux システムでは非常に一般的な機能です。ログローテーションは、システム...

MySQLのINサブクエリによってインデックスが使用できなくなる問題を解決する

今日は、MySQL IN サブクエリの最適化に関するケーススタディを見ました。最初は少し懐疑的でした...

mysql8.0 でユーザーを作成して権限を付与する際のエラーの解決方法の詳細な説明

質問1:エラーを報告する書き込み方法: GRANT OPTION を使用して、'123123...

CocosCreatorオブジェクトプールの使い方

目次序文:特定の操作ステップ1: プレハブを準備するステップ2: オブジェクトプールを初期化するステ...

MySQL 5.7.18 でパスワードを変更する方法

MySQL 5.7.18 でパスワードを変更する方法: 1. まずMySQLサーバーをシャットダウン...

HTML で div を非表示にする テーブルを非表示にする TABLE または DIV コンテンツの CSS スタイル

今夜、数日間悩まされていた問題を解決しました。本当に解決したかどうかはわかりませんが、解決されている...

Vue の NetEase Cloud Music Player インターフェースを模倣したシンプルな実装プロセス

仕事のプロジェクトのニーズにより、曲の再生が必要となり、さまざまな資料を参考にして、NetEase ...

openlayers6 マップオーバーレイの一般的な 3 つの用途 (ポップアップウィンドウマーカーテキスト)

目次1. 前に書く2. ポップアップウィンドウを実装するためのオーバーレイ2.1 vueページのad...