Перейти к содержанию

proxy-connect: Поддержка метода CONNECT в NGINX

Установка

Вы можете установить этот модуль в любой дистрибутив на базе RHEL, включая, но не ограничиваясь:

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

Включите модуль, добавив следующее в верхнюю часть /etc/nginx/nginx.conf:

load_module modules/ngx_http_proxy_connect_module.so;

Этот документ описывает nginx-module-proxy-connect v0.0.2, выпущенный 24 декабря 2024 года.


Этот форк интегрирован в NGINX-MOD.

[!CAUTION] В настоящее время не рекомендуется компилировать как динамический модуль, исправленный бинарный файл NGINX не будет учитывать флаг NGX_HTTP_PROXY_CONNECT. Единственный правильный способ - это компиляция NGINX и динамического модуля одновременно, а затем удаление модуля для упаковки.

[!CAUTION] Существующий патч не соответствовал ABI, так как добавлял поля в середину.

Этот модуль предоставляет поддержку запроса метода CONNECT. Этот метод в основном используется для туннелирования SSL-запросов через прокси-серверы.

Пример

Пример конфигурации

server {
    listen                         3128;

    # dns resolver used by forward proxying
    resolver                       8.8.8.8;

    # forward proxy for CONNECT requests
    proxy_connect;
    proxy_connect_allow            443 563;
    proxy_connect_connect_timeout  10s;
    proxy_connect_data_timeout     10s;

    # defined by yourself for non-CONNECT requests
    # Example: reverse proxy for non-CONNECT requests
    location / {
        proxy_pass http://$host;
        proxy_set_header Host $host;
    }
}
  • Директива resolver ДОЛЖНА быть настроена глобально в блоке server {} (или http {}).
  • Любой блок location {}, блок upstream {} и любые другие стандартные директивы бэкенда/upstream, такие как proxy_pass, не влияют на функциональность этого модуля. (Модуль proxy_connect выполняет логику только для запросов, использующих метод CONNECT и имеющих поток данных под этим туннелем.)
  • Если вы не хотите обрабатывать запросы, не относящиеся к CONNECT, вы можете изменить блок location {} следующим образом:
        location / {
            return 403 "Non-CONNECT requests are forbidden";
        }
        ```
    
    Пример для curl
    ----------------
    
    С вышеуказанной конфигурацией ([пример конфигурации](#configuration-example)) вы можете получить любой https-сайт через HTTP CONNECT туннель. Простой тест с помощью команды `curl` выглядит следующим образом:
    
    $ curl https://github.com/ -v -x 127.0.0.1:3128
  • Trying 127.0.0.1... -.
  • Connected to 127.0.0.1 (127.0.0.1) port 3128 (#0) | curl создает TCP-соединение с nginx (с модулем proxy_connect).
  • Establish HTTP proxy tunnel to github.com:443 -'

    CONNECT github.com:443 HTTP/1.1 -. Host: github.com:443 (1) | curl отправляет запрос CONNECT для создания туннеля. User-Agent: curl/7.43.0 | Proxy-Connection: Keep-Alive -'

    < HTTP/1.0 200 Connection Established .- nginx отвечает 200, что туннель установлен. < Proxy-agent: nginx (2)| (Клиент теперь проксируется на удаленный хост. Все данные, отправленные < '- в nginx, теперь пересылаются, без изменений, на удаленный хост)

  • 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 отправляет запрос "https://github.com" через туннель,
  • Server certificate: DigiCert High Assurance EV Root CA | модуль proxy_connect будет проксировать данные на удаленный хост (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 | Все данные, полученные от удаленного хоста, будут отправлены клиенту < Transfer-Encoding: chunked | модулем 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 | | | | | | | ========= Туннель CONNECT установлен. =========== | | | | | | | | | [ 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 > ] | | | | |
    Пример конфигурации для запроса CONNECT по HTTPS
    --------------------------------------------------
    
    ```nginx
    server {
        listen                         3128 ssl;
    
        # self signed certificate generated via openssl command
        ssl_certificate_key            /path/to/server.key;
        ssl_certificate                /path/to/server.crt;
        ssl_session_cache              shared:SSL:1m;
    
        # dns resolver used by forward proxying
        resolver                       8.8.8.8;
    
        # forward proxy for CONNECT request
        proxy_connect;
        proxy_connect_allow            443 563;
        proxy_connect_connect_timeout  10s;
        proxy_connect_data_timeout     10s;
    
        # defined by yourself for non-CONNECT request
        # Example: reverse proxy for non-CONNECT requests
        location / {
            proxy_pass http://$host;
            proxy_set_header Host $host;
        }
    }
    

