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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Nginx是一款高性能的Web服务器和反向代理服务器,它可以处理大量的并发连接,同时还具有低内存占用和高稳定性等优点。在Linux系统中,安装和配置Nginx非常简单,下面是详细的步骤: 1. 安装Nginx 在Ubuntu系统中,可以使用以下命令安装Nginx: sudo apt-get update sudo apt-get install nginx 在CentOS系统中,可以使用以下命令安装Nginx: sudo yum install epel-release sudo yum install nginx 2. 配置Nginx Nginx的配置文件位于/etc/nginx/nginx.conf,可以使用以下命令打开该文件: sudo nano /etc/nginx/nginx.conf 在该文件中,可以配置Nginx的监听端口、虚拟主机、反向代理等功能。例如,以下是一个简单的Nginx配置文件: user nginx; worker_processes auto; error_log /var/log/nginx/error.log; pid /run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; } 在该配置文件中,可以看到Nginx的一些基本配置,例如日志文件路径、连接超时时间、文件传输方式等。同时,还可以看到Nginx的配置文件可以包含其他的配置文件,例如/etc/nginx/conf.d/*.conf和/etc/nginx/sites-enabled/*,这些文件可以用于配置虚拟主机和反向代理等功能。 3. 启动Nginx 在完成Nginx的配置后,可以使用以下命令启动Nginx: sudo systemctl start nginx 如果需要在系统启动时自动启动Nginx,可以使用以下命令: sudo systemctl enable nginx 4. 验证NginxNginx启动后,可以使用以下命令验证Nginx是否正常工作: sudo systemctl status nginx 如果Nginx正常工作,可以在浏览器中输入服务器的IP地址或域名,查看Nginx的欢迎页面。 总之,安装和配置Nginx非常简单,只需要按照上述步骤进行操作即可。如果需要更加详细的配置,可以参考Nginx的官方文档。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值