我们使用支持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或客户端本身工作,但我们现在处于亏损状态。
客户端配置:
new 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 DEBUG (New I/O worker #16 ) com.ning.http.client.providers.netty.NettyAsyncHttpProvider: Unexpected I/O exception on channel [id: 0xd9cce308, xxx => yyy] 2013-08-02 09:33:33,343 DEBUG (New I/O worker #16 ) com.ning.http.client.providers.netty.NettyAsyncHttpProvider: java.nio.channels.ClosedChannelException at org.jboss.netty.handler.ssl.SslHandler$6.run(SslHandler.java:1580) at org.jboss.netty.channel.socket.ChannelRunnableWrapper.run(ChannelRunnableWrapper.java:40) at org.jboss.netty.channel.socket.nio.AbstractNioWorker.executeInIoThread(AbstractNioWorker.java:71) at org.jboss.netty.channel.socket.nio.NioWorker.executeInIoThread(NioWorker.java:36) at org.jboss.netty.channel.socket.nio.AbstractNioWorker.executeInIoThread(AbstractNioWorker.java:57) at org.jboss.netty.channel.socket.nio.NioWorker.executeInIoThread(NioWorker.java:36)
相关的Squid配置(我们尝试过使用和不使用ssl-bump):
http_port 3128 ssl-bump cert=/etc/squid3/server.crt key=/etc/squid3/server.key always_direct allow all ssl_bump allow all