ホームページ  >  記事  >  運用・保守  >  nginxでポートを再利用する方法

nginxでポートを再利用する方法

(*-*)浩
(*-*)浩オリジナル
2019-06-11 09:24:489664ブラウズ

nginx-1.15.2 バージョンでは $ssl_preread_protocol 変数が追加されており、ストリーム リバース プロキシを使用するときに接続が SSL/TLS プロトコルであるか非 SSL/TLS プロトコルであるかを事前に決定できます。同じポートを使用して異なるサービスを転送します。

nginxでポートを再利用する方法

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。