nginx-1.15.2 バージョンでは $ssl_preread_protocol 変数が追加されており、ストリーム リバース プロキシを使用するときに接続が SSL/TLS プロトコルであるか非 SSL/TLS プロトコルであるかを事前に決定できます。同じポートを使用して異なるサービスを転送します。
stream_ssl_preread モジュールは、SSL または TLS 接続の最初の ClientHello メッセージをチェックし、いくつかの値を抽出します。接続を管理するために使用されます。バージョン 1.15.2 で追加された $ssl_preread_protocol 変数は、メッセージ ClientHello の client_version フィールドから最新の SSL/TLS バージョン番号を取得します。 Supported_versions 拡張子 ClientHello がメッセージ内に存在する場合、変数は TLSv1.2/TLSv1.3 に設定されます。
例: リバース プロキシ サーバーで Nginx を実行し、ポート 443 をリッスンします。バックエンドには 2 つのサービス セットがあり、1 つは HTTPS (TLS1.2/1.3 対応) Web サイト サービスで、もう 1 つは SSH です。これら 2 つのサービス セットが同じポート (構成されたポート 443) 上で実行されることを認識する必要があります - エントリ リクエストは Nginx によって自動的に区別されます。
簡単のため、今回は Docker 環境を直接使用します
nginx バージョン
# docker exec -it nginx nginx -V nginx version: nginx/1.15.10 built by gcc 8.2.0 (Alpine 8.2.0) built with OpenSSL 1.1.1b 26 Feb 2019 ...<省略若干行>...
ディレクトリ ファイル
# tree ./nginx-with-L4-reuse/./nginx-with-L4-reuse/ ├── config│ └── nginx │ ├── conf.d │ │ └── default.conf │ ├── fastcgi.conf │ ├── fastcgi_params │ ├── mime.types │ └── nginx.conf └── docker-compose.yaml 3 directories, 6 files
docker-compose.yaml
# docker-compose.yaml version: "2.4" services: nginx: container_name: nginx image: nginx:alpine network_mode: host volumes: - ./config/nginx:/etc/nginx/:ro ports: - "443:443" restart: always
nginx.conf
user nginx; worker_processes 2; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; events { worker_connections 1024; } stream { log_format stream '{"@access_time":"$time_iso8601",' '"clientip":"$remote_addr",' '"pid":$pid,' '"pro":"$protocol",' '"ssl_pro": "$ssl_preread_protocol"', '"pro":"$protocol",' '"stus":$status,' '"sent":$bytes_sent,' '"recv":$bytes_received,' '"sess_time":$session_time,' '"up_addr":"$upstream_addr",' '"up_sent":$upstream_bytes_sent,' '"up_recv":$upstream_bytes_received,' '"up_conn_time":$upstream_connect_time,' '"up_resp_time":"$upstream_first_byte_time",' '"up_sess_time":$upstream_session_time}'; upstream ssh { server 192.168.50.212:22; } upstream web { server 192.168.50.215:443; } map $ssl_preread_protocol $upstream { default ssh; "TLSv1.2" web; "TLSv1.3" web; } # SSH and SSL on the same port server { listen 443; proxy_pass $upstream; ssl_preread on; access_log /var/log/nginx/stream_443.log stream; } }
$ssl_preread_protocol は IP 層でさまざまなビジネス構成を実装します。これは、機能上の制限はありますが、特定のニーズにとって非常に意味があります。ただし、Tengine-2.3.0 ではドメイン名転送をベースとした IP 層が実装されており、おそらくこの機能は Nginx にも導入されるでしょう。
Nginx 関連の技術記事の詳細については、Nginx の使用法チュートリアル 列にアクセスして学習してください。
以上がnginxでポートを再利用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。