Aller au contenu

proxy-connect: Support de la méthode CONNECT dans NGINX

Installation

Vous pouvez installer ce module dans toute distribution basée sur RHEL, y compris, mais sans s'y limiter :

  • RedHat Enterprise Linux 7, 8, 9 et 10
  • CentOS 7, 8, 9
  • AlmaLinux 8, 9
  • Rocky Linux 8, 9
  • Amazon Linux 2 et Amazon Linux 2023
dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install nginx-module-proxy-connect
yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install nginx-module-proxy-connect

Activez le module en ajoutant ce qui suit en haut de /etc/nginx/nginx.conf :

load_module modules/ngx_http_proxy_connect_module.so;

Ce document décrit nginx-module-proxy-connect v0.0.2 publié le 24 décembre 2024.


Ce fork est intégré dans NGINX-MOD.

[!CAUTION] La compilation en tant que module dynamique est déconseillée pour le moment, le binaire NGINX patché ne prendra pas en compte le drapeau NGX_HTTP_PROXY_CONNECT. La seule façon appropriée de le faire est de compiler NGINX et le module dynamique en une seule fois, puis de retirer le module pour l'emballage.

[!CAUTION] Le patch existant n'était pas conforme à l'ABI car il ajoutait des champs au milieu.

Ce module fournit un support pour la requête de méthode CONNECT. Cette méthode est principalement utilisée pour tunneler les requêtes SSL à travers des serveurs proxy.

Exemple

Exemple de Configuration

server {
    listen                         3128;

    # résolveur DNS utilisé par le proxy avant
    resolver                       8.8.8.8;

    # proxy avant pour les requêtes CONNECT
    proxy_connect;
    proxy_connect_allow            443 563;
    proxy_connect_connect_timeout  10s;
    proxy_connect_data_timeout     10s;

    # défini par vous-même pour les requêtes non-CONNECT
    # Exemple : proxy inverse pour les requêtes non-CONNECT
    location / {
        proxy_pass http://$host;
        proxy_set_header Host $host;
    }
}
  • La directive resolver DOIT être configurée globalement dans le bloc server {} (ou le bloc http {}).
  • Tout bloc location {}, bloc upstream {} et toute autre directive standard de backend/upstream, comme proxy_pass, n'impactent pas la fonctionnalité de ce module. (Le module proxy_connect n'exécute que la logique pour les requêtes qui utilisent la méthode CONNECT et qui ont un flux de données sous ce tunnel.)
  • Si vous ne souhaitez pas gérer les requêtes non-CONNECT, vous pouvez modifier le bloc location {} comme suit :
        location / {
            return 403 "Les requêtes non-CONNECT sont interdites";
        }
        ```
    
    Exemple pour curl
    ----------------
    
    Avec la configuration ci-dessus ([exemple de configuration](#configuration-example)), vous pouvez accéder à n'importe quel site web https via un tunnel HTTP CONNECT. Un test simple avec la commande `curl` est le suivant :
    
    $ curl https://github.com/ -v -x 127.0.0.1:3128
  • Tentative de connexion à 127.0.0.1... -.
  • Connecté à 127.0.0.1 (127.0.0.1) port 3128 (#0) | curl crée une connexion TCP avec nginx (avec le module proxy_connect).
  • Établir un tunnel proxy HTTP vers github.com:443 -'

    CONNECT github.com:443 HTTP/1.1 -. Host: github.com:443 (1) | curl envoie une requête CONNECT pour créer un tunnel. User-Agent: curl/7.43.0 | Proxy-Connection: Keep-Alive -'

    < HTTP/1.0 200 Connection Established .- nginx répond 200 que le tunnel est établi. < Proxy-agent: nginx (2)| (Le client est maintenant proxifié vers l'hôte distant. Toute donnée envoyée < '- à nginx est maintenant transmise, sans modification, à l'hôte distant)

  • Le proxy a répondu OK à la requête CONNECT

  • Connexion TLS 1.2 utilisant TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 -.
  • Certificat du serveur : github.com |
  • Certificat du serveur : DigiCert SHA2 Extended Validation Server CA | curl envoie la requête "https://github.com" via le tunnel,
  • Certificat du serveur : DigiCert High Assurance EV Root CA | le module proxy_connect va proxifier les données vers l'hôte distant (github.com).

    GET / HTTP/1.1 | Host: github.com (3) | User-Agent: curl/7.43.0 | Accept: / -'

    < HTTP/1.1 200 OK .- < Date: Fri, 11 Aug 2017 04:13:57 GMT | < Content-Type: text/html; charset=utf-8 | Toute donnée reçue de l'hôte distant sera envoyée au client < Transfer-Encoding: chunked | par le module proxy_connect. < Server: GitHub.com (4)| < Status: 200 OK | < Cache-Control: no-cache | < Vary: X-PJAX | ... | ... ... | ... '-

    Le diagramme de séquence de l'exemple ci-dessus est le suivant :
    
    curl nginx (proxy_connect) github.com | | | (1) |-- CONNECT github.com:443 -->| | | | | | |----[ connexion TCP ]--->| | | | (2) |<- HTTP/1.1 200 ---| | | Connexion établie | | | | | | | ========= Le tunnel CONNECT a été établi. =========== | | | | | | | | | [ flux SSL ] | | (3) |---[ GET / HTTP/1.1 ]----->| [ flux SSL ] | | [ Host: github.com ] |---[ GET / HTTP/1.1 ]-->. | | [ Host: github.com ] | | | | | | | | | | | | [ flux SSL ] | | [ flux SSL ] |<--[ HTTP/1.1 200 OK ]---' (4) |<--[ HTTP/1.1 200 OK ]------| [ < page html > ] | | [ < page html > ] | | | | |
    Exemple de configuration pour la requête CONNECT en HTTPS
    --------------------------------------------------
    
    ```nginx
    server {
        listen                         3128 ssl;
    
        # certificat auto-signé généré via la commande openssl
        ssl_certificate_key            /path/to/server.key;
        ssl_certificate                /path/to/server.crt;
        ssl_session_cache              shared:SSL:1m;
    
        # résolveur DNS utilisé par le proxy avant
        resolver                       8.8.8.8;
    
        # proxy avant pour la requête CONNECT
        proxy_connect;
        proxy_connect_allow            443 563;
        proxy_connect_connect_timeout  10s;
        proxy_connect_data_timeout     10s;
    
        # défini par vous-même pour la requête non-CONNECT
        # Exemple : proxy inverse pour les requêtes non-CONNECT
        location / {
            proxy_pass http://$host;
            proxy_set_header Host $host;
        }
    }
    

