nginx正向代理从安装到使用一网打尽系列(二)使用

一、背景

使用场景大总结,可作为参考手册用

nginx正向代理从安装到使用一网打尽系列(一)安装

nginx正向代理从安装到使用一网打尽系列(二)使用

二、使用场景

1、所有内网应用都不能直接访问外网,但需要能通过(内部的)外网代理服务器访问

2、自己不能上网,蹭别人的网,局域网代理软件Ccproxy也是一种正向代理

3、大家访问外国网站使用的梯子(翻墙)也是一种正向代理

三、环境

四、接口(级 ) 使用代理

1、http接口使用代理

-》openfeign

说明:

应用级, 同时也可以通过proxySelector作为接口级来用

第一步:配置文件允许覆盖Bean
TypeScript 复制代码
spring:
  main:
allow-bean-definition-overriding: true
第二步:配置Bean
java 复制代码
package person.brickman.config;
 
import okhttp3.*;
import org.springframework.cloud.commons.httpclient.DefaultOkHttpClientFactory;
import org.springframework.cloud.commons.httpclient.OkHttpClientFactory;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
 
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Proxy;
 
@Configuration
//配置openfein接口的文件件路径
@EnableFeignClients(basePackages = "com.ciih.refine.server")
public class Config {
 
    @Bean
    public OkHttpClientFactory okHttpClientFactory(OkHttpClient.Builder builder) {
        return new ProxyOkHttpClientFactory(builder);
    }
 
    static class ProxyOkHttpClientFactory extends DefaultOkHttpClientFactory {
 
        public ProxyOkHttpClientFactory(OkHttpClient.Builder builder) {
            super(builder);
            //配置IP、端口
            Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("10.40.3.XXX ", 9999));
            builder.proxy(proxy);
 
            builder.proxyAuthenticator(new Authenticator() {
                @Override
                public Request authenticate(Route route, Response response) throws IOException {
                    //设置代理服务器账号密码
                    String credential = Credentials.basic("admin", "admin");
                    return response.request().newBuilder()
                            .header("Proxy-Authorization", credential)
                            .build();
                }
            });
            //如果要配置限制域则加上下面
            /*List<Proxy> proxyList = new ArrayList<>(1);
            proxyList.add(proxy);
            builder.proxySelector(new ProxySelector() {
                //限制域
                Set<String> domainList;
                @Override
                public List<Proxy> select(URI uri) {
                    if (uri == null || !domainList.contains(uri.getHost())) {
                        return Collections.singletonList(Proxy.NO_PROXY);
                    }
                    return proxyList;
                }
                @Override
                public void connectFailed(URI uri, SocketAddress sa, IOException ioe) {
                }
            });*/
        }
    }
}

-》OkHttpClient

java 复制代码
OkHttpClient.Builder builder = client.newBuilder();
builder.proxy(new Proxy(Proxy.Type.HTTP, 
	new InetSocketAddress(hostName, Integer.parseInt(hostPort))));
...
Response response = builder.cookieJar(new LocalCookieJar()).build().newCall(request).execute()

-》HttpClient

java 复制代码
 URL url = RequestUtils.getUrlOrNull(hostUrl);

  HttpHost target = new HttpHost(url.getHost(),getPort(url),url.getProtocol());
  HttpGet request = new HttpGet("/user?name=xxx");
//  HttpGet httpGet = new HttpGet(hostUrl); // 非代理
...
httpClient.execute(target, request) // 代理
// httpClient.execute(httpGet); // 非代理

-》HttpURLConnection

java 复制代码
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("10.40.3.XXX", 9999));
URL url = new URL("http://www.yahoo.com");
HttpURLConnection uc = (HttpURLConnection)url.openConnection(proxy);
uc.connect();
DefaultHttpClient
DefaultHttpClient httpclient = new DefaultHttpClient();]
HttpHost proxy = new HttpHost("10.40.3.XXX", 9999);
httpclient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy);
PostMethod postMethod = new PostMethod(url);
int statusCode = httpClient.executeMethod(postMethod);

-》Fluent

java 复制代码
import org.apache.hc.client5.http.fluent.Request;

public class TestRequest {
    public static void main(final String... args) throws Exception {
        String url = "http://httpbin.org/anything";
        String proxy = "http://10.40.3.XXX:9999"; // Free proxy

        String response = Request.get(url)
                .viaProxy(proxy) // will set the passed proxy
                .execute().returnContent().asString();

        System.out.println(response);
    }
}

