Pular para conteúdo

proxy-connect: Suporte ao método CONNECT no NGINX

Instalação

Você pode instalar este módulo em qualquer distribuição baseada em RHEL, incluindo, mas não se limitando a:

  • RedHat Enterprise Linux 7, 8, 9 e 10
  • CentOS 7, 8, 9
  • AlmaLinux 8, 9
  • Rocky Linux 8, 9
  • Amazon Linux 2 e 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

Ative o módulo adicionando o seguinte no topo de /etc/nginx/nginx.conf:

load_module modules/ngx_http_proxy_connect_module.so;

Este documento descreve o nginx-module-proxy-connect v0.0.2 lançado em 24 de dezembro de 2024.


Este fork está integrado no NGINX-MOD.

[!CAUTION] Compilar como módulo dinâmico é desencorajado no momento, o binário do NGINX corrigido não reconhecerá a flag NGX_HTTP_PROXY_CONNECT. A única maneira adequada para isso é compilar o NGINX e o módulo dinâmico de uma só vez, e depois remover o módulo para empacotamento.

[!CAUTION] O patch existente não era compatível com ABI porque adicionou campos no meio.

Este módulo fornece suporte para o método de solicitação CONNECT.
Esse método é usado principalmente para túnel de solicitações SSL através de servidores proxy.

Exemplo

Exemplo de Configuração

server {
    listen                         3128;

    # resolvedor DNS usado por proxy reverso
    resolver                       8.8.8.8;

    # proxy reverso para solicitações CONNECT
    proxy_connect;
    proxy_connect_allow            443 563;
    proxy_connect_connect_timeout  10s;
    proxy_connect_data_timeout     10s;

    # definido por você para solicitações não-CONNECT
    # Exemplo: proxy reverso para solicitações não-CONNECT
    location / {
        proxy_pass http://$host;
        proxy_set_header Host $host;
    }
}
  • A diretiva resolver DEVE ser configurada globalmente no bloco server {} (ou bloco http {}).
  • Qualquer bloco location {}, bloco upstream {} e quaisquer outras diretivas padrão de backend/upstream, como proxy_pass, não impactam a funcionalidade deste módulo. (O módulo proxy_connect apenas executa a lógica para solicitações que usam o método CONNECT e que têm um fluxo de dados sob este túnel.)
  • Se você não quiser lidar com solicitações não-CONNECT, pode modificar o bloco location {} da seguinte forma:
        location / {
            return 403 "Solicitações não-CONNECT são proibidas";
        }
        ```
    
    Exemplo para curl
    ----------------
    
    Com a configuração acima ([exemplo de configuração](#exemplo-de-configuração)), você pode acessar qualquer site https via túnel HTTP CONNECT. Um teste simples com o comando `curl` é o seguinte:
    
    $ curl https://github.com/ -v -x 127.0.0.1:3128
  • Tentando 127.0.0.1... -.
  • Conectado a 127.0.0.1 (127.0.0.1) porta 3128 (#0) | curl cria uma conexão TCP com o nginx (com o módulo proxy_connect).
  • Estabelecendo túnel proxy HTTP para github.com:443 -'

    CONNECT github.com:443 HTTP/1.1 -. Host: github.com:443 (1) | curl envia solicitação CONNECT para criar o túnel. User-Agent: curl/7.43.0 | Proxy-Connection: Keep-Alive -'

    < HTTP/1.0 200 Connection Established .- nginx responde 200 que o túnel foi estabelecido. < Proxy-agent: nginx (2)| (O cliente agora está sendo encaminhado para o host remoto. Qualquer dado enviado < '- para o nginx agora é encaminhado, sem modificação, para o host remoto)

  • O proxy respondeu OK à solicitação CONNECT

  • Conexão TLS 1.2 usando TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 -.
  • Certificado do servidor: github.com |
  • Certificado do servidor: DigiCert SHA2 Extended Validation Server CA | curl envia solicitação "https://github.com" via túnel,
  • Certificado do servidor: DigiCert High Assurance EV Root CA | o módulo proxy_connect irá encaminhar os dados para o 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 | Qualquer dado recebido do host remoto será enviado ao cliente < Transfer-Encoding: chunked | pelo módulo proxy_connect. < Server: GitHub.com (4)| < Status: 200 OK | < Cache-Control: no-cache | < Vary: X-PJAX | ... | ... ... | ... '-

    O diagrama de sequência do exemplo acima é o seguinte:
    
    curl nginx (proxy_connect) github.com | | | (1) |-- CONNECT github.com:443 -->| | | | | | |----[ Conexão TCP ]--->| | | | (2) |<- HTTP/1.1 200 ---| | | Conexão Estabelecida | | | | | | | ========= O túnel CONNECT foi estabelecido. =========== | | | | | | | | | [ fluxo SSL ] | | (3) |---[ GET / HTTP/1.1 ]----->| [ fluxo SSL ] | | [ Host: github.com ] |---[ GET / HTTP/1.1 ]-->. | | [ Host: github.com ] | | | | | | | | | | | | [ fluxo SSL ] | | [ fluxo SSL ] |<--[ HTTP/1.1 200 OK ]---' (4) |<--[ HTTP/1.1 200 OK ]------| [ < página html > ] | | [ < página html > ] | | | | |
    exemplo de configuração para solicitação CONNECT em HTTPS
    --------------------------------------------------
    
    ```nginx
    server {
        listen                         3128 ssl;
    
        # certificado autoassinado gerado via comando openssl
        ssl_certificate_key            /path/to/server.key;
        ssl_certificate                /path/to/server.crt;
        ssl_session_cache              shared:SSL:1m;
    
        # resolvedor DNS usado por proxy reverso
        resolver                       8.8.8.8;
    
        # proxy reverso para solicitação CONNECT
        proxy_connect;
        proxy_connect_allow            443 563;
        proxy_connect_connect_timeout  10s;
        proxy_connect_data_timeout     10s;
    
        # definido por você para solicitação não-CONNECT
        # Exemplo: proxy reverso para solicitações não-CONNECT
        location / {
            proxy_pass http://$host;
            proxy_set_header Host $host;
        }
    }
    