Exemple pour curl (requête CONNECT en https)

Avec la configuration ci-dessus (exemple de configuration pour la requête CONNECT en https), vous pouvez accéder à n'importe quel site web https via un tunnel HTTPS CONNECT (requête CONNECT en https). Un test simple avec la commande curl est le suivant :

Conseils pour utiliser la commande curl :

  • -x https://... fait que curl envoie une requête CONNECT en https.
  • --proxy-insecure désactive la vérification de la signature ssl pour la connexion ssl établie avec le serveur proxy nginx (https://localhost:3128), mais cela ne désactive pas la vérification avec le serveur backend proxifié (https://nginx.org dans l'exemple ci-dessous).
  • Si vous souhaitez désactiver la vérification de la signature avec le serveur backend proxifié, vous pouvez utiliser l'option -k.
sortie de la commande curl :point_left:

$ curl https://nginx.org/ -sv -o/dev/null -x https://localhost:3128 --proxy-insecure
*   Tentative de connexion à 127.0.0.1:3128...
* TCP_NODELAY défini
* Connecté à localhost (127.0.0.1) port 3128 (#0)
* ALPN, offrant http/1.1
* emplacements de vérification de certificat définis avec succès :
*   CAfile: /etc/ssl/certs/ca-certificates.crt
  CApath: /etc/ssl/certs
} [5 octets de données]
* TLSv1.3 (OUT), poignée de main TLS, Client hello (1):
} [512 octets de données]
* TLSv1.3 (IN), poignée de main TLS, Server hello (2):
{ [112 octets de données]
* TLSv1.2 (IN), poignée de main TLS, Certificat (11):
{ [799 octets de données]
* TLSv1.2 (IN), poignée de main TLS, Échange de clés du serveur (12):
{ [300 octets de données]
* TLSv1.2 (IN), poignée de main TLS, Serveur terminé (14):
{ [4 octets de données]
* TLSv1.2 (OUT), poignée de main TLS, Échange de clés du client (16):
} [37 octets de données]
* TLSv1.2 (OUT), changement de chiffrement TLS, Changer de spécification de chiffrement (1):
} [1 octet de données]
* TLSv1.2 (OUT), poignée de main TLS, Terminé (20):
} [16 octets de données]
* TLSv1.2 (IN), poignée de main TLS, Terminé (20):
{ [16 octets de données]
* Connexion SSL utilisant TLSv1.2 / ECDHE-RSA-AES256-GCM-SHA384
* ALPN, le serveur a accepté d'utiliser http/1.1
* Certificat du proxy :
*  sujet : C=AU; ST=Some-State; O=Internet Widgits Pty Ltd
*  date de début : Nov 25 08:36:38 2022 GMT
*  date d'expiration : Nov 25 08:36:38 2023 GMT
*  émetteur : C=AU; ST=Some-State; O=Internet Widgits Pty Ltd
*  résultat de la vérification du certificat SSL : certificat auto-signé (18), continuation de toute façon.
* allocation du tampon de connexion !
* Établir un tunnel proxy HTTP vers nginx.org:443
} [5 octets de données]
> CONNECT nginx.org:443 HTTP/1.1
> Host: nginx.org:443
> User-Agent: curl/7.68.0
> Proxy-Connection: Keep-Alive
>
{ [5 octets de données]
< HTTP/1.1 200 Connection Established
< Proxy-agent: nginx
<
* Le proxy a répondu 200 à la requête CONNECT
* Phase CONNECT terminée !
* ALPN, offrant h2
* ALPN, offrant http/1.1
* emplacements de vérification de certificat définis avec succès :
*   CAfile: /etc/ssl/certs/ca-certificates.crt
  CApath: /etc/ssl/certs
} [5 octets de données]
* TLSv1.3 (OUT), poignée de main TLS, Client hello (1):
} [512 octets de données]
* Phase CONNECT terminée !
* Phase CONNECT terminée !
{ [5 octets de données]
* TLSv1.3 (IN), poignée de main TLS, Server hello (2):
{ [80 octets de données]
* TLSv1.2 (IN), poignée de main TLS, Certificat (11):
{ [2749 octets de données]
* TLSv1.2 (IN), poignée de main TLS, Échange de clés du serveur (12):
{ [300 octets de données]
* TLSv1.2 (IN), poignée de main TLS, Serveur terminé (14):
{ [4 octets de données]
* TLSv1.2 (OUT), poignée de main TLS, Échange de clés du client (16):
} [37 octets de données]
* TLSv1.2 (OUT), changement de chiffrement TLS, Changer de spécification de chiffrement (1):
} [1 octet de données]
* TLSv1.2 (OUT), poignée de main TLS, Terminé (20):
} [16 octets de données]
* TLSv1.2 (IN), poignée de main TLS, Terminé (20):
{ [16 octets de données]
* Connexion SSL utilisant TLSv1.2 / ECDHE-RSA-AES256-GCM-SHA384
* ALPN, le serveur a accepté d'utiliser http/1.1
* Certificat du serveur :
*  sujet : CN=nginx.org
*  date de début : Dec  9 15:29:31 2022 GMT
*  date d'expiration : Mar  9 15:29:30 2023 GMT
*  subjectAltName : hôte "nginx.org" correspond au certificat "nginx.org"
*  émetteur : C=US; O=Let's Encrypt; CN=R3
*  vérification du certificat SSL ok.
} [5 octets de données]
> GET / HTTP/1.1
> Host: nginx.org
> User-Agent: curl/7.68.0
> Accept: */*
>
{ [5 octets de données]
* Marquer le bundle comme ne supportant pas le multiusage
< HTTP/1.1 200 OK
< Serveur: nginx/1.21.5
< Date: Mon, 06 Mar 2023 06:05:24 GMT
< Content-Type: text/html; charset=utf-8
< Content-Length: 7488
< Last-Modified: Tue, 28 Feb 2023 21:07:43 GMT
< Connection: keep-alive
< Keep-Alive: timeout=15
< ETag: "63fe6d1f-1d40"
< Accept-Ranges: bytes
<
{ [7488 octets de données]
* La connexion #0 à l'hôte localhost est restée intacte

Exemple pour le navigateur

Vous pouvez configurer votre navigateur pour utiliser ce nginx comme serveur PROXY.

  • PARAMÈTRE DE PROXY HTTPS GOOGLE CHROME : guide & config pour savoir comment configurer ce module pour fonctionner sous la couche SSL.

Exemple pour l'authentification de base

Nous pouvons effectuer un contrôle d'accès sur la requête CONNECT en utilisant le module d'authentification de base de nginx.
Voir ce guide pour plus de détails.

Exemple pour le proxy WebSocket

Installer

Sélectionner le patch

  • Sélectionnez le bon patch pour la construction :
  • Tous les fichiers de patch ont été inclus dans le répertoire patch/ de ce module. Vous n'avez pas besoin de télécharger le patch directement depuis la page web.
version nginx activer la phase REWRITE patch
1.4.x ~ 1.12.x NON proxy_connect.patch
1.4.x ~ 1.12.x OUI proxy_connect_rewrite.patch
1.13.x ~ 1.14.x NON proxy_connect_1014.patch
1.13.x ~ 1.14.x OUI proxy_connect_rewrite_1014.patch
1.15.2 OUI proxy_connect_rewrite_1015.patch
1.15.4 ~ 1.16.x OUI proxy_connect_rewrite_101504.patch
1.17.x ~ 1.18.x OUI proxy_connect_rewrite_1018.patch
1.19.x ~ 1.21.0 OUI proxy_connect_rewrite_1018.patch
1.21.1 ~ 1.22.x OUI proxy_connect_rewrite_102101.patch
1.23.x ~ 1.24.0 OUI proxy_connect_rewrite_102101.patch
1.25.0 ~ 1.26.x OUI proxy_connect_rewrite_102101.patch
1.27.1 OUI proxy_connect_rewrite_102101.patch
version OpenResty activer la phase REWRITE patch
1.13.6 NON proxy_connect_1014.patch
1.13.6 OUI proxy_connect_rewrite_1014.patch
1.15.8 OUI proxy_connect_rewrite_101504.patch
1.17.8 OUI proxy_connect_rewrite_1018.patch
1.19.3 OUI proxy_connect_rewrite_1018.patch
1.21.4 OUI proxy_connect_rewrite_102101.patch
1.25.3 OUI proxy_connect_rewrite_102101.patch
  • proxy_connect_<VERSION>.patch désactive la phase REWRITE de nginx pour la requête CONNECT par défaut, ce qui signifie que if, set, rewrite_by_lua et d'autres directives de phase REWRITE ne peuvent pas être utilisées.
  • proxy_connect_rewrite_<VERSION>.patch active ces directives de phase REWRITE.

Construire nginx

  • Construisez nginx avec ce module à partir des sources :
$ wget http://nginx.org/download/nginx-1.9.2.tar.gz
$ tar -xzvf nginx-1.9.2.tar.gz
$ cd nginx-1.9.2/
$ patch -p1 < /path/to/ngx_http_proxy_connect_module/patch/proxy_connect.patch
$ ./configure --add-module=/path/to/ngx_http_proxy_connect_module
$ make && make install

Construire en tant que module dynamique

  • À partir de nginx 1.9.11, vous pouvez également compiler ce module en tant que module dynamique, en utilisant l'option --add-dynamic-module=PATH au lieu de --add-module=PATH sur la ligne de commande ./configure.
$ wget http://nginx.org/download/nginx-1.9.12.tar.gz
$ tar -xzvf nginx-1.9.12.tar.gz
$ cd nginx-1.9.12/
$ patch -p1 < /path/to/ngx_http_proxy_connect_module/patch/proxy_connect.patch
$ ./configure --add-dynamic-module=/path/to/ngx_http_proxy_connect_module
$ make && make install
  • Et ensuite, vous pouvez charger explicitement le module dans votre nginx.conf via la directive load_module, par exemple,
load_module /path/to/modules/ngx_http_proxy_connect_module.so;
  • ❗ Notez que le fichier ngx_http_proxy_connect_module.so DOIT être chargé par le binaire nginx qui est compilé avec le fichier .so en même temps.

Construire OpenResty

  • Construisez OpenResty avec ce module à partir des sources :
$ wget https://openresty.org/download/openresty-1.19.3.1.tar.gz
$ tar -zxvf openresty-1.19.3.1.tar.gz
$ cd openresty-1.19.3.1
$ ./configure --add-module=/path/to/ngx_http_proxy_connect_module
$ patch -d build/nginx-1.19.3/ -p 1 < /path/to/ngx_http_proxy_connect_module/patch/proxy_connect_rewrite_101504.patch
$ make && make install

Suite de tests

  • Pour exécuter l'ensemble de la suite de tests :
$ hg clone http://hg.nginx.org/nginx-tests/

## Si vous utilisez le dernier lua-nginx-module qui nécessite lua-resty-core et
## lua-resty-lrucache, vous devez ajouter la directive "lua_package_path ...;" 
## dans nginx.conf des cas de test. Vous pouvez utiliser la commande suivante :
#
## $ export TEST_NGINX_GLOBALS_HTTP='lua_package_path "/path/to/nginx/lib/lua/?.lua;;";'

$ export TEST_NGINX_BINARY=/path/to/nginx/binary
$ prove -v -I /path/to/nginx-tests/lib /path/to/ngx_http_proxy_connect_module/t/
  • Pour le processus complet de construction et de test de ce module, voir :
  • fichiers de workflow : ici
  • exécutions de tous les workflows : ici

Journal des erreurs

Ce module enregistre son propre message d'erreur commençant par la chaîne "proxy_connect:".
Quelques journaux d'erreurs typiques sont affichés comme suit :

  • Le module proxy_connect essaie d'établir une connexion de tunnel avec le serveur backend, mais le délai de connexion TCP expire.
2019/08/07 17:27:20 [error] 19257#0: *1 proxy_connect: upstream connect timed out (peer:216.58.200.4:443) while connecting to upstream, client: 127.0.0.1, server: , request: "CONNECT www.google.com:443 HTTP/1.1", host: "www.google.com:443"

Directive

proxy_connect

Syntaxe : proxy_connect
Par défaut : aucun
Contexte : server

Active le support de la méthode HTTP "CONNECT".

proxy_connect_allow

Syntaxe : proxy_connect_allow all | [port ...] | [port-range ...]
Par défaut : 443 563
Contexte : server

Cette directive spécifie une liste de numéros de port ou de plages auxquels la méthode proxy CONNECT peut se connecter.
Par défaut, seuls le port https par défaut (443) et le port snews par défaut (563) sont activés.
L'utilisation de cette directive remplacera cette valeur par défaut et autorisera les connexions uniquement aux ports listés.

La valeur all permettra à tous les ports d'être proxifiés.

La valeur port permettra à un port spécifié d'être proxifié.

La valeur port-range permettra à une plage de ports spécifiée d'être proxifiée, par exemple :

proxy_connect_allow 1000-2000 3000-4000; # autoriser la plage de ports de 1000 à 2000, de 3000 à 4000.

proxy_connect_connect_timeout

Syntaxe : proxy_connect_connect_timeout time
Par défaut : aucun
Contexte : server

Définit un délai d'attente pour établir une connexion avec un serveur proxifié.

proxy_connect_data_timeout

Syntaxe : proxy_connect_data_timeout time
Par défaut : 60s
Contexte : server

Définit le délai d'attente entre deux opérations de lecture ou d'écriture successives sur les connexions client ou serveur proxifié. Si aucune donnée n'est transmise dans ce délai, la connexion est fermée.

proxy_connect_read_timeout

Syntaxe : proxy_connect_read_timeout time
Par défaut : 60s
Contexte : server

Obsolète.

Il a la même fonction que la directive proxy_connect_data_timeout pour la compatibilité. Vous pouvez configurer uniquement l'une des directives (proxy_connect_data_timeout ou proxy_connect_read_timeout).

proxy_connect_send_timeout

Syntaxe : proxy_connect_send_timeout time
Par défaut : 60s
Contexte : server

Obsolète.

Il n'a pas de fonction.

proxy_connect_address

Syntaxe : proxy_connect_address address | off
Par défaut : aucun
Contexte : server

Spécifiez une adresse IP du serveur proxifié. L'adresse peut contenir des variables.
La valeur spéciale off est équivalente à aucun, ce qui utilise l'adresse IP résolue à partir du nom d'hôte de la ligne de requête CONNECT.

REMARQUE : Si vous utilisez set $<nginx variable> et proxy_connect_address $<nginx variable> ensemble, vous devez utiliser proxy_connect_rewrite.patch à la place, voir Installer pour plus de détails.

proxy_connect_bind

Syntaxe : proxy_connect_bind address [transparent] | off
Par défaut : aucun
Contexte : server

Fait en sorte que les connexions sortantes vers un serveur proxifié proviennent de l'adresse IP locale spécifiée avec un port optionnel.
La valeur du paramètre peut contenir des variables. La valeur spéciale off est équivalente à aucun, ce qui permet au système d'assigner automatiquement l'adresse IP locale et le port.

Le paramètre transparent permet aux connexions sortantes vers un serveur proxifié de provenir d'une adresse IP non locale, par exemple, d'une adresse IP réelle d'un client :

proxy_connect_bind $remote_addr transparent;

Pour que ce paramètre fonctionne, il est généralement nécessaire d'exécuter les processus de travail nginx avec les privilèges de superutilisateur. Sous Linux, cela n'est pas requis (1.13.8) car si le paramètre transparent est spécifié, les processus de travail héritent de la capacité CAP_NET_RAW du processus maître. Il est également nécessaire de configurer la table de routage du noyau pour intercepter le trafic réseau du serveur proxifié.

REMARQUE : Si vous utilisez set $<nginx variable> et proxy_connect_bind $<nginx variable> ensemble, vous devez utiliser proxy_connect_rewrite.patch à la place, voir Installer pour plus de détails.

proxy_connect_response

Syntaxe : proxy_connect_response CONNECT response
Par défaut : HTTP/1.1 200 Connection Established\r\nProxy-agent: nginx\r\n\r\n
Contexte : server

Définissez la réponse de la requête CONNECT.

Notez qu'elle est uniquement utilisée pour la requête CONNECT, elle ne peut pas modifier le flux de données sur le tunnel CONNECT.

Par exemple :

proxy_connect_response "HTTP/1.1 200 Connection Established\r\nProxy-agent: nginx\r\nX-Proxy-Connected-Addr: $connect_addr\r\n\r\n";

Le cas de test de la commande curl avec la configuration ci-dessus est le suivant :

$ curl https://github.com -sv -x localhost:3128
* Connecté à localhost (127.0.0.1) port 3128 (#0)
* allocation du tampon de connexion !
* Établir un tunnel proxy HTTP vers github.com:443
> CONNECT github.com:443 HTTP/1.1
> Host: github.com:443
> User-Agent: curl/7.64.1
> Proxy-Connection: Keep-Alive
>
< HTTP/1.1 200 Connection Established            --.
< Proxy-agent: nginx                               | réponse CONNECT personnalisée
< X-Proxy-Connected-Addr: 13.229.188.59:443      --'
...

Variables

$connect_host

nom d'hôte de la ligne de requête CONNECT.

$connect_port

port de la ligne de requête CONNECT.

$connect_addr

adresse IP et port de l'hôte distant, par exemple "192.168.1.5:12345". L'adresse IP est résolue à partir du nom d'hôte de la ligne de requête CONNECT.

$proxy_connect_connect_timeout

Obtenez ou définissez le délai d'attente de la directive proxy_connect_connect_timeout.

Par exemple :

## Définir la valeur par défaut

proxy_connect_connect_timeout   10s;
proxy_connect_data_timeout      10s;

## Remplacer la valeur par défaut

if ($host = "test.com") {
    set $proxy_connect_connect_timeout  "10ms";
    set $proxy_connect_data_timeout     "10ms";
}

$proxy_connect_data_timeout

Obtenez ou définissez un délai d'attente de la directive proxy_connect_data_timeout.

$proxy_connect_read_timeout

Obsolète. Il peut toujours obtenir ou définir un délai d'attente de la directive proxy_connect_data_timeout pour la compatibilité.

$proxy_connect_send_timeout

Obsolète. Il n'a pas de fonction.

$proxy_connect_resolve_time

Conserve le temps passé sur la résolution de noms ; le temps est conservé en secondes avec une résolution en millisecondes.

  • La valeur de "" signifie que ce module ne fonctionne pas sur cette requête.
  • La valeur de "-" signifie que la résolution de noms a échoué.

$proxy_connect_connect_time

Conserve le temps passé à établir une connexion avec le serveur en amont ; le temps est conservé en secondes avec une résolution en millisecondes.

  • La valeur de "" signifie que ce module ne fonctionne pas sur cette requête.
  • La valeur de "-" signifie que la résolution de noms ou la connexion a échoué.

$proxy_connect_first_byte_time

Conserve le temps pour recevoir le premier octet de données du serveur en amont ; le temps est conservé en secondes avec une résolution en millisecondes.

  • La valeur de "" signifie que ce module ne fonctionne pas sur cette requête.
  • La valeur de "-" signifie que la résolution de noms, la connexion ou la réception a échoué.

$proxy_connect_response

Obtenez ou définissez la réponse de la requête CONNECT.
La réponse par défaut de la requête CONNECT est "HTTP/1.1 200 Connection Established\r\nProxy-agent: nginx\r\n\r\n".

Notez qu'elle est uniquement utilisée pour la requête CONNECT, elle ne peut pas modifier le flux de données sur le tunnel CONNECT.

Par exemple :

## modifier l'en-tête Proxy-agent par défaut
set $proxy_connect_response "HTTP/1.1 200\r\nProxy-agent: nginx/1.19\r\n\r\n";

La valeur de la variable ne prend pas en charge les variables nginx. Vous pouvez utiliser lua-nginx-module pour construire une chaîne contenant une variable nginx. Par exemple :

## La réponse CONNECT peut être "HTTP/1.1 200\r\nProxy-agent: nginx/1.19.6\r\n\r\n"

rewrite_by_lua '
    ngx.var.proxy_connect_response =
      string.format("HTTP/1.1 200\\r\\nProxy-agent: nginx/%s\\r\\n\\r\\n", ngx.var.nginx_version)
';

Notez également que la directive set ou rewrite_by_lua* est exécutée pendant la phase REWRITE, qui est en avance sur la phase de résolution DNS. Elle ne peut pas obtenir la bonne valeur de certaines variables, par exemple, la valeur de $connect_addr est nil. Dans ce cas, vous devriez utiliser la directive proxy_connect_response à la place.

Compatibilité

Compatibilité Nginx

Le dernier module est compatible avec les versions suivantes de nginx :

  • 1.27.1 (version principale de 1.27.x)
  • 1.26.2 (version de 1.26.x)
  • 1.24.0 (version de 1.24.x)
  • 1.22.1 (version de 1.22.x)
  • 1.20.2 (version de 1.20.x)
  • 1.18.0 (version de 1.18.x)
  • 1.16.1 (version de 1.16.x)
  • 1.14.2 (version de 1.14.x)
  • 1.12.1 (version de 1.12.x)
  • 1.10.3 (version de 1.10.x)
  • 1.8.1 (version de 1.8.x)
  • 1.6.3 (version de 1.6.x)
  • 1.4.7 (version de 1.4.x)

Compatibilité OpenResty

Le dernier module est compatible avec les versions suivantes d'OpenResty :

  • 1.25.3 (version : 1.25.3.1)
  • 1.21.4 (version : 1.21.4.3)
  • 1.19.3 (version : 1.19.3.1)
  • 1.17.8 (version : 1.17.8.2)
  • 1.15.8 (version : 1.15.8.1)
  • 1.13.6 (version : 1.13.6.2)

Compatibilité Tengine

Ce module a été intégré dans Tengine 2.3.0.

FAQ

Voir page FAQ.

Problèmes connus

  • Dans HTTP/2, la méthode CONNECT n'est pas prise en charge. Elle ne prend en charge que la requête de méthode CONNECT dans HTTP/1.x et HTTPS.

Voir aussi

Auteur

LICENCE

Voir LICENCE pour plus de détails.

GitHub

Vous pouvez trouver des conseils de configuration supplémentaires et de la documentation pour ce module dans le dépôt GitHub pour nginx-module-proxy-connect.