场景
我使用python爬虫,然后需要个代理,所以就用Nginx搭了一个代理服务器。对Nginx也不太熟,慢慢摸索,搭建完之后发现只能代理http的请求,无法穿透https。几经折腾和摸索发现一个强大的HTTP代理模块:ngx_http_proxy_connect_module
ngx_http_proxy_connect_module介绍
项目地址:https://github.com/chobits/ngx_http_proxy_connect_module
ngx_http_proxy_connect_module是Nginx的一个扩展模块,主要功能是在Nginx服务器上开启对CONNECT方法的支持。在HTTP协议中,CONNECT方法主要用于建立隧道,常见于WebSocket连接和HTTPS的中间人代理。通过该模块,你可以将Nginx作为HTTP/HTTPS代理服务器,甚至可以直接用作WebSocket服务器。
安装配置
选择对应的版本
安装
$ 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
配置
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; } }
实际案例:
#正向代理 server{ resolver 114.114.114.114; resolver_timeout 30s; listen 843; proxy_connect; #启用 CONNECT HTTP方法 proxy_connect_allow 443 563; #指定代理CONNECT方法可以连接的端口号或范围的列表 proxy_connect_connect_timeout 20s; #定义客户端与代理服务器建立连接的超时时间 proxy_connect_read_timeout 20s; #定义客户端从代理服务器读取响应的超时时间 proxy_connect_send_timeout 20s; #设置客户端将请求传输到代理服务器的超时时间 location / { proxy_pass http://$host; proxy_set_header Host $host; } }
效果
执行这个命令查看效果
curl https://github.com/ -v -x 127.0.0.1:3128
在python中使用
default_proxy = { 'http': 'http://43.123.42.139:843', 'https': 'http://43.123.42.139:843' } # 这样就可以使用了 requests.get('https://www.baidu.com/', proxies=proxy)
参考文章:
推荐一个强大的HTTP代理模块:ngx_http_proxy_connect_module
深入理解ngx_http_proxy_connect_module模块
还没有评论,来说两句吧...