proxy-connect: Soporte para el método CONNECT en NGINX
Instalación
Puedes instalar este módulo en cualquier distribución basada en RHEL, incluyendo, pero no limitado a:
- RedHat Enterprise Linux 7, 8, 9 y 10
- CentOS 7, 8, 9
- AlmaLinux 8, 9
- Rocky Linux 8, 9
- Amazon Linux 2 y 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
Habilita el módulo añadiendo lo siguiente en la parte superior de /etc/nginx/nginx.conf:
load_module modules/ngx_http_proxy_connect_module.so;
Este documento describe nginx-module-proxy-connect v0.0.2 lanzado el 24 de diciembre de 2024.
Este fork está integrado en NGINX-MOD.
[!CAUTION] Compilar como módulo dinámico no es recomendable en este momento, el binario de NGINX parcheado no recogerá la bandera NGX_HTTP_PROXY_CONNECT. La única forma adecuada para esto es compilar NGINX y el módulo dinámico en una sola vez, luego eliminar el módulo para empaquetar.
[!CAUTION] El parche existente no era compatible con ABI porque añadió campos en el medio.
Este módulo proporciona soporte para la solicitud del método CONNECT. Este método se utiliza principalmente para túneles de solicitudes SSL a través de servidores proxy.
Ejemplo
Ejemplo de configuración
server {
listen 3128;
# dns resolver utilizado por el proxy hacia adelante
resolver 8.8.8.8;
# proxy hacia adelante para solicitudes CONNECT
proxy_connect;
proxy_connect_allow 443 563;
proxy_connect_connect_timeout 10s;
proxy_connect_data_timeout 10s;
# definido por ti mismo para solicitudes no-CONNECT
# Ejemplo: proxy inverso para solicitudes no-CONNECT
location / {
proxy_pass http://$host;
proxy_set_header Host $host;
}
}
- La directiva
resolverDEBE estar configurada globalmente en el bloqueserver {}(o bloquehttp {}). - Cualquier bloque
location {}, bloqueupstream {}y cualquier otra directiva estándar de backend/upstream, comoproxy_pass, no impactan la funcionalidad de este módulo. (El módulo proxy_connect solo ejecuta la lógica para solicitudes que utilizan el método CONNECT y que tienen un flujo de datos bajo este túnel.) - Si no deseas manejar solicitudes no-CONNECT, puedes modificar el bloque
location {}de la siguiente manera:$ curl https://github.com/ -v -x 127.0.0.1:3128location / { return 403 "Las solicitudes no-CONNECT están prohibidas"; } ``` Ejemplo para curl ---------------- Con la configuración anterior ([ejemplo de configuración](#ejemplo-de-configuración)), puedes acceder a cualquier sitio web https a través de un túnel HTTP CONNECT. Una prueba simple con el comando `curl` es la siguiente: - Trying 127.0.0.1... -.
- Connected to 127.0.0.1 (127.0.0.1) port 3128 (#0) | curl crea una conexión TCP con nginx (con el módulo proxy_connect).
-
Establish HTTP proxy tunnel to github.com:443 -'
CONNECT github.com:443 HTTP/1.1 -. Host: github.com:443 (1) | curl envía la solicitud CONNECT para crear el túnel. User-Agent: curl/7.43.0 | Proxy-Connection: Keep-Alive -'
< HTTP/1.0 200 Connection Established .- nginx responde 200 que el túnel está establecido. < Proxy-agent: nginx (2)| (El cliente ahora está siendo proxyado al host remoto. Cualquier dato enviado < '- a nginx ahora se reenvía, sin modificaciones, al host remoto)
-
Proxy replied OK to CONNECT request
- TLS 1.2 connection using TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 -.
- Server certificate: github.com |
- Server certificate: DigiCert SHA2 Extended Validation Server CA | curl envía la solicitud "https://github.com" a través del túnel,
- Server certificate: DigiCert High Assurance EV Root CA | el módulo proxy_connect enviará los datos al host remoto (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 | Cualquier dato recibido del host remoto será enviado al cliente < Transfer-Encoding: chunked | por el módulo proxy_connect. < Server: GitHub.com (4)| < Status: 200 OK | < Cache-Control: no-cache | < Vary: X-PJAX | ... | ...
... | ... '- curl nginx (proxy_connect) github.com | | | (1) |-- CONNECT github.com:443 -->| | | | | | |----[ TCP connection ]--->| | | | (2) |<- HTTP/1.1 200 ---| | | Connection Established | | | | | | | ========= El túnel CONNECT ha sido establecido. =========== | | | | | | | | | [ SSL stream ] | | (3) |---[ GET / HTTP/1.1 ]----->| [ SSL stream ] | | [ Host: github.com ] |---[ GET / HTTP/1.1 ]-->. | | [ Host: github.com ] | | | | | | | | | | | | [ SSL stream ] | | [ SSL stream ] |<--[ HTTP/1.1 200 OK ]---' (4) |<--[ HTTP/1.1 200 OK ]------| [ < html page > ] | | [ < html page > ] | | | | |El diagrama de secuencia del ejemplo anterior es el siguiente:ejemplo de configuración para solicitud CONNECT en HTTPS -------------------------------------------------- ```nginx server { listen 3128 ssl; # certificado autofirmado generado a través del comando openssl ssl_certificate_key /path/to/server.key; ssl_certificate /path/to/server.crt; ssl_session_cache shared:SSL:1m; # dns resolver utilizado por el proxy hacia adelante resolver 8.8.8.8; # proxy hacia adelante para solicitud CONNECT proxy_connect; proxy_connect_allow 443 563; proxy_connect_connect_timeout 10s; proxy_connect_data_timeout 10s; # definido por ti mismo para solicitud no-CONNECT # Ejemplo: proxy inverso para solicitudes no-CONNECT location / { proxy_pass http://$host; proxy_set_header Host $host; } }
ejemplo para curl (solicitud CONNECT en https)
Con la configuración anterior (ejemplo de configuración para solicitud CONNECT en https), puedes acceder a cualquier sitio web https a través de un túnel HTTPS CONNECT (solicitud CONNECT en https). Una prueba simple con el comando curl es la siguiente:
Consejos para usar el comando curl:
-x https://...hace que curl envíe la solicitud CONNECT en https.--proxy-insecuredesactiva la verificación de firma ssl para la conexión ssl establecida con el servidor proxy_connect de nginx (https://localhost:3128), pero no desactiva la verificación con el servidor backend proxyado (https://nginx.orgen el ejemplo a continuación).- Si deseas desactivar la verificación de firma con el servidor backend proxyado, puedes usar la opción
-k.
salida del comando curl :point_left:
$ curl https://nginx.org/ -sv -o/dev/null -x https://localhost:3128 --proxy-insecure
* Trying 127.0.0.1:3128...
* TCP_NODELAY set
* Connected to localhost (127.0.0.1) port 3128 (#0)
* ALPN, offering http/1.1
* successfully set certificate verify locations:
* CAfile: /etc/ssl/certs/ca-certificates.crt
CApath: /etc/ssl/certs
} [5 bytes data]
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
} [512 bytes data]
* TLSv1.3 (IN), TLS handshake, Server hello (2):
{ [112 bytes data]
* TLSv1.2 (IN), TLS handshake, Certificate (11):
{ [799 bytes data]
* TLSv1.2 (IN), TLS handshake, Server key exchange (12):
{ [300 bytes data]
* TLSv1.2 (IN), TLS handshake, Server finished (14):
{ [4 bytes data]
* TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
} [37 bytes data]
* TLSv1.2 (OUT), TLS change cipher, Change cipher spec (1):
} [1 bytes data]
* TLSv1.2 (OUT), TLS handshake, Finished (20):
} [16 bytes data]
* TLSv1.2 (IN), TLS handshake, Finished (20):
{ [16 bytes data]
* SSL connection using TLSv1.2 / ECDHE-RSA-AES256-GCM-SHA384
* ALPN, server accepted to use http/1.1
* Proxy certificate:
* subject: C=AU; ST=Some-State; O=Internet Widgits Pty Ltd
* start date: Nov 25 08:36:38 2022 GMT
* expire date: Nov 25 08:36:38 2023 GMT
* issuer: C=AU; ST=Some-State; O=Internet Widgits Pty Ltd
* SSL certificate verify result: self signed certificate (18), continuing anyway.
* allocate connect buffer!
* Establish HTTP proxy tunnel to nginx.org:443
} [5 bytes data]
> CONNECT nginx.org:443 HTTP/1.1
> Host: nginx.org:443
> User-Agent: curl/7.68.0
> Proxy-Connection: Keep-Alive
>
{ [5 bytes data]
< HTTP/1.1 200 Connection Established
< Proxy-agent: nginx
<
* Proxy replied 200 to CONNECT request
* CONNECT phase completed!
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
* CAfile: /etc/ssl/certs/ca-certificates.crt
CApath: /etc/ssl/certs
} [5 bytes data]
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
} [512 bytes data]
* CONNECT phase completed!
* CONNECT phase completed!
{ [5 bytes data]
* TLSv1.3 (IN), TLS handshake, Server hello (2):
{ [80 bytes data]
* TLSv1.2 (IN), TLS handshake, Certificate (11):
{ [2749 bytes data]
* TLSv1.2 (IN), TLS handshake, Server key exchange (12):
{ [300 bytes data]
* TLSv1.2 (IN), TLS handshake, Server finished (14):
{ [4 bytes data]
* TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
} [37 bytes data]
* TLSv1.2 (OUT), TLS change cipher, Change cipher spec (1):
} [1 bytes data]
* TLSv1.2 (OUT), TLS handshake, Finished (20):
} [16 bytes data]
* TLSv1.2 (IN), TLS handshake, Finished (20):
{ [16 bytes data]
* SSL connection using TLSv1.2 / ECDHE-RSA-AES256-GCM-SHA384
* ALPN, server accepted to use http/1.1
* Server certificate:
* subject: CN=nginx.org
* start date: Dec 9 15:29:31 2022 GMT
* expire date: Mar 9 15:29:30 2023 GMT
* subjectAltName: host "nginx.org" matched cert's "nginx.org"
* issuer: C=US; O=Let's Encrypt; CN=R3
* SSL certificate verify ok.
} [5 bytes data]
> GET / HTTP/1.1
> Host: nginx.org
> User-Agent: curl/7.68.0
> Accept: */*
>
{ [5 bytes data]
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Server: 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 bytes data]
* Connection #0 to host localhost left intact
Ejemplo para navegador
Puedes configurar tu navegador para usar este nginx como servidor PROXY.
- CONFIGURACIÓN DEL PROXY HTTPS EN GOOGLE CHROME: guía y configuración sobre cómo configurar este módulo para funcionar bajo la capa SSL.
Ejemplo para Autenticación Básica
Podemos hacer control de acceso en la solicitud CONNECT utilizando el módulo de autenticación básica de nginx.
Consulta esta guía para más detalles.
Ejemplo para proxying WebSocket
- Ten en cuenta que nginx tiene su propio módulo de proxy inverso para WebSocket, que no está limitado al túnel CONNECT, consulta documentación de nginx.org: Proxying WebSocket en Nginx y blog de nginx.com: NGINX como Proxy de WebSocket.
- Este módulo permite que el protocolo WebSocket funcione a través del túnel CONNECT, consulta https://github.com/chobits/ngx_http_proxy_connect_module/issues/267#issuecomment-1575449174
Instalar
Seleccionar parche
- Selecciona el parche correcto para construir:
- Todos los archivos de parche se han incluido en el directorio
patch/de este módulo. No necesitas descargar el parche directamente desde la página web.
| versión de nginx | habilitar fase REWRITE | parche |
|---|---|---|
| 1.4.x ~ 1.12.x | NO | proxy_connect.patch |
| 1.4.x ~ 1.12.x | SÍ | proxy_connect_rewrite.patch |
| 1.13.x ~ 1.14.x | NO | proxy_connect_1014.patch |
| 1.13.x ~ 1.14.x | SÍ | proxy_connect_rewrite_1014.patch |
| 1.15.2 | SÍ | proxy_connect_rewrite_1015.patch |
| 1.15.4 ~ 1.16.x | SÍ | proxy_connect_rewrite_101504.patch |
| 1.17.x ~ 1.18.x | SÍ | proxy_connect_rewrite_1018.patch |
| 1.19.x ~ 1.21.0 | SÍ | proxy_connect_rewrite_1018.patch |
| 1.21.1 ~ 1.22.x | SÍ | proxy_connect_rewrite_102101.patch |
| 1.23.x ~ 1.24.0 | SÍ | proxy_connect_rewrite_102101.patch |
| 1.25.0 ~ 1.26.x | SÍ | proxy_connect_rewrite_102101.patch |
| 1.27.1 | SÍ | proxy_connect_rewrite_102101.patch |
| versión de OpenResty | habilitar fase REWRITE | parche |
|---|---|---|
| 1.13.6 | NO | proxy_connect_1014.patch |
| 1.13.6 | SÍ | proxy_connect_rewrite_1014.patch |
| 1.15.8 | SÍ | proxy_connect_rewrite_101504.patch |
| 1.17.8 | SÍ | proxy_connect_rewrite_1018.patch |
| 1.19.3 | SÍ | proxy_connect_rewrite_1018.patch |
| 1.21.4 | SÍ | proxy_connect_rewrite_102101.patch |
| 1.25.3 | SÍ | proxy_connect_rewrite_102101.patch |
proxy_connect_<VERSION>.patchdesactiva la fase REWRITE de nginx para la solicitud CONNECT por defecto, lo que significa queif,set,rewrite_by_luay otras directivas de la fase REWRITE no pueden ser utilizadas.proxy_connect_rewrite_<VERSION>.patchhabilita estas directivas de la fase REWRITE.
Construir nginx
- Construir nginx con este módulo desde la fuente:
$ 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
Construir como un módulo dinámico
- A partir de nginx 1.9.11, también puedes compilar este módulo como un módulo dinámico, utilizando la opción
--add-dynamic-module=PATHen lugar de--add-module=PATHen la línea de comando de./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
- Y luego puedes cargar explícitamente el módulo en tu nginx.conf a través de la directiva
load_module, por ejemplo,
load_module /path/to/modules/ngx_http_proxy_connect_module.so;
Ten en cuenta que el archivo ngx_http_proxy_connect_module.so DEBE ser cargado por el binario de nginx que se compila con el archivo .so al mismo tiempo.
Construir OpenResty
- Construir OpenResty con este módulo desde la fuente:
$ 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 pruebas
- Para ejecutar toda la suite de pruebas:
$ hg clone http://hg.nginx.org/nginx-tests/
## Si usas el último módulo lua-nginx que necesita lua-resty-core y
## lua-resty-lrucache, deberías añadir la directiva "lua_package_path ...;"
## en nginx.conf de los casos de prueba. Puedes usar el siguiente comando:
#
## $ 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/
- Para el proceso completo de construcción y prueba de este módulo, consulta:
- archivos de flujo de trabajo: aquí
- ejecuciones de todos los flujos de trabajo: aquí
Registro de errores
Este módulo registra su propio mensaje de error comenzando con la cadena "proxy_connect:".
Algunos registros de errores típicos se muestran a continuación:
- El módulo proxy_connect intenta establecer una conexión de túnel con el servidor backend, pero ocurre un tiempo de espera de conexión TCP.
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"
Directiva
proxy_connect
Sintaxis: proxy_connect
Por defecto: none
Contexto: server
Habilita el soporte para el método HTTP "CONNECT".
proxy_connect_allow
Sintaxis: proxy_connect_allow all | [puerto ...] | [rango-puerto ...]
Por defecto: 443 563
Contexto: server
Esta directiva especifica una lista de números de puerto o rangos a los que el método proxy CONNECT puede conectarse.
Por defecto, solo se habilitan el puerto https predeterminado (443) y el puerto snews predeterminado (563).
Usar esta directiva sobrescribirá este valor predeterminado y permitirá conexiones solo a los puertos listados.
El valor all permitirá todos los puertos para el proxy.
El valor puerto permitirá el puerto especificado para el proxy.
El valor rango-puerto permitirá el rango de puertos especificado para el proxy, por ejemplo:
proxy_connect_allow 1000-2000 3000-4000; # permitir rango de puertos desde 1000 hasta 2000, desde 3000 hasta 4000.
proxy_connect_connect_timeout
Sintaxis: proxy_connect_connect_timeout tiempo
Por defecto: none
Contexto: server
Define un tiempo de espera para establecer una conexión con un servidor proxy.
proxy_connect_data_timeout
Sintaxis: proxy_connect_data_timeout tiempo
Por defecto: 60s
Contexto: server
Establece el tiempo de espera entre dos operaciones de lectura o escritura sucesivas en conexiones de cliente o servidor proxy. Si no se transmiten datos dentro de este tiempo, la conexión se cierra.
proxy_connect_read_timeout
Sintaxis: proxy_connect_read_timeout tiempo
Por defecto: 60s
Contexto: server
Obsoleto.
Tiene la misma función que la directiva proxy_connect_data_timeout por compatibilidad. Puedes configurar solo una de las directivas (proxy_connect_data_timeout o proxy_connect_read_timeout).
proxy_connect_send_timeout
Sintaxis: proxy_connect_send_timeout tiempo
Por defecto: 60s
Contexto: server
Obsoleto.
No tiene función.
proxy_connect_address
Sintaxis: proxy_connect_address dirección | off
Por defecto: none
Contexto: server
Especifica una dirección IP del servidor proxy. La dirección puede contener variables.
El valor especial off es igual a none, que utiliza la dirección IP resuelta desde el nombre de host de la línea de solicitud CONNECT.
NOTA: Si usas set $<variable nginx> y proxy_connect_address $<variable nginx> juntos, deberías usar proxy_connect_rewrite.patch en su lugar, consulta Instalar para más detalles.
proxy_connect_bind
Sintaxis: proxy_connect_bind dirección [transparente] | off
Por defecto: none
Contexto: server
Hace que las conexiones salientes a un servidor proxy se originen desde la dirección IP local especificada con un puerto opcional.
El valor del parámetro puede contener variables. El valor especial off es igual a none, lo que permite que el sistema asigne automáticamente la dirección IP y el puerto locales.
El parámetro transparente permite que las conexiones salientes a un servidor proxy se originen desde una dirección IP no local, por ejemplo, desde una dirección IP real de un cliente:
proxy_connect_bind $remote_addr transparent;
Para que este parámetro funcione, generalmente es necesario ejecutar los procesos de trabajo de nginx con privilegios de superusuario. En Linux no es necesario (1.13.8) ya que si se especifica el parámetro transparente, los procesos de trabajo heredan la capacidad CAP_NET_RAW del proceso maestro. También es necesario configurar la tabla de enrutamiento del kernel para interceptar el tráfico de red del servidor proxyado.
NOTA: Si usas set $<variable nginx> y proxy_connect_bind $<variable nginx> juntos, deberías usar proxy_connect_rewrite.patch en su lugar, consulta Instalar para más detalles.
proxy_connect_response
Sintaxis: proxy_connect_response respuesta CONNECT
Por defecto: HTTP/1.1 200 Connection Established\r\nProxy-agent: nginx\r\n\r\n
Contexto: server
Establece la respuesta de la solicitud CONNECT.
Ten en cuenta que solo se utiliza para la solicitud CONNECT, no puede modificar el flujo de datos a través del túnel CONNECT.
Por ejemplo:
proxy_connect_response "HTTP/1.1 200 Connection Established\r\nProxy-agent: nginx\r\nX-Proxy-Connected-Addr: $connect_addr\r\n\r\n";
El caso de prueba del comando curl con la configuración anterior es el siguiente:
$ curl https://github.com -sv -x localhost:3128
* Connected to localhost (127.0.0.1) port 3128 (#0)
* allocate connect buffer!
* Establish HTTP proxy tunnel to 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 | respuesta CONNECT personalizada
< X-Proxy-Connected-Addr: 13.229.188.59:443 --'
...
Variables
$connect_host
nombre de host de la línea de solicitud CONNECT.
$connect_port
puerto de la línea de solicitud CONNECT.
$connect_addr
dirección IP y puerto del host remoto, por ejemplo, "192.168.1.5:12345". La dirección IP se resuelve desde el nombre de host de la línea de solicitud CONNECT.
$proxy_connect_connect_timeout
Obtiene o establece el tiempo de espera de la directiva proxy_connect_connect_timeout.
Por ejemplo:
## Establecer valor predeterminado
proxy_connect_connect_timeout 10s;
proxy_connect_data_timeout 10s;
## Superponer valor predeterminado
if ($host = "test.com") {
set $proxy_connect_connect_timeout "10ms";
set $proxy_connect_data_timeout "10ms";
}
$proxy_connect_data_timeout
Obtiene o establece un tiempo de espera de la directiva proxy_connect_data_timeout.
$proxy_connect_read_timeout
Obsoleto.
Aún puede obtener o establecer un tiempo de espera de la directiva proxy_connect_data_timeout por compatibilidad.
$proxy_connect_send_timeout
Obsoleto. No tiene función.
$proxy_connect_resolve_time
Mantiene el tiempo gastado en la resolución de nombres; el tiempo se mantiene en segundos con resolución de milisegundos.
- El valor de "" significa que este módulo no funciona en esta solicitud.
- El valor de "-" significa que la resolución de nombres falló.
$proxy_connect_connect_time
Mantiene el tiempo gastado en establecer una conexión con el servidor upstream; el tiempo se mantiene en segundos con resolución de milisegundos.
- El valor de "" significa que este módulo no funciona en esta solicitud.
- El valor de "-" significa que la resolución de nombres o la conexión fallaron.
$proxy_connect_first_byte_time
Mantiene el tiempo para recibir el primer byte de datos del servidor upstream; el tiempo se mantiene en segundos con resolución de milisegundos.
- El valor de "" significa que este módulo no funciona en esta solicitud.
- El valor de "-" significa que la resolución de nombres, la conexión o la recepción fallaron.
$proxy_connect_response
Obtiene o establece la respuesta de la solicitud CONNECT.
La respuesta predeterminada de la solicitud CONNECT es "HTTP/1.1 200 Connection Established\r\nProxy-agent: nginx\r\n\r\n".
Ten en cuenta que solo se utiliza para la solicitud CONNECT, no puede modificar el flujo de datos a través del túnel CONNECT.
Por ejemplo:
## modificar el encabezado Proxy-agent predeterminado
set $proxy_connect_response "HTTP/1.1 200\r\nProxy-agent: nginx/1.19\r\n\r\n";
El valor de la variable no admite variables de nginx. Puedes usar lua-nginx-module para construir una cadena que contenga una variable de nginx. Por ejemplo:
## La respuesta CONNECT puede ser "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)
';
También ten en cuenta que la directiva set o rewrite_by_lua* se ejecuta durante la fase REWRITE, que es anterior a la fase de resolución de dns. No puede obtener el valor correcto de algunas variables, por ejemplo, el valor de $connect_addr es nil. En tal caso, deberías usar la directiva proxy_connect_response en su lugar.
Compatibilidad
Compatibilidad con Nginx
El módulo más reciente es compatible con las siguientes versiones de nginx:
- 1.27.1 (versión principal de 1.27.x)
- 1.26.2 (versión de 1.26.x)
- 1.24.0 (versión de 1.24.x)
- 1.22.1 (versión de 1.22.x)
- 1.20.2 (versión de 1.20.x)
- 1.18.0 (versión de 1.18.x)
- 1.16.1 (versión de 1.16.x)
- 1.14.2 (versión de 1.14.x)
- 1.12.1 (versión de 1.12.x)
- 1.10.3 (versión de 1.10.x)
- 1.8.1 (versión de 1.8.x)
- 1.6.3 (versión de 1.6.x)
- 1.4.7 (versión de 1.4.x)
Compatibilidad con OpenResty
El módulo más reciente es compatible con las siguientes versiones de OpenResty:
- 1.25.3 (versión: 1.25.3.1)
- 1.21.4 (versión: 1.21.4.3)
- 1.19.3 (versión: 1.19.3.1)
- 1.17.8 (versión: 1.17.8.2)
- 1.15.8 (versión: 1.15.8.1)
- 1.13.6 (versión: 1.13.6.2)
Compatibilidad con Tengine
Este módulo ha sido integrado en Tengine 2.3.0.
FAQ
Consulta página de FAQ.
Problemas Conocidos
- En HTTP/2, el método CONNECT no es compatible. Solo admite la solicitud del método CONNECT en HTTP/1.x y HTTPS.
Ver También
Autor
- Peng Qi: autor original. Contribuyó a este módulo a Tengine en este pull request.
- Xiaochen Wang: mantenedor actual. Reconstruyó este módulo para nginx.
LICENCIA
Consulta LICENCIA para más detalles.
GitHub
Puedes encontrar consejos de configuración adicionales y documentación para este módulo en el repositorio de GitHub para nginx-module-proxy-connect.