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 {}следующим образом:$ curl https://github.com/ -v -x 127.0.0.1:3128location / { return 403 "Non-CONNECT requests are forbidden"; } ``` Пример для curl ---------------- С вышеуказанной конфигурацией ([пример конфигурации](#configuration-example)) вы можете получить любой https-сайт через HTTP CONNECT туннель. Простой тест с помощью команды `curl` выглядит следующим образом: - 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 в качестве прокси-сервера.
- Настройки HTTPS PROXY для Google Chrome: руководство и конфигурация о том, как настроить этот модуль для работы под слоем SSL.
Пример для базовой аутентификации
Мы можем осуществлять контроль доступа к запросу CONNECT с помощью модуля аутентификации nginx.
Смотрите это руководство для получения дополнительной информации.
Пример проксирования WebSocket
- Обратите внимание, что nginx имеет свой собственный модуль обратного прокси для WebSocket, который не ограничивается туннелем CONNECT, смотрите документацию nginx.org: Проксирование WebSocket Nginx и блог nginx.com: NGINX как прокси для WebSocket.
- Этот модуль позволяет протоколу WebSocket работать через туннель CONNECT, смотрите https://github.com/chobits/ngx_http_proxy_connect_module/issues/267#issuecomment-1575449174.
Установка
Выбор патча
- Выберите правильный патч для сборки:
- Все файлы патчей включены в директорию
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.
- Документация Tengine ngx_http_proxy_connect_module
- Слияние запроса на вытягивание для Tengine 2.3.0.
Часто задаваемые вопросы
Смотрите страницу FAQ.
Известные проблемы
- В HTTP/2 метод CONNECT не поддерживается. Он поддерживает только запрос метода CONNECT в HTTP/1.x и HTTPS.
Смотрите также
Автор
- Peng Qi: оригинальный автор. Он внес этот модуль в Tengine в этом запросе на вытягивание.
- Xiaochen Wang: текущий куратор. Пересобрал этот модуль для nginx.
ЛИЦЕНЗИЯ
Смотрите LICENSE для получения подробной информации.
GitHub
Вы можете найти дополнительные советы по конфигурации и документацию для этого модуля в репозитории GitHub для nginx-module-proxy-connect.