>  기사  >  운영 및 유지보수  >  nginx에서 포트를 재사용하는 방법

nginx에서 포트를 재사용하는 방법

(*-*)浩
(*-*)浩원래의
2019-06-11 09:24:489648검색

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을 수신합니다. 백엔드에는 두 가지 서비스 세트가 있습니다. 하나는 HTTPS(TLS1.2/1.3 활성화) 웹 사이트 서비스이고 다른 하나는 SSH 서비스입니다. 구현하려면 이 두 서비스 세트가 동일한 포트(구성된 포트 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.