Maison  >  Article  >  Opération et maintenance  >  Comment réutiliser les ports dans nginx

Comment réutiliser les ports dans nginx

(*-*)浩
(*-*)浩original
2019-06-11 09:24:489551parcourir

La version nginx-1.15.2 ajoute la variable $ssl_preread_protocol, grâce à laquelle vous pouvez prédéterminer si la connexion est un protocole SSL/TLS ou un protocole non-SSL/TLS lors de l'utilisation du proxy inverse de flux, ainsi atteindre les mêmes ports pour transmettre des services différents.

Comment réutiliser les ports dans nginx

Le module stream_ssl_preread vérifie le message ClientHello initial dans une connexion SSL ou TLS et extrait plusieurs valeurs qui peuvent être utilisé pour gérer la connexion. La variable $ssl_preread_protocol ajoutée dans la version 1.15.2 capture le dernier numéro de version SSL/TLS du champ client_version du message ClientHello. Si l'extension Support_versions ClientHello existe dans le message, la variable est définie sur TLSv1.2/TLSv1.3.

Exemple : Exécutez Nginx sur un serveur proxy inverse et écoutez le port 443. Il existe deux ensembles de services sur le backend, l'un est le service de site Web HTTPS (TLS1.2/1.3 activé) et l'autre est SSH. service , nous devons réaliser que ces deux ensembles de services s'exécutent sur le même port (port configuré 443) - la demande d'entrée est automatiquement distinguée par Nginx.

Pour plus de simplicité, j'utilise directement l'environnement docker

version 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
...<省略若干行>...

Fichier répertoire

 # 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 implémente différentes configurations métier au niveau de la couche IP, ce qui est logique pour certains besoins - bien qu'il existe des limitations fonctionnelles. Cependant, Tengine-2.3.0 a implémenté une couche IP basée sur le transfert de nom de domaine. Peut-être que cette fonctionnalité sera introduite dans Nginx.

Pour plus d'articles techniques liés à Nginx, veuillez visiter la colonne Tutoriel d'utilisation de Nginx pour apprendre !

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn