我们正在使用支持我们的 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 允许所有