linux so keepalive,Linux下nginx so_keepalive 参数详解

其实这个keepalive是tcp一种探活机制,可不是http1.1当中的keeplive。

测试环境centos6.8   64位系统。

输入命令,查看linux系统内核的默认参数设置。

[root@nd1 bin]# sysctl -a|grep tcp_keepalive

net.ipv4.tcp_keepalive_time = 7200

net.ipv4.tcp_keepalive_probes = 9

net.ipv4.tcp_keepalive_intvl = 75

当客户端与服务器端三次握手正式建立tcp以后,默认情况下,除非客户端或服务器端关闭上层socket,否则tcp会始终保持连接,如果这个时候网络断掉,这个链接就会变成一个死链接,会占用服务器资源。

那如何解决这种问题呢?

1、大多数的上游应用会通过心跳机制来检测对方是否存活,不存会则由上游应用程序关闭socket释放链接。

2、通过tcp带的keeplive机制来检测,已Java为例,在socket编程中需要显示开启tcp的keeplive 。

socket.setKeepAlive(true);

参数解释:

tcp_keepalive_time   7200 秒  (2小时),当tcp建立链接后2小时如果无数据传输,则会发出探活数据包。

tcp_keepalive_probes  9  (次), 一共发送9次。

tcp_keepalive_intvl  75 秒,一共发送9次,每次间隔75秒。

如果对方没有回复包,则认为对方已掉线,系统会关闭tcp链接。

Java测试:

server端代码,一个简单的socket server,啥也不干,拿到socket就一直等着客户端发送数据。

ServerSocket serverSocket = new ServerSocket(9999);

while (true) {

final Socket socket = serverSocket.accept();

socket.setKeepAlive(true);

System.out.println("a client connect");

final InputStream in = socket.getInputStream();

while (in.read() != -1) {

System.out.println("read");

}

}

client端代码,与服务器端建立连接后,把线程挂起,不发数据,观察tcp keeplive探活请客。

Socket socket = new Socket("192.168.80.110", 9999);

System.out.println(socket.getKeepAlive());

socket.setKeepAlive(true);

OutputStream out = socket.getOutputStream();

Thread.sleep(2000000);

为了测试出效果,我们需要修改linxu内核参数

编辑 vim /etc/sysctl.conf

添加 net.ipv4.tcp_keepalive_time = 30

生效 sysctl -p

6f7332ff7f85072e52bf7a2858b13c57.png

可以看到,tcp已经发送探活数据包,如果对方没有回应则认为对方掉线,系统会关闭tcp连接。

下面配置nginx的 so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt] 配置

so_keepalive=on 表示开启tcp探活,并且使用系统内核的参数。

so_keepalive=30m::10 表示开启tcp探活,30分钟后伍数据会发送探活包,时间间隔使用系统默认的,发送10次探活包。

will set the idle timeout (TCP_KEEPIDLE) to 30 minutes, leave the probe interval (TCP_KEEPINTVL) at its system default, and set the probes count (TCP_KEEPCNT) to 10 probes.

server {

listen 80 so_keepalive=on;

server_name localhost;

#charset koi8-r;

#access_log logs/host.access.log main;

#access_log "pipe:rollback logs/host.access_log interval=1d baknum=7 maxsize=2G" main;

location / {

proxy_pass http://favtomcat;

proxy_http_version 1.1;

proxy_set_header Connection "";

#root html;

#index index.html index.htm;

}

xxx

xxx

...

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值