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
resolverDEVE ser configurada globalmente no blocoserver {}(ou blocohttp {}). - Qualquer bloco
location {}, blocoupstream {}e quaisquer outras diretivas padrão de backend/upstream, comoproxy_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:$ curl https://github.com/ -v -x 127.0.0.1:3128location / { 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: - 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 | ... | ...
... | ... '- 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 > ] | | | | |O diagrama de sequência do exemplo acima é o seguinte: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-insecuredesabilita 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.orgno 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
- Observe que o nginx tem seu próprio módulo de proxy reverso WebSocket, que não se limita ao túnel CONNECT, veja documentação do nginx.org: Proxy WebSocket do Nginx e blog do nginx.com: NGINX como um Proxy WebSocket.
- Este módulo permite que o protocolo WebSocket funcione sobre o túnel CONNECT, veja https://github.com/chobits/ngx_http_proxy_connect_module/issues/267#issuecomment-1575449174.
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>.patchdesabilita a fase REWRITE do nginx para a solicitação CONNECT por padrão, o que significa queif,set,rewrite_by_luae outras diretivas da fase REWRITE não podem ser usadas.proxy_connect_rewrite_<VERSION>.patchhabilita 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=PATHem vez de--add-module=PATHna 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
- Peng Qi: autor original. Ele contribuiu com este módulo para Tengine neste pull request.
- Xiaochen Wang: mantenedor atual. Reconstruiu este módulo para nginx.
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.