-》Jsonp

java 复制代码
String url="http://www.baidu.com";
String proxyHost="10.40.3.XXX";
int port=9999;
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyHost, port));
Connection.Response response = Jsoup.connect(url).proxy(proxy).execute();

2、webservice接口使用代理

-》c xf 客户端

java 复制代码
  JaxWsProxyFactoryBean factoryBean = new JaxWsProxyFactoryBean();  
   factoryBean.setServiceClass(TeacherWebService.class);  
   factoryBean.setAddress("http://xxx.xxx.xxx.xxx/webservice?wsdl");  
   TeacherWebService tService = (TeacherWebService )factoryBean.create();  
            
   Client client = ClientProxy.getClient(tService);
   HTTPConduit http = (HTTPConduit) client.getConduit();
   HTTPClientPolicy hcp = new HTTPClientPolicy();
   hcp.setProxyServer("10.40.3.XXX");
   hcp.setProxyServerPort(9999);
   http.setClient(hcp);

-》JAX-WS

java 复制代码
//Set the https.proxyHost as a property on the RequestContext.
BindingProvider bp = (Binding Provider)port;
bp.getRequestContext().put("https.proxyHost", "proxyHost1.ibm.com");
bp.getRequestContext().put("https.proxyPort", "80");

-》J AX-WS( 带URL匹配 )

java 复制代码
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.*;
import java.util.*;

public class MyProxySelector extends ProxySelector {
    private final ProxySelector def;//保存原来的,如果不是目标uri的需要按原来的走
    MyProxySelector(){
        this.def = ProxySelector.getDefault();
    }

    @Override
    public List<Proxy> select(URI uri) 
    {
        if(uri.getHost().contains("aaaaa")){//如果符合需要代理的地址则新建代理类
            System.out.println("select for " + uri.toString());
            Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("localhost", 9999));
            ArrayList<Proxy> list = new ArrayList<Proxy>();
            list.add(proxy);
            return list;  
        }
        return def.select(uri);//否则还是按原来的走
    }

    @Override
    public void connectFailed(URI uri, SocketAddress sa, IOException ioe) {
        System.err.println("Connection to " + uri + " failed.");
    }
}

public class Client {
    public static void main(String[] args) {
        ProxySelector.setDefault(new MyProxySelector());//在发起webservice之前调用一次即可,创建之后所有网络请求都会进入select方法,相当于是全局影响的。

        HelloImplService service = new HelloImplService();
        HelloImpl hello = service.getHelloImplPort();
        System.out.println(hello.sayHello("Howard Wollowitz"));
    }

}

**特别注意**

如果只要在接口级或应用级使用,千万不要在Java程序用使用如下的代码:

java 复制代码
System.setProperty("http.proxyHost", "代理服务器地址");

System.setProperty("http.proxyPort", "代理服务器端口");

system.setproperty函数设置的属性具有全局作用域,任何其他的Java程序和系统程序都可以读取这个属性的值。

五、应用(级 ) 使用代理

1、Tomcat 等web容器应用使用代理

-》方式一:在conf/server.xm中的Connector配置中添加代理配置

XML 复制代码
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
proxyName="10.40.3.XXX"
proxyPort="9999" />

-》方式二:在 bin/setenv.sh中添加代理参数****

bash 复制代码
# windows
SET JAVA_OPTS=%JAVA_OPTS% -Dhttp.proxyHost=10.40.3.XXX -Dhttp.proxyPort=9999
# linux
SET JAVA_OPTS=$JAVA_OPTS -Dhttp.proxyHost=10.40.3.XXX -Dhttp.proxyPort=9999

2、Springboot ja r应用使用代理

-》启动参数示例

bash 复制代码
java -Dhttp.proxyHost=10.40.3.XXX -Dhttp.proxyPort=9999
-Dhttps.proxyHost=10.40.3.XXX -Dhttps.proxyPort=9999
-Dhttp.nonProxyHosts="localhost|host.example.com" 
-jar test.jar

-》参数说明

css 复制代码
1.http.proxyHost : 代理服务器主机名
2.http.proxyPort : 端口号,默认是80
3.https.proxyHost : https代理服务器主机名
4.https.proxyPort: 代理端口号,默认是443
5.http.nonProxyHosts : 指定绕过代理的主机列表,使用 | 分割的模式列表,可以以通配符 * 开头或者结尾,任何匹配这些模式之一的主机都将通过直接连接而不是通过代理访问。该设置对http,https通用

