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 ミニプログラム 宝くじ番号ジェネレーター

推薦する

MySQL 5.x 以降を使用している場合のエラー #1929 列 ''createtime'' の日付時刻値が正しくありません: '''' の簡単な解決方法

MySQL をインストールした後、テーブル データを保存および削除しようとすると、常にエラー メッセ...

Linux仮想マシンを作成し、仮想マシンネットワークを設定する方法に関するVMwareの詳細なチュートリアル

VMware で Linux 仮想マシンを作成し、VMware と仮想マシンのネットワークを設定する...

MySQL 1130例外、リモートログインできない解決策

目次質問: 1. リモートログイン権限を有効にする: 2. MySQLの権限を更新します。 3. テ...

ウェブデザインと制作の一般的な原則をまとめる

<br />関連記事: Web コンテンツ ページ作成に関する 9 つの実用的な提案、W...

MySQL 数千万のビッグデータに対するSQLクエリ最適化の知識ポイントのまとめ

1. クエリを最適化するには、テーブル全体のスキャンを避けてください。まず、where と orde...

jsはキャンバスに基づいて時計コンポーネントを実装します

圧縮アップロード画像、スクラッチカード、ポスター作成、チャートプラグインなど、フロントエンド開発にお...

JSは写真の自動再生効果を実現します

この記事では、写真の自動再生効果を実現するためのJSの具体的なコードを参考までに紹介します。具体的な...

Linuxアカウントファイル制御管理の詳細な手順

Linux システムでは、ユーザーが手動で作成したさまざまなアカウントに加えて、システムまたはプログ...

MySQL InnoDB MRR 最適化ガイド

序文MRR は Multi-Range Read の略で、ランダム ディスク アクセスを削減し、ラン...

Vueはechartsを使用して組織図を描画します

昨日、円形のプログレスバー (Vue 円形プログレスバーを参照してください) についてブログを書きま...

CSSでemを開く正しい方法の詳細な説明

「通常 1em=16px」と言うのはなぜですか?ユーザーのブラウザによってレンダリングされるデフォル...

mysql mycat ミドルウェアのインストールと使用

1. mycatとはエンタープライズアプリケーション開発のための完全にオープンソースの大規模データベ...

JavaScriptにおけるこのポインティング問題の詳細な説明

序文JS の this ポインターは、初心者にとって常に頭痛の種でした。今日は、これが地面に落ちたと...

SQL 最適化チュートリアル: IN クエリと RANGE クエリ

序文「High Performance MySQL」では、インデックスでは範囲フィールドの後の部分が...

MySQL クエリ キャッシュとバッファ プール

1. キャッシュ - クエリキャッシュ次の図は、MySQL 公式サイトから提供されています: MyS...