如果你不了解 HTTP CONNECT请求,可以参考《web代理是怎样工作的》中的HTTPS代理部分。
Nginx是作为反向代理服务器开发的,官方并不支持 CONNECT请求。
(注:正向代理和反向代理都是代理,工作起来也很像。正向代理是请求到来时才知道代理的目标;反向代理是代理的目标已经配好,等待请求的到来)
阿里的工程师chobits 开发了ngx_http_proxy_connect_module来支持这一请求。
但是,使用此模块需要自己编译Nginx,可以根据文末参考链接[1][2]。
也有人制作了编译好的Nginx Docker镜像,见文末连接[3]。
这里就基于这个Docker镜像测试下这个功能。
创建一个实验路径:
mkdir nginx_connect
cd nginx_connect
编写docker compose配置文件
# file compose.yaml
services:
nginx_connect:
image: "dockerproxy.net/runalsh/nginx:deb-1.27.3"
user: "root"
ports:
- "8081:80"
volumes:
- ./data/nginx:/etc/nginx/conf.d/
注:镜像是用的镜像站或代理站下载的,例如
docker pull dockerproxy.net/runalsh/nginx:deb-1.27.3
编写nginx配置文件
mkdir ./data/nginx
vim ./data/nginx/http_connect_server.conf
# file http_connect_server.conf
server {
listen 80;
# dns resolver used by forward proxying
resolver 1.1.1.1;
# forward proxy for CONNECT requests
proxy_connect;
proxy_connect_allow all;
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;
}
}
启动服务器
docker compose up -d
测试
用 curl -x 测试:
curl -svo /dev/null https://www.baidu.com/ -x 127.0.0.1:8081
用 socat PROXY 代理测试:
socat - PROXY:127.0.0.1:www.baidu.com:80,proxyport=8081
用 nc -X connect 代理测试:
nc -X connect -x 127.0.0.1:8081 www.baidu.com 80
参考:
[1] https://www.alibabacloud.com/blog/how-to-use-nginx-as-an-https-forward-proxy-server_595799
[2] https://github.com/chobits/ngx_http_proxy_connect_module
[3] https://hub.docker.com/r/runalsh/nginx