六、整台机器使用代理

1、L inux使用代理

-》命令行方式

bash 复制代码
# vim /etc/profile # 添加下面两个环境变量
export http_proxy=http://10.40.3.XXX:9999
export https_proxy=http://10.40.3.XXX:9999
# source /etc/profile  # 不重起生效

-》图形化方式

-》Firefox浏览器使用代理

注意:

这里只对浏览器生效.

2、Windows使用代理

-》命令行方式

打开 cmd 命令行终端。

设置无密码的HTTP 代理服务器地址和端口号:

bash 复制代码
#设置 HTTP代理服务器地址和端口号:
set http_proxy=http://10.40.3.XXX:9999

#设置 HTTPS 代理服务器地址和端口号:
set https_proxy=http://10.40.3.XXX:9999

设置带用户名和密码的 HTTP 代理服务器地址和端口号:

bash 复制代码
# 设置带用户名和密码的 HTTP 代理服务器地址和端口号:
set http_proxy=http://<username>:<password>@<proxy-server>:<port>

#设置 HTTPS 代理服务器地址和端口号:
set https_proxy=http://<username>:<password>@<proxy-server>:<port>

#其中 <username>和 <password> 分别替换成你的代理服务器的用户名和密码,<proxy-server>` 和 <port>则分别替换成代理服务器的地址和端口号。

-》图形方式

-》Edge 浏览器使用代理

会调用上面图形化方式中的代理设置窗口(对整台机器生效)

3、M acOS 使用代理

-》命令行方式

mac打开命令行

执行 open -e ~/.zshrc 打开.zshrc文件 , 在下面插入:

bash 复制代码
function proxyOff(){
    unset http_proxy
    unset https_proxy
    echo -e "已关闭代理"

}

function proxyOn() {
    export http_proxy="http://10.40.3.XXX:9999"
    export https_proxy=$http_proxy
    echo -e "已开启代理"
}

proxyOn #开启代理
# proxyOff #关闭代理

执行

bash 复制代码
source ~/.zshrc

说明:

这里写成函数的形式可以让使用更灵活. 比如在脚本中动态开关.

-》图形化方式

-》S afari 浏览器使用代理

会调用上面图形化方式中的代理设置窗口(对整台机器生效)

七、总结

正向代理使用特别是在开发人员本地联调时一定要注意区分作用域,避免不必要的麻烦

八、【赠送】附件一: ssh端口转发

内网机器开发调试用, 程序访问的地址为localhost

此处以访问谷歌为例,执行如下命令后访问localhost:10000就是访问谷歌

bash 复制代码
ssh -L localhost:10000:www.google.com:80 root@10.40.3.XXX:9999 -NT

测试本机:

bash 复制代码
ssh -L localhost:81:www.baidu.com:80 daizhongde@192.168.31.99 -NT

示例:

表示从任意主机发往本机(A)的端口5900的流量,都通过主机 ++++10.3.171.219++++(B),发往主机 10.3.131.240(C) 的端口 8606(Z)

ssh -L 5900:10.3.131.240:8086 ++++root@10.3.171.219++++

端口转发补脑:

https://zhuanlan.zhihu.com/p/615584874?utm_id=0

相关推荐
Q_19284999061 分钟前
基于Spring Boot的爱记笔记网站
java·spring boot·后端
Q_19284999065 分钟前
基于Spring Boot的仓库租赁管理系统
java·spring boot·后端
Pandaconda16 分钟前
【Golang 面试题】每日 3 题(二十三)
开发语言·后端·面试·golang·go·channel
云妙算21 分钟前
手把手带你使用Karpenter减少K8s集群资源浪费
后端·kubernetes
小码编匠22 分钟前
最好用的 WPF 加载动画功能
后端·c#·.net
前端工作日常27 分钟前
Maven的安装和执行
后端
C++小厨神33 分钟前
Go语言的数据库交互
开发语言·后端·golang
雪球不会消失了39 分钟前
06-RabbitMQ基础
java·网络·spring cloud·mq
@泽栖1 小时前
项目引入MybatisPlus
java·后端·mybatis
夜半无声1 小时前
spring boot 多数据源集成mysql、postgresql、phoenix、doris等
java·spring boot·后端