2

我们正在使用支持我们的 java http 客户端的 http 代理服务器,它每秒执行数百个 SSL 请求。客户端是netty提供的AsyncHttpClient,使用NIO(com.ning:async-http-client:1.7.19)。代理服务器使用 Squid 3.3。

当我们将客户端配置为“allowSslConnectionPool”时,我们经常在 NettyAsyncHttpProvider 中看到 java.nio.channels.ClosedChannelException(我们尝试了 Grizzly,它也出现了类似的问题)。当我们禁用 ssl 连接池时,一切正常。相反,在启用池并且没有代理服务器的情况下,事情又可以正常工作了。显然,没有连接池的问题是我们为每个请求创建新的 SSL 连接会严重影响我们的服务器。

在客户端本地池化 SSL 连接并使用 HTTPS 代理是否存在一些基本问题?似乎应该有一些设置来使它能够工作,无论是在 Squid 上还是在客户端本身,但我们现在不知所措。

客户端配置

新的 AsyncHttpClientConfig.Builder().setMaximumConnectionsTotal(maxconns.get())
    .setMaximumConnectionsPerHost(consPerHost.get())
    .setUserAgent(userAgent.get())
    .setConnectionTimeoutInMs(MAX_CONN_TIME_MS)
    .setRequestTimeoutInMs(MAX_RESP_TIME_MS)
    .setFollowRedirects(true)
    .setAllowSslConnectionPool(true)
    .setProxyServer(new ProxyServer(ProxyServer.Protocol.HTTPS, "xxx", 3128, "yyy", "zzz")
    )

我们得到的例外是

2013-08-02 09:33:33,342 调试(新 I/O 工作者 #16)com.ning.http.client.providers.netty.NettyAsyncHttpProvider:通道上的意外 I/O 异常 [id:0xd9cce308,xxx => yyy ]
2013-08-02 09:33:33,343 调试(新 I/O 工作人员 #16)com.ning.http.client.providers.netty.NettyAsyncHttpProvider:
java.nio.channels.ClosedChannelException
    在 org.jboss.netty.handler.ssl.SslHandler$6.run(SslHandler.java:1580)
    在 org.jboss.netty.channel.socket.ChannelRunnableWrapper.run(ChannelRunnableWrapper.java:40)
    在 org.jboss.netty.channel.socket.nio.AbstractNioWorker.executeInIoThread(AbstractNioWorker.java:71)
    在 org.jboss.netty.channel.socket.nio.NioWorker.executeInIoThread(NioWorker.java:36)
    在 org.jboss.netty.channel.socket.nio.AbstractNioWorker.executeInIoThread(AbstractNioWorker.java:57)
    在 org.jboss.netty.channel.socket.nio.NioWorker.executeInIoThread(NioWorker.java:36)

相关 Squid 配置(我们尝试过使用和不使用 ssl-bump)

http_port 3128 ssl-bump 证书=/etc/squid3/server.crt key=/etc/squid3/server.key
always_direct 允许所有
ssl_bump 允许所有
4

0 回答 0