因与银行合作部署项目,他们都是业务代码放在内网区,外部请求业务代码数据以及 业务代码向互联网请求数据都需要通过一台Web区的代理转发;这就需要部署一台即可以进行反射代理,又可以正向代理的服务器了;
先把注意点以及踩过的坑先说一下
不建议正向代理与反向代理都通过一个接口,否则配置到你怀疑人生
一、 A服务器正向代理配置几个端口看你的业务需求: 1、如果你只需要代理https,那么A服务器开通一个端口专门代理https服务器;2、如果你需要代理的即有http又有https,那么就开通两个端口,一个用于代理http;一个用于代理https;
A服务器反向代理:也单独开通一个端口用于反射代理吧
二、我配置完成这些后,在cmd命令行输入 curl https://www.baidu.com, 正向请求到数据,但我执行PHP代码后,却连不能请求到数据,百度了一大圈也没啥用,后来就通过代码来进行代理 ;
1、curl方法
$ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_PROXY, '32.9.39.51:9447'); //这里进行代理到A服务器的IP以及端口 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); // POST数据 curl_setopt($ch, CURLOPT_POST, 1); // 把post的变量加上 curl_setopt($ch, CURLOPT_POSTFIELDS, $data); $output = curl_exec($ch); curl_close($ch); return $output;
2、Guzzle HTTP Client
// 创建Guzzle HTTP Client时,将HandlerStack传入 $this->client = new Client(array('handler' => $stack,'allow_redirects' => true,'proxy' => '32.9.39.51:9447'));
定位 :
A服务器----------- 在外网Web区,可以访问互联网,也可以通过指定端口访问内网区,即我们所说的代理转发服务器
B服务器------------在内网区,访问不了互联网
一、、A服务器安装Nginx,
这里分两种情况讨论
第一种是已经安装完成了Nginx, 但你的正向代理却需要https
1、下载https代理模块,git地址:https://github.com/chobits/ngx_http_proxy_connect_module,如果不能下载就百度ngx_http_proxy_connect_module这个模块
下载完成后,看一下里面的readme文档,里面有介绍相应模块所对应的nginx版本
2、查询当前 nginx 安装的配置信息,默认安装如下
# ./sbin/nginx -V
configure arguments: --prefix=/usr/local/nginx --。。。。。。。。。。。。。。。。
# patch -p1 < /opt/tool/ngx_http_proxy_connect_module-master/patch/proxy_connect.patch
# ./configure --prefix=/usr/local/nginx --add-module=/opt/tool/ngx_http_proxy_connect_module-master
# make
# cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak
# cp ./objs/nginx /usr/local/nginx/sbin/
3、在A服务器配置正向代理
server { resolver 114.114.114.114; #指定DNS服务器IP地址 listen 9447; proxy_connect; proxy_connect_allow all; location / { proxy_pass https://$host$request_uri; #设定代理服务器的协议和地址 proxy_set_header Host $host; # proxy_ssl_server_name on; # 配置缓存大小 proxy_buffers 256 4k; # 关闭磁盘缓存读写减少I/O proxy_max_temp_file_size 0; # 代理连接超时时间 proxy_connect_timeout 30; # 配置代理服务器HTTP状态缓存时间 proxy_cache_valid 200 302 10m; proxy_cache_valid 301 1h; proxy_cache_valid any 1m; } }
# vi /etc/profile 将下面的添加到最后
http_proxy=http://172.25.114.72:8080/ 这个填写A服务器的内网IP 以及端口
https_proxy=https://172.25.114.72:8084/ 这个填写A服务器的内网IP 以及端口
export http_proxy https_prox no_proxy
5、重新加载
# source /etc/profile
# curl -k https://www.baidu.com
2、第二种情况完成正向代理https 只需要http
直接设置nginx配置文件即可
server { resolver 114.114.114; #可以使用 8.8.8.8 listen 8080; #指定代理的端口 location / { proxy_pass http://$http_host$request_uri; #设定代理服务器的协议和地址 } }
# vi /etc/profile 将下面的添加到最后
http_proxy=http://172.25.114.72:8080/
export http_proxy
2、重新加载
# source /etc/profile
# curl -k https://www.baidu.com
二、A服务器配置反向代理;使用9446端口进行反射代理到B服务器的
location /End/public/ { proxy_pass 这边修改为B服务器的内网IP以及端口 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header REMOTE-HOST $remote_addr; add_header X-Cache $upstream_cache_status; add_header Cache-Control no-cache; expires 12h; }