Пример для curl (запрос CONNECT по https)

С вышеуказанной конфигурацией (пример конфигурации для запроса CONNECT по https), вы можете получить любой https-сайт через HTTPS CONNECT туннель (запрос CONNECT по https). Простой тест с помощью команды curl выглядит следующим образом:

Советы по использованию команды curl:

  • -x https://... заставляет curl отправлять запрос CONNECT по https.
  • --proxy-insecure отключает проверку подписи ssl для ssl-соединения, установленного с сервером nginx proxy_connect (https://localhost:3128), но не отключает проверку с проксируемым бэкенд-сервером (https://nginx.org в примере ниже).
  • Если вы хотите отключить проверку подписи с проксируемым бэкенд-сервером, вы можете использовать опцию -k.
вывод команды 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

Пример для браузера

Вы можете настроить свой браузер для использования этого nginx в качестве прокси-сервера.

Пример для базовой аутентификации

Мы можем осуществлять контроль доступа к запросу CONNECT с помощью модуля аутентификации nginx.
Смотрите это руководство для получения дополнительной информации.

Пример проксирования WebSocket

Установка

Выбор патча

  • Выберите правильный патч для сборки:
  • Все файлы патчей включены в директорию patch/ этого модуля. Вам не нужно загружать патч напрямую с веб-страницы.
версия nginx включить фазу REWRITE патч
1.4.x ~ 1.12.x НЕТ proxy_connect.patch
1.4.x ~ 1.12.x ДА proxy_connect_rewrite.patch
1.13.x ~ 1.14.x НЕТ proxy_connect_1014.patch
1.13.x ~ 1.14.x ДА proxy_connect_rewrite_1014.patch
1.15.2 ДА proxy_connect_rewrite_1015.patch
1.15.4 ~ 1.16.x ДА proxy_connect_rewrite_101504.patch
1.17.x ~ 1.18.x ДА proxy_connect_rewrite_1018.patch
1.19.x ~ 1.21.0 ДА proxy_connect_rewrite_1018.patch
1.21.1 ~ 1.22.x ДА proxy_connect_rewrite_102101.patch
1.23.x ~ 1.24.0 ДА proxy_connect_rewrite_102101.patch
1.25.0 ~ 1.26.x ДА proxy_connect_rewrite_102101.patch
1.27.1 ДА proxy_connect_rewrite_102101.patch
версия OpenResty включить фазу REWRITE патч
1.13.6 НЕТ proxy_connect_1014.patch
1.13.6 ДА proxy_connect_rewrite_1014.patch
1.15.8 ДА proxy_connect_rewrite_101504.patch
1.17.8 ДА proxy_connect_rewrite_1018.patch
1.19.3 ДА proxy_connect_rewrite_1018.patch
1.21.4 ДА proxy_connect_rewrite_102101.patch
1.25.3 ДА proxy_connect_rewrite_102101.patch
  • proxy_connect_<VERSION>.patch по умолчанию отключает фазу REWRITE nginx для запроса CONNECT, что означает, что директивы if, set, rewrite_by_lua и другие директивы фазы REWRITE не могут быть использованы.
  • proxy_connect_rewrite_<VERSION>.patch включает эти директивы фазы REWRITE.

Сборка nginx

  • Соберите nginx с этим модулем из исходников:
$ 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

Сборка как динамического модуля

  • Начиная с nginx 1.9.11, вы также можете скомпилировать этот модуль как динамический модуль, используя опцию --add-dynamic-module=PATH вместо --add-module=PATH в команде ./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
  • А затем вы можете явно загрузить модуль в вашем nginx.conf через директиву load_module, например,
load_module /path/to/modules/ngx_http_proxy_connect_module.so;
  • ❗ Обратите внимание, что файл ngx_http_proxy_connect_module.so ДОЛЖЕН быть загружен бинарным файлом nginx, который был скомпилирован с этим .so файлом одновременно.

Сборка OpenResty

  • Соберите OpenResty с этим модулем из исходников:
$ 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

Тестовый набор

  • Чтобы запустить весь тестовый набор:
$ hg clone http://hg.nginx.org/nginx-tests/

## Если вы используете последний lua-nginx-module, который требует lua-resty-core и
## lua-resty-lrucache, вам следует добавить директиву "lua_package_path ...;" 
## в nginx.conf тестовых случаев. Вы можете использовать следующую команду:
#
## $ 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/
  • Для полного процесса сборки и тестирования этого модуля смотрите:
  • файлы рабочего процесса: здесь
  • запуски всех рабочих процессов: здесь

Журнал ошибок

Этот модуль ведет собственные сообщения об ошибках, начинающиеся с строки "proxy_connect:".
Некоторые типичные журналы ошибок показаны ниже:

  • Модуль proxy_connect пытается установить туннельное соединение с бэкенд-сервером, но происходит тайм-аут 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"

Директивы

proxy_connect

Синтаксис: proxy_connect
По умолчанию: none
Контекст: server

Включает поддержку HTTP-метода "CONNECT".

proxy_connect_allow

Синтаксис: proxy_connect_allow all | [port ...] | [port-range ...]
По умолчанию: 443 563
Контекст: server

Эта директива указывает список номеров портов или диапазонов, к которым метод прокси CONNECT может подключаться.
По умолчанию разрешены только стандартный https порт (443) и стандартный порт snews (563).
Использование этой директивы переопределит это значение по умолчанию и позволит подключения только к указанным портам.

Значение all позволит проксировать все порты.

Значение port позволит проксировать указанный порт.

Значение port-range позволит проксировать указанный диапазон портов, например:

proxy_connect_allow 1000-2000 3000-4000; # разрешить диапазон портов от 1000 до 2000, от 3000 до 4000.

proxy_connect_connect_timeout

Синтаксис: proxy_connect_connect_timeout time
По умолчанию: none
Контекст: server

Определяет тайм-аут для установления соединения с проксируемым сервером.

proxy_connect_data_timeout

Синтаксис: proxy_connect_data_timeout time
По умолчанию: 60s
Контекст: server

Устанавливает тайм-аут между двумя последовательными операциями чтения или записи на соединениях клиента или проксируемого сервера. Если данные не передаются в течение этого времени, соединение закрывается.

proxy_connect_read_timeout

Синтаксис: proxy_connect_read_timeout time
По умолчанию: 60s
Контекст: server

Устарело.

Он выполняет ту же функцию, что и директива proxy_connect_data_timeout для совместимости. Вы можете настроить только одну из директив (proxy_connect_data_timeout или proxy_connect_read_timeout).

proxy_connect_send_timeout

Синтаксис: proxy_connect_send_timeout time
По умолчанию: 60s
Контекст: server

Устарело.

Не имеет функции.

proxy_connect_address

Синтаксис: proxy_connect_address address | off
По умолчанию: none
Контекст: server

Укажите IP-адрес проксируемого сервера. Адрес может содержать переменные.
Специальное значение off эквивалентно none, которое использует IP-адрес, разрешенный из имени хоста строки запроса CONNECT.

ПРИМЕЧАНИЕ: Если вы используете set $<nginx variable> и proxy_connect_address $<nginx variable> вместе, вам следует использовать proxy_connect_rewrite.patch, смотрите Установка для получения дополнительной информации.

proxy_connect_bind

Синтаксис: proxy_connect_bind address [transparent] | off
По умолчанию: none
Контекст: server

Заставляет исходящие соединения с проксируемым сервером происходить с указанного локального IP-адреса с необязательным портом.
Значение параметра может содержать переменные. Специальное значение off эквивалентно none, что позволяет системе автоматически назначать локальный IP-адрес и порт.

Параметр transparent позволяет исходящим соединениям с проксируемым сервером происходить с не локального IP-адреса, например, с реального IP-адреса клиента:

proxy_connect_bind $remote_addr transparent;

Чтобы этот параметр работал, обычно необходимо запускать рабочие процессы nginx с привилегиями суперпользователя. В Linux это не требуется (1.13.8), так как если указан параметр transparent, рабочие процессы наследуют возможность CAP_NET_RAW от главного процесса. Также необходимо настроить таблицу маршрутизации ядра для перехвата сетевого трафика от проксируемого сервера.

ПРИМЕЧАНИЕ: Если вы используете set $<nginx variable> и proxy_connect_bind $<nginx variable> вместе, вам следует использовать proxy_connect_rewrite.patch, смотрите Установка для получения дополнительной информации.

proxy_connect_response

Синтаксис: proxy_connect_response CONNECT response
По умолчанию: HTTP/1.1 200 Connection Established\r\nProxy-agent: nginx\r\n\r\n
Контекст: server

Установите ответ на запрос CONNECT.

Обратите внимание, что он используется только для запроса CONNECT, он не может изменить поток данных через туннель CONNECT.

Например:

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

Тестовый случай команды curl с вышеуказанной конфигурацией выглядит следующим образом:

$ 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                               | пользовательский ответ CONNECT
< X-Proxy-Connected-Addr: 13.229.188.59:443      --'
...

Переменные

$connect_host

имя хоста из строки запроса CONNECT.

$connect_port

порт из строки запроса CONNECT.

$connect_addr

IP-адрес и порт удаленного хоста, например "192.168.1.5:12345".
IP-адрес разрешается из имени хоста строки запроса CONNECT.

$proxy_connect_connect_timeout

Получить или установить тайм-аут директивы proxy_connect_connect_timeout.

Например:

## Установить значение по умолчанию

proxy_connect_connect_timeout   10s;
proxy_connect_data_timeout      10s;

## Переопределить значение по умолчанию

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

$proxy_connect_data_timeout

Получить или установить тайм-аут директивы proxy_connect_data_timeout.

$proxy_connect_read_timeout

Устарело. Тем не менее, он все еще может получать или устанавливать тайм-аут директивы proxy_connect_data_timeout для совместимости.

$proxy_connect_send_timeout

Устарело. Не имеет функции.

$proxy_connect_resolve_time

Сохраняет время, затраченное на разрешение имени; время сохраняется в секундах с миллисекундной точностью.

  • Значение "" означает, что этот модуль не работает с этим запросом.
  • Значение "-" означает, что разрешение имени не удалось.

$proxy_connect_connect_time

Сохраняет время, затраченное на установление соединения с upstream-сервером; время сохраняется в секундах с миллисекундной точностью.

  • Значение "" означает, что этот модуль не работает с этим запросом.
  • Значение "-" означает, что разрешение имени или подключение не удалось.

$proxy_connect_first_byte_time

Сохраняет время получения первого байта данных от upstream-сервера; время сохраняется в секундах с миллисекундной точностью.

  • Значение "" означает, что этот модуль не работает с этим запросом.
  • Значение "-" означает, что разрешение имени, подключение или получение не удалось.

$proxy_connect_response

Получить или установить ответ на запрос CONNECT.
Ответ по умолчанию на запрос CONNECT - "HTTP/1.1 200 Connection Established\r\nProxy-agent: nginx\r\n\r\n".

Обратите внимание, что он используется только для запроса CONNECT, он не может изменить поток данных через туннель CONNECT.

Например:

## изменить заголовок по умолчанию Proxy-agent
set $proxy_connect_response "HTTP/1.1 200\r\nProxy-agent: nginx/1.19\r\n\r\n";

Значение переменной не поддерживает переменные nginx. Вы можете использовать lua-nginx-module для построения строки, содержащей переменную nginx. Например:

## Ответ CONNECT может быть "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)
';

Также обратите внимание, что директива set или rewrite_by_lua* выполняется на фазе REWRITE, которая предшествует фазе разрешения dns. Она не может получить правильное значение некоторых переменных, например, значение $connect_addr равно nil. В таком случае вам следует использовать директиву proxy_connect_response.

Совместимость

Совместимость с Nginx

Последний модуль совместим со следующими версиями nginx:

  • 1.27.1 (основная версия 1.27.x)
  • 1.26.2 (версия 1.26.x)
  • 1.24.0 (версия 1.24.x)
  • 1.22.1 (версия 1.22.x)
  • 1.20.2 (версия 1.20.x)
  • 1.18.0 (версия 1.18.x)
  • 1.16.1 (версия 1.16.x)
  • 1.14.2 (версия 1.14.x)
  • 1.12.1 (версия 1.12.x)
  • 1.10.3 (версия 1.10.x)
  • 1.8.1 (версия 1.8.x)
  • 1.6.3 (версия 1.6.x)
  • 1.4.7 (версия 1.4.x)

Совместимость с OpenResty

Последний модуль совместим со следующими версиями OpenResty:

  • 1.25.3 (версия: 1.25.3.1)
  • 1.21.4 (версия: 1.21.4.3)
  • 1.19.3 (версия: 1.19.3.1)
  • 1.17.8 (версия: 1.17.8.2)
  • 1.15.8 (версия: 1.15.8.1)
  • 1.13.6 (версия: 1.13.6.2)

Совместимость с Tengine

Этот модуль был интегрирован в Tengine 2.3.0.

Часто задаваемые вопросы

Смотрите страницу FAQ.

Известные проблемы

  • В HTTP/2 метод CONNECT не поддерживается. Он поддерживает только запрос метода CONNECT в HTTP/1.x и HTTPS.

Смотрите также

Автор

ЛИЦЕНЗИЯ

Смотрите LICENSE для получения подробной информации.

GitHub

Вы можете найти дополнительные советы по конфигурации и документацию для этого модуля в репозитории GitHub для nginx-module-proxy-connect.