Javascript xmlHttpRequest不关闭连接

Javascript xmlHttpRequest不关闭连接,javascript,ajax,linux,Javascript,Ajax,Linux,我发出一个AJAX请求,根据回答刷新当前页面,代码如下: var xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function() { if (xhttp.readyState == 4 && xhttp.status == 200) { var res = xhttp.responseText; if (res.length > 0) { window.location = res;

我发出一个AJAX请求,根据回答刷新当前页面,代码如下:

var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (xhttp.readyState == 4 && xhttp.status == 200) {
  var res = xhttp.responseText;
  if (res.length > 0) {
      window.location = res;
  }
}
}
xhttp.open("POST", "getlink.php", true);
xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhttp.send('id='+id);
但是我注意到服务器上的连接没有关闭。运行此命令时:

netstat -anl | grep 80 | awk '/^tcp/ {t[$NF]++}END{for(state in t){print state, t[state]} }'
我看到很多处于时间等待状态的连接:

LAST_ACK 4
LISTEN 2
SYN_RECV 2
ESTABLISHED 1421
FIN_WAIT1 9
FIN_WAIT2 17
TIME_WAIT 2250

xmlHttpRequest似乎没有关闭连接,这在服务器上造成了很多问题

这不是bug,而是特性

它被称为HTTP协议的一个特性,适用于所有HTTP连接,而不仅仅是XMLHttpRequest创建的连接

因此,基本上,打开TCP连接是一件复杂的事情,因为建立连接和分配系统资源需要进行代价高昂的三方握手。然而,大多数网页一次加载许多资源。它是对每个图像的一个请求,对每个CSS文件的一个请求,依此类推。为了加快加载并减少服务器负载,HTTP允许与服务器的连接保持打开状态,并在后续请求中重复使用


使用来自服务器的标头来控制该行为,这些标头指定客户端最多应打开多少个连接,以及在空闲时间达到多少秒后应关闭连接。如果您发现服务器上存在连接太多的问题,您应该调整这些标题,这些标题通常可以在web服务器配置文件中配置。

这不是错误,而是功能

它被称为HTTP协议的一个特性,适用于所有HTTP连接,而不仅仅是XMLHttpRequest创建的连接

因此,基本上,打开TCP连接是一件复杂的事情,因为建立连接和分配系统资源需要进行代价高昂的三方握手。然而,大多数网页一次加载许多资源。它是对每个图像的一个请求,对每个CSS文件的一个请求,依此类推。为了加快加载并减少服务器负载,HTTP允许与服务器的连接保持打开状态,并在后续请求中重复使用


使用来自服务器的标头来控制该行为,这些标头指定客户端最多应打开多少个连接,以及在空闲时间达到多少秒后应关闭连接。如果您发现服务器上存在连接太多的问题,您应该调整这些标题,这些标题通常可以在web服务器配置文件中配置。

Excellent!非常感谢。你知道我应该在nginx/php5fpm配置上修改什么设置吗?请参阅keepalive_disable、keepalive_请求和keepalive_timeout指令:但是也请注意,如果要处理大量并发连接,nginx是最有能力的服务器之一,因此,请检查这是否真的是您的问题……我通过调整一些sysctl设置,成功地减少了超时连接的数量。我的服务器有一些非常糟糕的默认值:net.ipv4.tcp_max_tw_bucket仅为8192,net.ipv4.tcp_tw_重用为0(未重用tcp套接字)。更改后,服务器连接得到了改善!谢谢你给我指明了正确的方向!好极了!非常感谢。你知道我应该在nginx/php5fpm配置上修改什么设置吗?请参阅keepalive_disable、keepalive_请求和keepalive_timeout指令:但是也请注意,如果要处理大量并发连接,nginx是最有能力的服务器之一,因此,请检查这是否真的是您的问题……我通过调整一些sysctl设置,成功地减少了超时连接的数量。我的服务器有一些非常糟糕的默认值:net.ipv4.tcp_max_tw_bucket仅为8192,net.ipv4.tcp_tw_重用为0(未重用tcp套接字)。更改后,服务器连接得到了改善!谢谢你给我指明了正确的方向!