exemplo para curl (solicitação CONNECT em https)

Com a configuração acima (exemplo de configuração para solicitação CONNECT em https), você pode acessar qualquer site https via túnel HTTPS CONNECT (solicitação CONNECT em https). Um teste simples com o comando curl é o seguinte:

Dicas sobre como usar o comando curl:

  • -x https://... faz com que o curl envie a solicitação CONNECT em https.
  • --proxy-insecure desabilita a verificação de assinatura ssl para a conexão ssl estabelecida com o servidor proxy_connect do nginx (https://localhost:3128), mas não desabilita a verificação com o servidor backend proxy (https://nginx.org no exemplo abaixo).
  • Se você quiser desabilitar a verificação de assinatura com o servidor backend proxy, pode usar a opção -k.
saída do comando curl :point_left:

$ curl https://nginx.org/ -sv -o/dev/null -x https://localhost:3128 --proxy-insecure
*   Tentando 127.0.0.1:3128...
* TCP_NODELAY definido
* Conectado a localhost (127.0.0.1) porta 3128 (#0)
* ALPN, oferecendo http/1.1
* localizações de verificação de certificado definidas com sucesso:
*   CAfile: /etc/ssl/certs/ca-certificates.crt
  CApath: /etc/ssl/certs
} [5 bytes data]
* TLSv1.3 (OUT), handshake TLS, Cliente hello (1):
} [512 bytes data]
* TLSv1.3 (IN), handshake TLS, Servidor hello (2):
{ [112 bytes data]
* TLSv1.2 (IN), handshake TLS, Certificado (11):
{ [799 bytes data]
* TLSv1.2 (IN), handshake TLS, Troca de chave do servidor (12):
{ [300 bytes data]
* TLSv1.2 (IN), handshake TLS, Servidor finalizado (14):
{ [4 bytes data]
* TLSv1.2 (OUT), handshake TLS, Troca de chave do cliente (16):
} [37 bytes data]
* TLSv1.2 (OUT), handshake TLS, Mudança de cifra, Especificação de mudança de cifra (1):
} [1 bytes data]
* TLSv1.2 (OUT), handshake TLS, Finalizado (20):
} [16 bytes data]
* TLSv1.2 (IN), handshake TLS, Finalizado (20):
{ [16 bytes data]
* Conexão SSL usando TLSv1.2 / ECDHE-RSA-AES256-GCM-SHA384
* ALPN, servidor aceitou usar http/1.1
* Certificado do proxy:
*  assunto: C=AU; ST=Some-State; O=Internet Widgits Pty Ltd
*  data de início: Nov 25 08:36:38 2022 GMT
*  data de expiração: Nov 25 08:36:38 2023 GMT
*  emissor: C=AU; ST=Some-State; O=Internet Widgits Pty Ltd
*  resultado da verificação do certificado SSL: certificado autoassinado (18), continuando de qualquer maneira.
* alocar buffer de conexão!
* Estabelecendo túnel proxy HTTP para 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
<
* O proxy respondeu 200 à solicitação CONNECT
* Fase CONNECT concluída!
* ALPN, oferecendo h2
* ALPN, oferecendo http/1.1
* localizações de verificação de certificado definidas com sucesso:
*   CAfile: /etc/ssl/certs/ca-certificates.crt
  CApath: /etc/ssl/certs
} [5 bytes data]
* TLSv1.3 (OUT), handshake TLS, Cliente hello (1):
} [512 bytes data]
* Fase CONNECT concluída!
* Fase CONNECT concluída!
{ [5 bytes data]
* TLSv1.3 (IN), handshake TLS, Servidor hello (2):
{ [80 bytes data]
* TLSv1.2 (IN), handshake TLS, Certificado (11):
{ [2749 bytes data]
* TLSv1.2 (IN), handshake TLS, Troca de chave do servidor (12):
{ [300 bytes data]
* TLSv1.2 (IN), handshake TLS, Servidor finalizado (14):
{ [4 bytes data]
* TLSv1.2 (OUT), handshake TLS, Troca de chave do cliente (16):
} [37 bytes data]
* TLSv1.2 (OUT), handshake TLS, Mudança de cifra, Especificação de mudança de cifra (1):
} [1 bytes data]
* TLSv1.2 (OUT), handshake TLS, Finalizado (20):
} [16 bytes data]
* TLSv1.2 (IN), handshake TLS, Finalizado (20):
{ [16 bytes data]
* Conexão SSL usando TLSv1.2 / ECDHE-RSA-AES256-GCM-SHA384
* ALPN, servidor aceitou usar http/1.1
* Certificado do servidor:
*  assunto: CN=nginx.org
*  data de início: Dec  9 15:29:31 2022 GMT
*  data de expiração: Mar  9 15:29:30 2023 GMT
*  subjectAltName: host "nginx.org" corresponde ao cert's "nginx.org"
*  emissor: C=US; O=Let's Encrypt; CN=R3
*  verificação do certificado SSL ok.
} [5 bytes data]
> GET / HTTP/1.1
> Host: nginx.org
> User-Agent: curl/7.68.0
> Accept: */*
>
{ [5 bytes data]
* Marcar pacote como não suportando multiuso
< 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]
* Conexão #0 com o host localhost mantida intacta

Exemplo para navegador

Você pode configurar seu navegador para usar este nginx como servidor PROXY.

  • CONFIGURAÇÃO DO PROXY HTTPS DO GOOGLE CHROME: guia & configuração sobre como configurar este módulo para funcionar sob a camada SSL.

Exemplo para Autenticação Básica

Podemos fazer controle de acesso na solicitação CONNECT usando o módulo de autenticação básica do nginx.
Veja este guia para mais detalhes.

Exemplo para proxy de WebSocket

Instalar

Selecionar patch

  • Selecione o patch correto para construção:
  • Todos os arquivos de patch foram incluídos no diretório patch/ deste módulo. Você não precisa baixar o patch diretamente da página da web.
versão do nginx habilitar fase REWRITE patch
1.4.x ~ 1.12.x NÃO proxy_connect.patch
1.4.x ~ 1.12.x SIM proxy_connect_rewrite.patch
1.13.x ~ 1.14.x NÃO proxy_connect_1014.patch
1.13.x ~ 1.14.x SIM proxy_connect_rewrite_1014.patch
1.15.2 SIM proxy_connect_rewrite_1015.patch
1.15.4 ~ 1.16.x SIM proxy_connect_rewrite_101504.patch
1.17.x ~ 1.18.x SIM proxy_connect_rewrite_1018.patch
1.19.x ~ 1.21.0 SIM proxy_connect_rewrite_1018.patch
1.21.1 ~ 1.22.x SIM proxy_connect_rewrite_102101.patch
1.23.x ~ 1.24.0 SIM proxy_connect_rewrite_102101.patch
1.25.0 ~ 1.26.x SIM proxy_connect_rewrite_102101.patch
1.27.1 SIM proxy_connect_rewrite_102101.patch
versão do OpenResty habilitar fase REWRITE patch
1.13.6 NÃO proxy_connect_1014.patch
1.13.6 SIM proxy_connect_rewrite_1014.patch
1.15.8 SIM proxy_connect_rewrite_101504.patch
1.17.8 SIM proxy_connect_rewrite_1018.patch
1.19.3 SIM proxy_connect_rewrite_1018.patch
1.21.4 SIM proxy_connect_rewrite_102101.patch
1.25.3 SIM proxy_connect_rewrite_102101.patch
  • proxy_connect_<VERSION>.patch desabilita a fase REWRITE do nginx para a solicitação CONNECT por padrão, o que significa que if, set, rewrite_by_lua e outras diretivas da fase REWRITE não podem ser usadas.
  • proxy_connect_rewrite_<VERSION>.patch habilita essas diretivas da fase REWRITE.

Construir nginx

  • Construa o nginx com este módulo a partir do código-fonte:
$ 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 um módulo dinâmico

  • A partir do nginx 1.9.11, você também pode compilar este módulo como um módulo dinâmico, usando a opção --add-dynamic-module=PATH em vez de --add-module=PATH na linha de comando ./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
  • E então você pode carregar explicitamente o módulo em seu nginx.conf via a diretiva load_module, por exemplo,
load_module /path/to/modules/ngx_http_proxy_connect_module.so;
  • ❗ Observe que o arquivo ngx_http_proxy_connect_module.so DEVE ser carregado pelo binário do nginx que foi compilado com o arquivo .so ao mesmo tempo.

Construir OpenResty

  • Construa o OpenResty com este módulo a partir do código-fonte:
$ 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

Conjunto de Testes

  • Para executar todo o conjunto de testes:
$ hg clone http://hg.nginx.org/nginx-tests/

## Se você usar o módulo lua-nginx mais recente que precisa do lua-resty-core e
## lua-resty-lrucache, você deve adicionar a diretiva "lua_package_path ...;" 
## no nginx.conf dos casos de teste. Você pode usar o seguinte 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 o processo completo de construção e teste deste módulo, veja:
  • arquivos de fluxo de trabalho: aqui
  • execuções de todos os fluxos de trabalho: aqui

Log de Erros

Este módulo registra sua própria mensagem de erro começando com a string "proxy_connect:".
Alguns logs de erro típicos são mostrados a seguir:

  • O módulo proxy_connect tenta estabelecer uma conexão de túnel com o servidor backend, mas ocorre um timeout de conexão 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"

Diretiva

proxy_connect

Sintaxe: proxy_connect
Padrão: nenhum
Contexto: server

Habilita o suporte ao método HTTP "CONNECT".

proxy_connect_allow

Sintaxe: proxy_connect_allow all | [port ...] | [port-range ...]
Padrão: 443 563
Contexto: server

Esta diretiva especifica uma lista de números de porta ou intervalos aos quais o método proxy CONNECT pode se conectar.
Por padrão, apenas a porta https padrão (443) e a porta snews padrão (563) estão habilitadas.
Usar esta diretiva substituirá esse padrão e permitirá conexões apenas nas portas listadas.

O valor all permitirá todas as portas para proxy.

O valor port permitirá a porta especificada para proxy.

O valor port-range permitirá o intervalo de porta especificado para proxy, por exemplo:

proxy_connect_allow 1000-2000 3000-4000; # permite intervalo de porta de 1000 a 2000, de 3000 a 4000.

proxy_connect_connect_timeout

Sintaxe: proxy_connect_connect_timeout time
Padrão: nenhum
Contexto: server

Define um timeout para estabelecer uma conexão com um servidor proxy.

proxy_connect_data_timeout

Sintaxe: proxy_connect_data_timeout time
Padrão: 60s
Contexto: server

Define o timeout entre duas operações de leitura ou gravação sucessivas em conexões de cliente ou servidor proxy. Se nenhum dado for transmitido dentro desse tempo, a conexão é fechada.

proxy_connect_read_timeout

Sintaxe: proxy_connect_read_timeout time
Padrão: 60s
Contexto: server

Obsoleto.

Tem a mesma função que a diretiva proxy_connect_data_timeout para compatibilidade. Você pode configurar apenas uma das diretivas (proxy_connect_data_timeout ou proxy_connect_read_timeout).

proxy_connect_send_timeout

Sintaxe: proxy_connect_send_timeout time
Padrão: 60s
Contexto: server

Obsoleto.

Não tem função.

proxy_connect_address

Sintaxe: proxy_connect_address address | off
Padrão: nenhum
Contexto: server

Especifica um endereço IP do servidor proxy. O endereço pode conter variáveis.
O valor especial off é igual a nenhum, que usa o endereço IP resolvido a partir do nome do host da linha de solicitação CONNECT.

NOTA: Se usar set $<variável nginx> e proxy_connect_address $<variável nginx> juntos, você deve usar proxy_connect_rewrite.patch em vez disso, veja Instalar para mais detalhes.

proxy_connect_bind

Sintaxe: proxy_connect_bind address [transparent] | off
Padrão: nenhum
Contexto: server

Faz com que as conexões de saída para um servidor proxy se originem do endereço IP local especificado com uma porta opcional.
O valor do parâmetro pode conter variáveis. O valor especial off é igual a nenhum, o que permite que o sistema atribua automaticamente o endereço IP e a porta local.

O parâmetro transparente permite que as conexões de saída para um servidor proxy se originem de um endereço IP não local, por exemplo, de um endereço IP real de um cliente:

proxy_connect_bind $remote_addr transparent;

Para que este parâmetro funcione, geralmente é necessário executar os processos de trabalho do nginx com privilégios de superusuário. No Linux, isso não é necessário (1.13.8) pois, se o parâmetro transparente for especificado, os processos de trabalho herdam a capacidade CAP_NET_RAW do processo mestre. Também é necessário configurar a tabela de roteamento do kernel para interceptar o tráfego de rede do servidor proxy.

NOTA: Se usar set $<variável nginx> e proxy_connect_bind $<variável nginx> juntos, você deve usar proxy_connect_rewrite.patch em vez disso, veja Instalar para mais detalhes.

proxy_connect_response

Sintaxe: proxy_connect_response CONNECT response
Padrão: HTTP/1.1 200 Connection Established\r\nProxy-agent: nginx\r\n\r\n
Contexto: server

Define a resposta da solicitação CONNECT.

Observe que é usado apenas para a solicitação CONNECT, não pode modificar o fluxo de dados sobre o túnel CONNECT.

Por exemplo:

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

O caso de teste do comando curl com a configuração acima é o seguinte:

$ curl https://github.com -sv -x localhost:3128
* Conectado a localhost (127.0.0.1) porta 3128 (#0)
* alocar buffer de conexão!
* Estabelecendo túnel proxy HTTP para 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                               | resposta CONNECT personalizada
< X-Proxy-Connected-Addr: 13.229.188.59:443      --'
...

Variáveis

$connect_host

nome do host da linha de solicitação CONNECT.

$connect_port

porta da linha de solicitação CONNECT.

$connect_addr

endereço IP e porta do host remoto, por exemplo, "192.168.1.5:12345".
O endereço IP é resolvido a partir do nome do host da linha de solicitação CONNECT.

$proxy_connect_connect_timeout

Obtém ou define o timeout da diretiva proxy_connect_connect_timeout.

Por exemplo:

## Definir valor padrão

proxy_connect_connect_timeout   10s;
proxy_connect_data_timeout      10s;

## Sobrepor valor padrão

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

$proxy_connect_data_timeout

Obtém ou define um timeout da diretiva proxy_connect_data_timeout.

$proxy_connect_read_timeout

Obsoleto.
Ainda pode obter ou definir um timeout da diretiva proxy_connect_data_timeout para compatibilidade.

$proxy_connect_send_timeout

Obsoleto.
Não tem função.

$proxy_connect_resolve_time

Mantém o tempo gasto na resolução de nomes; o tempo é mantido em segundos com resolução de milissegundos.

  • O valor de "" significa que este módulo não funciona nesta solicitação.
  • O valor de "-" significa que a resolução de nomes falhou.

$proxy_connect_connect_time

Mantém o tempo gasto na estabelecimento de uma conexão com o servidor upstream; o tempo é mantido em segundos com resolução de milissegundos.

  • O valor de "" significa que este módulo não funciona nesta solicitação.
  • O valor de "-" significa que a resolução de nomes ou a conexão falhou.

$proxy_connect_first_byte_time

Mantém o tempo para receber o primeiro byte de dados do servidor upstream; o tempo é mantido em segundos com resolução de milissegundos.

  • O valor de "" significa que este módulo não funciona nesta solicitação.
  • O valor de "-" significa que a resolução de nomes, a conexão ou o recebimento falharam.

$proxy_connect_response

Obtém ou define a resposta da solicitação CONNECT.
A resposta padrão da solicitação CONNECT é "HTTP/1.1 200 Connection Established\r\nProxy-agent: nginx\r\n\r\n".

Observe que é usado apenas para a solicitação CONNECT, não pode modificar o fluxo de dados sobre o túnel CONNECT.

Por exemplo:

## modificar cabeçalho Proxy-agent padrão
set $proxy_connect_response "HTTP/1.1 200\r\nProxy-agent: nginx/1.19\r\n\r\n";

O valor da variável não suporta variáveis do nginx. Você pode usar o módulo lua-nginx para construir uma string que contém uma variável do nginx. Por exemplo:

## A resposta CONNECT pode 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)
';

Além disso, observe que a diretiva set ou rewrite_by_lua* é executada durante a fase REWRITE, que é anterior à fase de resolução de dns. Não pode obter o valor correto de algumas variáveis, por exemplo, o valor de $connect_addr é nil. Nesse caso, você deve usar a diretiva proxy_connect_response em vez disso.

Compatibilidade

Compatibilidade com Nginx

O módulo mais recente é compatível com as seguintes versões do nginx:

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

Compatibilidade com OpenResty

O módulo mais recente é compatível com as seguintes versões do OpenResty:

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

Compatibilidade com Tengine

Este módulo foi integrado ao Tengine 2.3.0.

FAQ

Veja página de FAQ.

Problemas Conhecidos

  • No HTTP/2, o método CONNECT não é suportado. Ele suporta apenas a solicitação do método CONNECT no HTTP/1.x e HTTPS.

Veja Também

Autor

LICENÇA

Veja LICENÇA para detalhes.

GitHub

Você pode encontrar dicas adicionais de configuração e documentação para este módulo no repositório GitHub do nginx-module-proxy-connect.