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