我在私有子网上有一个带有Spring应用程序的Amazon 2应用服务器。在公共子网的应用服务器前面有一个Nat网关。应用程序发送带有连接的请求:将保持活动的头发送到远程主机,远程主机用相同的头发送一个响应。所以我可以通过netstat看到一个已建立的连接。
netstat -t | grep <remote server ip>
tcp6 0 0 ip-172-30-4-31.eu:57324 <remote server ip>:http ESTABLISHED
由于35秒内没有通信量,Nat网关根据本文档关闭了连接:https://docs.aws.amazon.com/vpc/latest/userguide/nat-gateway-troubleshooting.html#nat-gateway-troubleshooting-timeout,但应用程序服务器上的连接仍然处于已建立状态,因此对远程服务器的下一个请求提供给我:
java.net.SocketException: Connection reset
我尝试在sysctl.conf中的应用服务器上进行更改,几乎同时关闭与Nat网关的连接:
net.ipv4.tcp_keepalive_time=351
net.ipv4.tcp_keepalive_intvl=30
net.ipv4.tcp_keepalive_probes=2
但是什么都没有发生,并且通过tcpdump从应用服务器转储到远程服务器的流量不会使我保持存活的数据包。那么,除了删除应用程序中的连接头之外,我还能做些什么来避免这个问题呢?
发布于 2020-09-02 16:05:05
问题是因为使用了打开套接字的方法。我使用了:
Request.Post(mainProperties.getPartnerURL())
.addHeader("Signature", SecurityHelper.getSignature(requestBody.getBytes("UTF-8"),
mainProperties.getPartnerKey()))
.addHeader("Content-Type", "application/x-www-form-urlencoded")
.connectTimeout(mainProperties.getRequestTimeoutMillis())
.bodyByteArray(requestBody.getBytes(UTF_8))
.execute().returnContent().asString();
但我已经将so_keepalive param设置为套接字。可以使用HttpClient来完成:
SocketConfig socketConfig = SocketConfig.custom()
.setSoKeepAlive(true)
.build();
RequestConfig requestConfig = RequestConfig.custom()
.setConnectTimeout(mainProperties.getRequestTimeoutMillis())
.build();
CloseableHttpClient httpClient = HttpClientBuilder.create()
.setDefaultSocketConfig(socketConfig)
.setDefaultRequestConfig(requestConfig)
.build();
HttpPost post = new HttpPost(mainProperties.getPartnerURL());
post.addHeader("Signature", SecurityHelper.getSignature(requestBody.getBytes("UTF-8"),
mainProperties.getPartnerKey()));
post.addHeader("Content-Type", "text/xml");
post.setEntity(new StringEntity(requestBody, UTF_8));
CloseableHttpResponse response = httpClient.execute(post);
return EntityUtils.toString(response.getEntity(), UTF_8);
然后将my sysctl.conf (应用更改所需的sysctl -p )中的sysctl.conf set应用到一个新连接中,可以这样检查它:
netstat -o | grep <remote-host>
tcp6 0 0 ip-172-30-4-233.e:50414 <remote-host>:http ESTABLISHED **keepalive (152.12/0/0)**
因此,TCP-保持活跃的数据包发送350秒后,从最后一个数据包,没有响应关闭建立的连接。所有tcp保持活动的数据包都可以通过tcp转储看到:
https://stackoverflow.com/questions/63696142
复制相似问题