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.
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!