情况说明
内网服务器A(windows)可以访问外网,B (centos) 无法访问外网,业务需求需要B通过A代理访问外网天气接口
方法
1. A服务器设置代理
A 服务器使用CCProxy做正向代理
A 服务器使用Nginx做正向代理(我的做法,配置文件后面给出)
2.B服务器通过代理访问
B 服务器配置http_proxy export http_proxy=http://192.168.0.11:1080;export no_proxy=192.168.*,*.local,localhost,127.0.0.1
(可实现命令行curl方式通过代理请求外网,Java程序无法读取设置的代理,不知道是开发的配置问题还是其他原因)
让开发配合解决,我给提供了以下参考https://cloud.tencent.com/developer/article/1129653 https://www.cnblogs.com/badboyf/p/6223457.html
最终解决
启动命令加参数
java -Dhttp.proxySet=true -Dhttp.keepAlive=false -Dhttp.proxyHost=192.168.2.18 -Dhttp.proxyPort=1080 -Dhttp.nonProxyHosts="localhost|127.0.0.1|192.168.*" -jar aaa.jar
开发修改了代码据说是使其可以加载环境变量,但是并没有读取到我export设置的系统环境变量,所以必须加上上述参数才可以做到代理
Nginx正向代理配置
server
{
listen 1080;
server_name localhost;
location / {
proxy_set_header Host aaa.bbb.com;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://aaa.bbb.com; #aaa.bbb.com必须可以正确解析
}
}
这样的缺点是每次只能代理一个域名,通过内置变量实现通用匹配
server
{
listen 1080;
location / {
proxy_set_header HOST $host;
proxy_pass http://$host$request_uri; #设定代理服务器的协议和地址
proxy_buffers 256 4k;
proxy_max_temp_file_size 0k;
proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
proxy_next_upstream error timeout invalid_header http_502;
}
}
我这样配置了没有成功,报错502,时间关系没有继续排查,有感兴趣的可以试一下